several questions...
Tiago Jorge
tjpj at lasige.di.fc.ul.pt
Mon Mar 21 14:11:29 CET 2005
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
More information about the l4-hackers
mailing list