Support using ip in udhcpc scripts.
authorGlenn L McGrath <bug1@ihug.co.nz>
Sun, 8 Dec 2002 22:17:54 +0000 (22:17 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Sun, 8 Dec 2002 22:17:54 +0000 (22:17 -0000)
Slightly modified version of patch by Bastian Blank

networking/udhcp/Config.in
networking/udhcp/options.c
networking/udhcp/options.h
networking/udhcp/script.c

index 5baaa6a..674470a 100644 (file)
@@ -38,5 +38,14 @@ config CONFIG_FEATURE_UDHCP_DEBUG
        help
          Please submit a patch to add help text for this item.
 
+config CONFIG_FEATURE_UDHCPC_IP
+       bool "  Compile udhcpc with ip support"
+       default n
+       depends on CONFIG_UDHCPC
+       help
+         Say yes if you are using the ip command instead of route and ifconfig
+         in your scripts to bring up the interface.
+         This is needed as ip wants the subnet as a bitprefix not an ip value.
+
 endmenu
 
index 5814472..3f3a389 100644 (file)
 #include "options.h"
 #include "leases.h"
 
+#include "config.h"
 
 /* supported options are easily added here */
 struct dhcp_option options[] = {
        /* name[10]     flags                                   code */
-       {"subnet",      OPTION_IP | OPTION_REQ,                 0x01},
+#ifdef CONFIG_FEATURE_UDHCPC_IP
+       {"subnet",      OPTION_IP | OPTION_REQ | OPTION_PREFIX, 0x01},
+#else
+       {"subnet",      OPTION_IP | OPTION_REQ,                 0x01},
+#endif
        {"timezone",    OPTION_S32,                             0x02},
        {"router",      OPTION_IP | OPTION_LIST | OPTION_REQ,   0x03},
        {"timesvr",     OPTION_IP | OPTION_LIST,                0x04},
index 1fded2e..dccaa2a 100644 (file)
@@ -4,6 +4,8 @@
 
 #include "packet.h"
 
+#include "config.h"
+
 #define TYPE_MASK      0x0F
 
 enum {
@@ -20,6 +22,7 @@ enum {
 
 #define OPTION_REQ     0x10 /* have the client request this option */
 #define OPTION_LIST    0x20 /* There can be a list of 1 or more of these */
+#define OPTION_PREFIX  0x40 /* ip wants a prefix instead of a ip for subnet */
 
 struct dhcp_option {
        char name[10];
index 4ce23aa..1c6f1bd 100644 (file)
@@ -37,6 +37,8 @@
 #include "options.h"
 #include "debug.h"
 
+#include "config.h"
+
 /* get a rough idea of how long an option will be (rounding up...) */
 static int max_option_length[] = {
        [OPTION_IP] =           sizeof("255.255.255.255 "),
@@ -62,6 +64,37 @@ static int sprintip(char *dest, char *pre, unsigned char *ip) {
        return sprintf(dest, "%s%d.%d.%d.%d ", pre, ip[0], ip[1], ip[2], ip[3]);
 }
 
+#ifdef CONFIG_FEATURE_UDHCPC_IP
+/* convert a netmask (255.255.255.0) into the length (24) */
+static int inet_ntom (const char *src, short *dst)
+{
+       in_addr_t mask, num;
+
+       mask = ntohl(*(unsigned int *)src);
+
+       for (num = mask; num & 1; num >>= 1);
+
+       if (num != 0 && mask != 0)
+       {
+               for (num = ~mask; num & 1; num >>= 1);
+               if (num)
+                       return 0;
+       }
+
+       for (num = 0; mask; mask <<= 1)
+               num++;
+
+       *dst = num;
+
+       return 1;
+}
+
+static int sprintprefix(char *dest, char *pre, unsigned char *ip) {
+       short sdest = 0;
+       inet_ntom(ip, &sdest);
+       return sprintf(dest, "%s%hd ", pre, sdest);
+}
+#endif
 
 /* Fill dest with the text of option 'option'. */
 static void fill_options(char *dest, unsigned char *option, struct dhcp_option *type_p)
@@ -84,9 +117,20 @@ static void fill_options(char *dest, unsigned char *option, struct dhcp_option *
                        *(dest++) = '/';
                        option += 4;
                        optlen = 4;
+#ifndef CONFIG_FEATURE_UDHCPC_IP
                case OPTION_IP: /* Works regardless of host byte order. */
+#endif
                        dest += sprintip(dest, "", option);
                        break;
+#ifdef CONFIG_FEATURE_UDHCPC_IP
+               case OPTION_IP: /* Works regardless of host byte order. */
+                       if (type_p->flags & OPTION_PREFIX) {
+                               dest += sprintprefix(dest, "", option);
+                       } else {
+                               dest += sprintip(dest, "", option);
+                       }
+                       break;
+#endif
                case OPTION_BOOLEAN:
                        dest += sprintf(dest, *option ? "yes " : "no ");
                        break;