Martin Pohlack wrote:
Tiago Jorge wrote:
Maybe it is not transported correctly by l4vfs, please check l4/pkg/l4vfs/lib/libc_backends/io/ioctl.c.
yep... thats true... it wasn't there. So i added and worked.
just add in the switch statement that handles the the ifreq calls the following lines:
case SIOCSIFBRDADDR: case SIOCGIFBRDADDR:
and add in mini_ifconfig:
if (!inet_aton("YOUR_BROADCAST_ADDR", &sa.sin_addr)) ERR_EXIT("no valid IP broadcast %s", "YOUR_BROADCAST_ADDR"); sa.sin_family = AF_INET; memcpy(&ifr.ifr_broadaddr, &sa, sizeof(struct sockaddr));
if ((err=ioctl(s, SIOCSIFBRDADDR, &ifr)) < 0) ERR_EXIT("ioctl(SIOCSIFBRDADDR) returns %d", err);
Could you please send patches with some context (diff -u) so we are able to identify the locations you want the code to be inserted to.
Greets, Martin
file l4/pkg/l4vfs/lib/libc_backends/io/ioctl.c
--- oldioctl.c 2005-03-21 12:58:04.907581968 +0000 +++ ioctl.c 2005-03-21 12:58:02.712915608 +0000 @@ -84,7 +84,9 @@ case SIOCGIFADDR: case SIOCSIFNETMASK: case SIOCGIFNETMASK: - count = sizeof (struct ifreq); + case SIOCSIFBRDADDR: + case SIOCGIFBRDADDR: + count = sizeof (struct ifreq); break; case SIOCGIFCONF: count = sizeof(struct ifconf);
file l4/pkg/flips/examples/mini_ifconfig/include/ifconfig.h
--- ifconfig.h 2005-03-21 13:02:18.000106056 +0000 +++ oldifconfig.h 2005-03-21 13:02:02.723428464 +0000 @@ -9,4 +9,4 @@ extern int inet_aton(const char *cp, struct in_addr *addr);
/** UTILITY: CONFIGURE NETWORK INTERFACE */ -extern void ifconfig(const char *ifname, const char *inaddr, const char *inmask, const char *baddr); +extern void ifconfig(const char *ifname, const char *inaddr, const char *inmask);
file l4/pkg/flips/examples/mini_ifconfig/l4/ifconfig.c
--- originalifcfg.c 2005-03-21 13:08:26.701054992 +0000 +++ ifconfig.c 2005-03-21 13:07:49.894650416 +0000 @@ -87,7 +87,7 @@ }
/** UTILITY: CONFIGURE NETWORK INTERFACE */ -void ifconfig(const char *ifname, const char *inaddr, const char *inmask) +void ifconfig(const char *ifname, const char *inaddr, const char *inmask, const char *baddr) { int s, err; struct ifreq ifr; @@ -95,16 +95,19 @@ struct sockaddr_in *sap;
strncpy(ifr.ifr_name, ifname, 16); - + + //open socket interface if ((s=socket(AF_INET, SOCK_DGRAM, 0)) < 0) ERR_EXIT("socket");
+ //get flags if ((err=ioctl(s, SIOCGIFFLAGS, &ifr)) < 0) ERR_EXIT("ioctl(SIOCGIFFLAGS) returns %d", err); + print_flags(&ifr);
/* switch ON */ - ifr.ifr_flags |= (IFF_UP|IFF_RUNNING); + ifr.ifr_flags |= (IFF_UP|IFF_RUNNING/*|IFF_BROADCAST*/); if ((err=ioctl(s, SIOCSIFFLAGS, &ifr)) < 0) ERR_EXIT("ioctl(SIOCSIFFLAGS) returns %d", err); if ((err=ioctl(s, SIOCGIFFLAGS, &ifr)) < 0) @@ -120,11 +123,13 @@ print_flags(&ifr);
/* switch ON */ - ifr.ifr_flags |= (IFF_UP|IFF_RUNNING); + ifr.ifr_flags |= (IFF_UP|IFF_RUNNING/*|IFF_BROADCAST*/); if ((err=ioctl(s, SIOCSIFFLAGS, &ifr)) < 0) ERR_EXIT("ioctl(SIOCSIFFLAGS) returns %d", err); + if ((err=ioctl(s, SIOCGIFFLAGS, &ifr)) < 0) ERR_EXIT("ioctl(SIOCGIFFLAGS) returns %d", err); + print_flags(&ifr);
/* set IFADDR */ @@ -137,11 +142,22 @@ ERR_EXIT("ioctl(SIOCSIFADDR) returns %d", err); memset(&ifr.ifr_addr, 0, sizeof(struct sockaddr)); ifr.ifr_addr.sa_family = AF_INET; + if ((err=ioctl(s, SIOCGIFADDR, &ifr)) < 0) ERR_EXIT("ioctl(SIOCGIFADDR) returns %d", err); sap = (struct sockaddr_in *)&ifr.ifr_addr; LOG("%s: inet %s\n", ifr.ifr_name, inet_ntoa(sap->sin_addr));
+ /* set BROADADDR */ + if (!inet_aton(baddr, &sa.sin_addr)) + ERR_EXIT("no valid IP broadcast %s", baddr); + sa.sin_family = AF_INET; + memcpy(&ifr.ifr_broadaddr, &sa, sizeof(struct sockaddr)); + + if ((err=ioctl(s, SIOCSIFBRDADDR, &ifr)) < 0) + ERR_EXIT("ioctl(SIOCSIFBRDADDR) returns %d", err); + + /* set IFNETMASK */ if (!inet_aton(inmask, &sa.sin_addr)) ERR_EXIT("no valid IP network mask %s", inmask); @@ -152,11 +168,15 @@ ERR_EXIT("ioctl(SIOCSIFNETMASK) returns %d", err); memset(&ifr.ifr_addr, 0, sizeof(struct sockaddr)); ifr.ifr_addr.sa_family = AF_INET; + if ((err=ioctl(s, SIOCGIFNETMASK, &ifr)) < 0) ERR_EXIT("ioctl(SIOCGIFNETMASK) returns %d", err); sap = (struct sockaddr_in *)&ifr.ifr_addr; + print_flags(&ifr); LOG("%s: netmask %s", ifr.ifr_name, inet_ntoa(sap->sin_addr)); - + close(s); + } +
file l4/pkg/flips/examples/mini_ifconfig/l4/main.c
--- oldmain.c 2005-03-21 13:02:49.890258016 +0000 +++ main.c 2005-03-21 13:04:00.704492616 +0000 @@ -25,13 +25,13 @@
LOG("ifconfig"); if (argc < 4) { - LOG("usage:\n ifconfig <ifname> <inaddr> <inmask>"); - LOG("setting default value: lo 127.0.0.1 255.0.0.0"); - ifconfig("lo", "127.0.0.1", "255.0.0.0"); + LOG("usage:\n ifconfig <ifname> <inaddr> <inmask> <baddr>"); + LOG("setting default value: lo 127.0.0.1 255.0.0.0 127.255.255.255"); + ifconfig("lo", "127.0.0.1", "255.0.0.0", "127.255.255.255"); } else { - ifconfig(argv[1], argv[2], argv[3]); + ifconfig(argv[1], argv[2], argv[3], argv[4]); }
/* register at names just that other programs can sync their startup */
it's here... according to the other issue i wait for an answer please :)
thanks
Tiago
Hello,
as the posted patches are not critical for FLIPS and only in the example mini_ifconfig I won't apply them soon. I personally dislike ioctl() and because with NETLINK sockets there's a much better interface for networking configuration I'm suffering from lack of motivation ;-)
Cheers
l4-hackers@os.inf.tu-dresden.de