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