2 * Program to test new [sg]etsockopts and ioctls for manipulating IP and
3 * Ethernet multicast address filters.
5 * Written by Steve Deering, Stanford University, February 1989.
7 * $FreeBSD: src/usr.sbin/mtest/mtest.c,v 1.4.6.1 2001/07/19 05:09:25 kris Exp $
13 #include <sys/types.h>
14 #include <sys/socket.h>
17 #include <net/if_dl.h>
18 #include <sys/ioctl.h>
19 #include <netinet/in.h>
30 unsigned i1
, i2
, i3
, i4
, g1
, g2
, g3
, g4
;
31 unsigned e1
, e2
, e3
, e4
, e5
, e6
;
33 if( (so
= socket( AF_INET
, SOCK_DGRAM
, 0 )) == -1)
34 err( 1, "can't open socket" );
36 printf( "multicast membership test program; " );
37 printf( "enter ? for list of commands\n" );
39 while( fgets( line
, 79, stdin
) != NULL
)
42 while( *lineptr
== ' ' || *lineptr
== '\t' ) ++lineptr
;
47 printf( "%s%s%s%s%s%s%s",
48 " j g.g.g.g i.i.i.i - join IP multicast group \n",
49 " l g.g.g.g i.i.i.i - leave IP multicast group \n",
50 " a ifname e.e.e.e.e.e - add ether multicast address \n",
51 " d ifname e.e.e.e.e.e - del ether multicast address \n",
52 " m ifname 1/0 - set/clear ether allmulti flag \n",
53 " p ifname 1/0 - set/clear ether promisc flag \n",
61 while( *lineptr
== ' ' || *lineptr
== '\t' ) ++lineptr
;
62 if( (n
= sscanf( lineptr
, "%u.%u.%u.%u %u.%u.%u.%u",
63 &g1
, &g2
, &g3
, &g4
, &i1
, &i2
, &i3
, &i4
)) != 8 )
65 printf( "bad args\n" );
68 imr
.imr_multiaddr
.s_addr
= (g1
<<24) | (g2
<<16) | (g3
<<8) | g4
;
69 imr
.imr_multiaddr
.s_addr
= htonl(imr
.imr_multiaddr
.s_addr
);
70 imr
.imr_interface
.s_addr
= (i1
<<24) | (i2
<<16) | (i3
<<8) | i4
;
71 imr
.imr_interface
.s_addr
= htonl(imr
.imr_interface
.s_addr
);
72 if( setsockopt( so
, IPPROTO_IP
, IP_ADD_MEMBERSHIP
,
73 &imr
, sizeof(struct ip_mreq
) ) == -1 )
74 warn( "can't join group" );
75 else printf( "group joined\n" );
82 while( *lineptr
== ' ' || *lineptr
== '\t' ) ++lineptr
;
83 if( (n
= sscanf( lineptr
, "%u.%u.%u.%u %u.%u.%u.%u",
84 &g1
, &g2
, &g3
, &g4
, &i1
, &i2
, &i3
, &i4
)) != 8 )
86 printf( "bad args\n" );
89 imr
.imr_multiaddr
.s_addr
= (g1
<<24) | (g2
<<16) | (g3
<<8) | g4
;
90 imr
.imr_multiaddr
.s_addr
= htonl(imr
.imr_multiaddr
.s_addr
);
91 imr
.imr_interface
.s_addr
= (i1
<<24) | (i2
<<16) | (i3
<<8) | i4
;
92 imr
.imr_interface
.s_addr
= htonl(imr
.imr_interface
.s_addr
);
93 if( setsockopt( so
, IPPROTO_IP
, IP_DROP_MEMBERSHIP
,
94 &imr
, sizeof(struct ip_mreq
) ) == -1 )
95 warn( "can't leave group" );
96 else printf( "group left\n" );
102 struct sockaddr_dl
*dlp
;
105 while( *lineptr
== ' ' || *lineptr
== '\t' ) ++lineptr
;
106 if( (n
= sscanf( lineptr
, "%s %x.%x.%x.%x.%x.%x",
107 ifr
.ifr_name
, &e1
, &e2
, &e3
, &e4
, &e5
, &e6
)) != 7 )
109 printf( "bad args\n" );
112 dlp
= (struct sockaddr_dl
*)&ifr
.ifr_addr
;
113 dlp
->sdl_len
= sizeof(struct sockaddr_dl
);
114 dlp
->sdl_family
= AF_LINK
;
126 if( ioctl( so
, SIOCADDMULTI
, &ifr
) == -1 )
127 warn( "can't add ether address" );
128 else printf( "ether address added\n" );
134 struct sockaddr_dl
*dlp
;
137 while( *lineptr
== ' ' || *lineptr
== '\t' ) ++lineptr
;
138 if( (n
= sscanf( lineptr
, "%s %x.%x.%x.%x.%x.%x",
139 ifr
.ifr_name
, &e1
, &e2
, &e3
, &e4
, &e5
, &e6
)) != 7 )
141 printf( "bad args\n" );
144 dlp
= (struct sockaddr_dl
*)&ifr
.ifr_addr
;
145 dlp
->sdl_len
= sizeof(struct sockaddr_dl
);
146 dlp
->sdl_family
= AF_LINK
;
158 if( ioctl( so
, SIOCDELMULTI
, &ifr
) == -1 )
159 warn( "can't delete ether address" );
160 else printf( "ether address deleted\n" );
167 while( *lineptr
== ' ' || *lineptr
== '\t' ) ++lineptr
;
168 if( (n
= sscanf( lineptr
, "%s %u", ifr
.ifr_name
, &f
)) != 2 )
170 printf( "bad args\n" );
173 if( ioctl( so
, SIOCGIFFLAGS
, &ifr
) == -1 )
175 warn( "can't get interface flags" );
178 printf( "interface flags %x, ", ifr
.ifr_flags
);
180 if( f
) ifr
.ifr_flags
|= IFF_ALLMULTI
;
181 else ifr
.ifr_flags
&= ~IFF_ALLMULTI
;
182 if( ioctl( so
, SIOCSIFFLAGS
, &ifr
) == -1 )
184 else printf( "changed to %x\n", ifr
.ifr_flags
);
191 while( *lineptr
== ' ' || *lineptr
== '\t' ) ++lineptr
;
192 if( (n
= sscanf( lineptr
, "%s %u", ifr
.ifr_name
, &f
)) != 2 )
194 printf( "bad args\n" );
197 if( ioctl( so
, SIOCGIFFLAGS
, &ifr
) == -1 )
199 warn( "can't get interface flags" );
202 printf( "interface flags %x, ", ifr
.ifr_flags
);
204 if( f
) ifr
.ifr_flags
|= IFF_PROMISC
;
205 else ifr
.ifr_flags
&= ~IFF_PROMISC
;
206 if( ioctl( so
, SIOCSIFFLAGS
, &ifr
) == -1 )
208 else printf( "changed to %x\n", ifr
.ifr_flags
);
219 printf( "bad command\n" );