linux/net/ipv4/ipconfig.c
<<
>>
Prefs
   1/*
   2 *  Automatic Configuration of IP -- use DHCP, BOOTP, RARP, or
   3 *  user-supplied information to configure own IP address and routes.
   4 *
   5 *  Copyright (C) 1996-1998 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
   6 *
   7 *  Derived from network configuration code in fs/nfs/nfsroot.c,
   8 *  originally Copyright (C) 1995, 1996 Gero Kuhlmann and me.
   9 *
  10 *  BOOTP rewritten to construct and analyse packets itself instead
  11 *  of misusing the IP layer. num_bugs_causing_wrong_arp_replies--;
  12 *                                           -- MJ, December 1998
  13 *
  14 *  Fixed ip_auto_config_setup calling at startup in the new "Linker Magic"
  15 *  initialization scheme.
  16 *      - Arnaldo Carvalho de Melo <acme@conectiva.com.br>, 08/11/1999
  17 *
  18 *  DHCP support added.  To users this looks like a whole separate
  19 *  protocol, but we know it's just a bag on the side of BOOTP.
  20 *              -- Chip Salzenberg <chip@valinux.com>, May 2000
  21 *
  22 *  Ported DHCP support from 2.2.16 to 2.4.0-test4
  23 *              -- Eric Biederman <ebiederman@lnxi.com>, 30 Aug 2000
  24 *
  25 *  Merged changes from 2.2.19 into 2.4.3
  26 *              -- Eric Biederman <ebiederman@lnxi.com>, 22 April Aug 2001
  27 *
  28 *  Multiple Nameservers in /proc/net/pnp
  29 *              --  Josef Siemes <jsiemes@web.de>, Aug 2002
  30 */
  31
  32#include <linux/types.h>
  33#include <linux/string.h>
  34#include <linux/kernel.h>
  35#include <linux/jiffies.h>
  36#include <linux/random.h>
  37#include <linux/init.h>
  38#include <linux/utsname.h>
  39#include <linux/in.h>
  40#include <linux/if.h>
  41#include <linux/inet.h>
  42#include <linux/inetdevice.h>
  43#include <linux/netdevice.h>
  44#include <linux/if_arp.h>
  45#include <linux/skbuff.h>
  46#include <linux/ip.h>
  47#include <linux/socket.h>
  48#include <linux/route.h>
  49#include <linux/udp.h>
  50#include <linux/proc_fs.h>
  51#include <linux/seq_file.h>
  52#include <linux/major.h>
  53#include <linux/root_dev.h>
  54#include <linux/delay.h>
  55#include <linux/nfs_fs.h>
  56#include <linux/slab.h>
  57#include <linux/export.h>
  58#include <net/net_namespace.h>
  59#include <net/arp.h>
  60#include <net/ip.h>
  61#include <net/ipconfig.h>
  62#include <net/route.h>
  63
  64#include <asm/uaccess.h>
  65#include <net/checksum.h>
  66#include <asm/processor.h>
  67
  68/* Define this to allow debugging output */
  69#undef IPCONFIG_DEBUG
  70
  71#ifdef IPCONFIG_DEBUG
  72#define DBG(x) printk x
  73#else
  74#define DBG(x) do { } while(0)
  75#endif
  76
  77#if defined(CONFIG_IP_PNP_DHCP)
  78#define IPCONFIG_DHCP
  79#endif
  80#if defined(CONFIG_IP_PNP_BOOTP) || defined(CONFIG_IP_PNP_DHCP)
  81#define IPCONFIG_BOOTP
  82#endif
  83#if defined(CONFIG_IP_PNP_RARP)
  84#define IPCONFIG_RARP
  85#endif
  86#if defined(IPCONFIG_BOOTP) || defined(IPCONFIG_RARP)
  87#define IPCONFIG_DYNAMIC
  88#endif
  89
  90/* Define the friendly delay before and after opening net devices */
  91#define CONF_POST_OPEN          10      /* After opening: 10 msecs */
  92#define CONF_CARRIER_TIMEOUT    120000  /* Wait for carrier timeout */
  93
  94/* Define the timeout for waiting for a DHCP/BOOTP/RARP reply */
  95#define CONF_OPEN_RETRIES       2       /* (Re)open devices twice */
  96#define CONF_SEND_RETRIES       6       /* Send six requests per open */
  97#define CONF_INTER_TIMEOUT      (HZ/2)  /* Inter-device timeout: 1/2 second */
  98#define CONF_BASE_TIMEOUT       (HZ*2)  /* Initial timeout: 2 seconds */
  99#define CONF_TIMEOUT_RANDOM     (HZ)    /* Maximum amount of randomization */
 100#define CONF_TIMEOUT_MULT       *7/4    /* Rate of timeout growth */
 101#define CONF_TIMEOUT_MAX        (HZ*30) /* Maximum allowed timeout */
 102#define CONF_NAMESERVERS_MAX   3       /* Maximum number of nameservers
 103                                           - '3' from resolv.h */
 104
 105#define NONE cpu_to_be32(INADDR_NONE)
 106#define ANY cpu_to_be32(INADDR_ANY)
 107
 108/*
 109 * Public IP configuration
 110 */
 111
 112/* This is used by platforms which might be able to set the ipconfig
 113 * variables using firmware environment vars.  If this is set, it will
 114 * ignore such firmware variables.
 115 */
 116int ic_set_manually __initdata = 0;             /* IPconfig parameters set manually */
 117
 118static int ic_enable __initdata = 0;            /* IP config enabled? */
 119
 120/* Protocol choice */
 121int ic_proto_enabled __initdata = 0
 122#ifdef IPCONFIG_BOOTP
 123                        | IC_BOOTP
 124#endif
 125#ifdef CONFIG_IP_PNP_DHCP
 126                        | IC_USE_DHCP
 127#endif
 128#ifdef IPCONFIG_RARP
 129                        | IC_RARP
 130#endif
 131                        ;
 132
 133static int ic_host_name_set __initdata = 0;     /* Host name set by us? */
 134
 135__be32 ic_myaddr = NONE;                /* My IP address */
 136static __be32 ic_netmask = NONE;        /* Netmask for local subnet */
 137__be32 ic_gateway = NONE;       /* Gateway IP address */
 138
 139__be32 ic_addrservaddr = NONE;  /* IP Address of the IP addresses'server */
 140
 141__be32 ic_servaddr = NONE;      /* Boot server IP address */
 142
 143__be32 root_server_addr = NONE; /* Address of NFS server */
 144u8 root_server_path[256] = { 0, };      /* Path to mount as root */
 145
 146__be32 ic_dev_xid;              /* Device under configuration */
 147
 148/* vendor class identifier */
 149static char vendor_class_identifier[253] __initdata;
 150
 151/* Persistent data: */
 152
 153static int ic_proto_used;                       /* Protocol used, if any */
 154static __be32 ic_nameservers[CONF_NAMESERVERS_MAX]; /* DNS Server IP addresses */
 155static u8 ic_domain[64];                /* DNS (not NIS) domain name */
 156
 157/*
 158 * Private state.
 159 */
 160
 161/* Name of user-selected boot device */
 162static char user_dev_name[IFNAMSIZ] __initdata = { 0, };
 163
 164/* Protocols supported by available interfaces */
 165static int ic_proto_have_if __initdata = 0;
 166
 167/* MTU for boot device */
 168static int ic_dev_mtu __initdata = 0;
 169
 170#ifdef IPCONFIG_DYNAMIC
 171static DEFINE_SPINLOCK(ic_recv_lock);
 172static volatile int ic_got_reply __initdata = 0;    /* Proto(s) that replied */
 173#endif
 174#ifdef IPCONFIG_DHCP
 175static int ic_dhcp_msgtype __initdata = 0;      /* DHCP msg type received */
 176#endif
 177
 178
 179/*
 180 *      Network devices
 181 */
 182
 183struct ic_device {
 184        struct ic_device *next;
 185        struct net_device *dev;
 186        unsigned short flags;
 187        short able;
 188        __be32 xid;
 189};
 190
 191static struct ic_device *ic_first_dev __initdata = NULL;/* List of open device */
 192static struct net_device *ic_dev __initdata = NULL;     /* Selected device */
 193
 194static bool __init ic_is_init_dev(struct net_device *dev)
 195{
 196        if (dev->flags & IFF_LOOPBACK)
 197                return false;
 198        return user_dev_name[0] ? !strcmp(dev->name, user_dev_name) :
 199            (!(dev->flags & IFF_LOOPBACK) &&
 200             (dev->flags & (IFF_POINTOPOINT|IFF_BROADCAST)) &&
 201             strncmp(dev->name, "dummy", 5));
 202}
 203
 204static int __init ic_open_devs(void)
 205{
 206        struct ic_device *d, **last;
 207        struct net_device *dev;
 208        unsigned short oflags;
 209        unsigned long start;
 210
 211        last = &ic_first_dev;
 212        rtnl_lock();
 213
 214        /* bring loopback device up first */
 215        for_each_netdev(&init_net, dev) {
 216                if (!(dev->flags & IFF_LOOPBACK))
 217                        continue;
 218                if (dev_change_flags(dev, dev->flags | IFF_UP) < 0)
 219                        pr_err("IP-Config: Failed to open %s\n", dev->name);
 220        }
 221
 222        for_each_netdev(&init_net, dev) {
 223                if (ic_is_init_dev(dev)) {
 224                        int able = 0;
 225                        if (dev->mtu >= 364)
 226                                able |= IC_BOOTP;
 227                        else
 228                                pr_warn("DHCP/BOOTP: Ignoring device %s, MTU %d too small",
 229                                        dev->name, dev->mtu);
 230                        if (!(dev->flags & IFF_NOARP))
 231                                able |= IC_RARP;
 232                        able &= ic_proto_enabled;
 233                        if (ic_proto_enabled && !able)
 234                                continue;
 235                        oflags = dev->flags;
 236                        if (dev_change_flags(dev, oflags | IFF_UP) < 0) {
 237                                pr_err("IP-Config: Failed to open %s\n",
 238                                       dev->name);
 239                                continue;
 240                        }
 241                        if (!(d = kmalloc(sizeof(struct ic_device), GFP_KERNEL))) {
 242                                rtnl_unlock();
 243                                return -ENOMEM;
 244                        }
 245                        d->dev = dev;
 246                        *last = d;
 247                        last = &d->next;
 248                        d->flags = oflags;
 249                        d->able = able;
 250                        if (able & IC_BOOTP)
 251                                get_random_bytes(&d->xid, sizeof(__be32));
 252                        else
 253                                d->xid = 0;
 254                        ic_proto_have_if |= able;
 255                        DBG(("IP-Config: %s UP (able=%d, xid=%08x)\n",
 256                                dev->name, able, d->xid));
 257                }
 258        }
 259
 260        /* no point in waiting if we could not bring up at least one device */
 261        if (!ic_first_dev)
 262                goto have_carrier;
 263
 264        /* wait for a carrier on at least one device */
 265        start = jiffies;
 266        while (jiffies - start < msecs_to_jiffies(CONF_CARRIER_TIMEOUT)) {
 267                for_each_netdev(&init_net, dev)
 268                        if (ic_is_init_dev(dev) && netif_carrier_ok(dev))
 269                                goto have_carrier;
 270
 271                msleep(1);
 272        }
 273have_carrier:
 274        rtnl_unlock();
 275
 276        *last = NULL;
 277
 278        if (!ic_first_dev) {
 279                if (user_dev_name[0])
 280                        pr_err("IP-Config: Device `%s' not found\n",
 281                               user_dev_name);
 282                else
 283                        pr_err("IP-Config: No network devices available\n");
 284                return -ENODEV;
 285        }
 286        return 0;
 287}
 288
 289static void __init ic_close_devs(void)
 290{
 291        struct ic_device *d, *next;
 292        struct net_device *dev;
 293
 294        rtnl_lock();
 295        next = ic_first_dev;
 296        while ((d = next)) {
 297                next = d->next;
 298                dev = d->dev;
 299                if (dev != ic_dev) {
 300                        DBG(("IP-Config: Downing %s\n", dev->name));
 301                        dev_change_flags(dev, d->flags);
 302                }
 303                kfree(d);
 304        }
 305        rtnl_unlock();
 306}
 307
 308/*
 309 *      Interface to various network functions.
 310 */
 311
 312static inline void
 313set_sockaddr(struct sockaddr_in *sin, __be32 addr, __be16 port)
 314{
 315        sin->sin_family = AF_INET;
 316        sin->sin_addr.s_addr = addr;
 317        sin->sin_port = port;
 318}
 319
 320static int __init ic_devinet_ioctl(unsigned int cmd, struct ifreq *arg)
 321{
 322        int res;
 323
 324        mm_segment_t oldfs = get_fs();
 325        set_fs(get_ds());
 326        res = devinet_ioctl(&init_net, cmd, (struct ifreq __user *) arg);
 327        set_fs(oldfs);
 328        return res;
 329}
 330
 331static int __init ic_dev_ioctl(unsigned int cmd, struct ifreq *arg)
 332{
 333        int res;
 334
 335        mm_segment_t oldfs = get_fs();
 336        set_fs(get_ds());
 337        res = dev_ioctl(&init_net, cmd, (struct ifreq __user *) arg);
 338        set_fs(oldfs);
 339        return res;
 340}
 341
 342static int __init ic_route_ioctl(unsigned int cmd, struct rtentry *arg)
 343{
 344        int res;
 345
 346        mm_segment_t oldfs = get_fs();
 347        set_fs(get_ds());
 348        res = ip_rt_ioctl(&init_net, cmd, (void __user *) arg);
 349        set_fs(oldfs);
 350        return res;
 351}
 352
 353/*
 354 *      Set up interface addresses and routes.
 355 */
 356
 357static int __init ic_setup_if(void)
 358{
 359        struct ifreq ir;
 360        struct sockaddr_in *sin = (void *) &ir.ifr_ifru.ifru_addr;
 361        int err;
 362
 363        memset(&ir, 0, sizeof(ir));
 364        strcpy(ir.ifr_ifrn.ifrn_name, ic_dev->name);
 365        set_sockaddr(sin, ic_myaddr, 0);
 366        if ((err = ic_devinet_ioctl(SIOCSIFADDR, &ir)) < 0) {
 367                pr_err("IP-Config: Unable to set interface address (%d)\n",
 368                       err);
 369                return -1;
 370        }
 371        set_sockaddr(sin, ic_netmask, 0);
 372        if ((err = ic_devinet_ioctl(SIOCSIFNETMASK, &ir)) < 0) {
 373                pr_err("IP-Config: Unable to set interface netmask (%d)\n",
 374                       err);
 375                return -1;
 376        }
 377        set_sockaddr(sin, ic_myaddr | ~ic_netmask, 0);
 378        if ((err = ic_devinet_ioctl(SIOCSIFBRDADDR, &ir)) < 0) {
 379                pr_err("IP-Config: Unable to set interface broadcast address (%d)\n",
 380                       err);
 381                return -1;
 382        }
 383        /* Handle the case where we need non-standard MTU on the boot link (a network
 384         * using jumbo frames, for instance).  If we can't set the mtu, don't error
 385         * out, we'll try to muddle along.
 386         */
 387        if (ic_dev_mtu != 0) {
 388                strcpy(ir.ifr_name, ic_dev->name);
 389                ir.ifr_mtu = ic_dev_mtu;
 390                if ((err = ic_dev_ioctl(SIOCSIFMTU, &ir)) < 0)
 391                        pr_err("IP-Config: Unable to set interface mtu to %d (%d)\n",
 392                               ic_dev_mtu, err);
 393        }
 394        return 0;
 395}
 396
 397static int __init ic_setup_routes(void)
 398{
 399        /* No need to setup device routes, only the default route... */
 400
 401        if (ic_gateway != NONE) {
 402                struct rtentry rm;
 403                int err;
 404
 405                memset(&rm, 0, sizeof(rm));
 406                if ((ic_gateway ^ ic_myaddr) & ic_netmask) {
 407                        pr_err("IP-Config: Gateway not on directly connected network\n");
 408                        return -1;
 409                }
 410                set_sockaddr((struct sockaddr_in *) &rm.rt_dst, 0, 0);
 411                set_sockaddr((struct sockaddr_in *) &rm.rt_genmask, 0, 0);
 412                set_sockaddr((struct sockaddr_in *) &rm.rt_gateway, ic_gateway, 0);
 413                rm.rt_flags = RTF_UP | RTF_GATEWAY;
 414                if ((err = ic_route_ioctl(SIOCADDRT, &rm)) < 0) {
 415                        pr_err("IP-Config: Cannot add default route (%d)\n",
 416                               err);
 417                        return -1;
 418                }
 419        }
 420
 421        return 0;
 422}
 423
 424/*
 425 *      Fill in default values for all missing parameters.
 426 */
 427
 428static int __init ic_defaults(void)
 429{
 430        /*
 431         *      At this point we have no userspace running so need not
 432         *      claim locks on system_utsname
 433         */
 434
 435        if (!ic_host_name_set)
 436                sprintf(init_utsname()->nodename, "%pI4", &ic_myaddr);
 437
 438        if (root_server_addr == NONE)
 439                root_server_addr = ic_servaddr;
 440
 441        if (ic_netmask == NONE) {
 442                if (IN_CLASSA(ntohl(ic_myaddr)))
 443                        ic_netmask = htonl(IN_CLASSA_NET);
 444                else if (IN_CLASSB(ntohl(ic_myaddr)))
 445                        ic_netmask = htonl(IN_CLASSB_NET);
 446                else if (IN_CLASSC(ntohl(ic_myaddr)))
 447                        ic_netmask = htonl(IN_CLASSC_NET);
 448                else {
 449                        pr_err("IP-Config: Unable to guess netmask for address %pI4\n",
 450                               &ic_myaddr);
 451                        return -1;
 452                }
 453                printk("IP-Config: Guessing netmask %pI4\n", &ic_netmask);
 454        }
 455
 456        return 0;
 457}
 458
 459/*
 460 *      RARP support.
 461 */
 462
 463#ifdef IPCONFIG_RARP
 464
 465static int ic_rarp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev);
 466
 467static struct packet_type rarp_packet_type __initdata = {
 468        .type = cpu_to_be16(ETH_P_RARP),
 469        .func = ic_rarp_recv,
 470};
 471
 472static inline void __init ic_rarp_init(void)
 473{
 474        dev_add_pack(&rarp_packet_type);
 475}
 476
 477static inline void __init ic_rarp_cleanup(void)
 478{
 479        dev_remove_pack(&rarp_packet_type);
 480}
 481
 482/*
 483 *  Process received RARP packet.
 484 */
 485static int __init
 486ic_rarp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
 487{
 488        struct arphdr *rarp;
 489        unsigned char *rarp_ptr;
 490        __be32 sip, tip;
 491        unsigned char *sha, *tha;               /* s for "source", t for "target" */
 492        struct ic_device *d;
 493
 494        if (!net_eq(dev_net(dev), &init_net))
 495                goto drop;
 496
 497        if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
 498                return NET_RX_DROP;
 499
 500        if (!pskb_may_pull(skb, sizeof(struct arphdr)))
 501                goto drop;
 502
 503        /* Basic sanity checks can be done without the lock.  */
 504        rarp = (struct arphdr *)skb_transport_header(skb);
 505
 506        /* If this test doesn't pass, it's not IP, or we should
 507         * ignore it anyway.
 508         */
 509        if (rarp->ar_hln != dev->addr_len || dev->type != ntohs(rarp->ar_hrd))
 510                goto drop;
 511
 512        /* If it's not a RARP reply, delete it. */
 513        if (rarp->ar_op != htons(ARPOP_RREPLY))
 514                goto drop;
 515
 516        /* If it's not Ethernet, delete it. */
 517        if (rarp->ar_pro != htons(ETH_P_IP))
 518                goto drop;
 519
 520        if (!pskb_may_pull(skb, arp_hdr_len(dev)))
 521                goto drop;
 522
 523        /* OK, it is all there and looks valid, process... */
 524        rarp = (struct arphdr *)skb_transport_header(skb);
 525        rarp_ptr = (unsigned char *) (rarp + 1);
 526
 527        /* One reply at a time, please. */
 528        spin_lock(&ic_recv_lock);
 529
 530        /* If we already have a reply, just drop the packet */
 531        if (ic_got_reply)
 532                goto drop_unlock;
 533
 534        /* Find the ic_device that the packet arrived on */
 535        d = ic_first_dev;
 536        while (d && d->dev != dev)
 537                d = d->next;
 538        if (!d)
 539                goto drop_unlock;       /* should never happen */
 540
 541        /* Extract variable-width fields */
 542        sha = rarp_ptr;
 543        rarp_ptr += dev->addr_len;
 544        memcpy(&sip, rarp_ptr, 4);
 545        rarp_ptr += 4;
 546        tha = rarp_ptr;
 547        rarp_ptr += dev->addr_len;
 548        memcpy(&tip, rarp_ptr, 4);
 549
 550        /* Discard packets which are not meant for us. */
 551        if (memcmp(tha, dev->dev_addr, dev->addr_len))
 552                goto drop_unlock;
 553
 554        /* Discard packets which are not from specified server. */
 555        if (ic_servaddr != NONE && ic_servaddr != sip)
 556                goto drop_unlock;
 557
 558        /* We have a winner! */
 559        ic_dev = dev;
 560        if (ic_myaddr == NONE)
 561                ic_myaddr = tip;
 562        ic_servaddr = sip;
 563        ic_addrservaddr = sip;
 564        ic_got_reply = IC_RARP;
 565
 566drop_unlock:
 567        /* Show's over.  Nothing to see here.  */
 568        spin_unlock(&ic_recv_lock);
 569
 570drop:
 571        /* Throw the packet out. */
 572        kfree_skb(skb);
 573        return 0;
 574}
 575
 576
 577/*
 578 *  Send RARP request packet over a single interface.
 579 */
 580static void __init ic_rarp_send_if(struct ic_device *d)
 581{
 582        struct net_device *dev = d->dev;
 583        arp_send(ARPOP_RREQUEST, ETH_P_RARP, 0, dev, 0, NULL,
 584                 dev->dev_addr, dev->dev_addr);
 585}
 586#endif
 587
 588/*
 589 *  Predefine Nameservers
 590 */
 591static inline void __init ic_nameservers_predef(void)
 592{
 593        int i;
 594
 595        for (i = 0; i < CONF_NAMESERVERS_MAX; i++)
 596                ic_nameservers[i] = NONE;
 597}
 598
 599/*
 600 *      DHCP/BOOTP support.
 601 */
 602
 603#ifdef IPCONFIG_BOOTP
 604
 605struct bootp_pkt {              /* BOOTP packet format */
 606        struct iphdr iph;       /* IP header */
 607        struct udphdr udph;     /* UDP header */
 608        u8 op;                  /* 1=request, 2=reply */
 609        u8 htype;               /* HW address type */
 610        u8 hlen;                /* HW address length */
 611        u8 hops;                /* Used only by gateways */
 612        __be32 xid;             /* Transaction ID */
 613        __be16 secs;            /* Seconds since we started */
 614        __be16 flags;           /* Just what it says */
 615        __be32 client_ip;               /* Client's IP address if known */
 616        __be32 your_ip;         /* Assigned IP address */
 617        __be32 server_ip;               /* (Next, e.g. NFS) Server's IP address */
 618        __be32 relay_ip;                /* IP address of BOOTP relay */
 619        u8 hw_addr[16];         /* Client's HW address */
 620        u8 serv_name[64];       /* Server host name */
 621        u8 boot_file[128];      /* Name of boot file */
 622        u8 exten[312];          /* DHCP options / BOOTP vendor extensions */
 623};
 624
 625/* packet ops */
 626#define BOOTP_REQUEST   1
 627#define BOOTP_REPLY     2
 628
 629/* DHCP message types */
 630#define DHCPDISCOVER    1
 631#define DHCPOFFER       2
 632#define DHCPREQUEST     3
 633#define DHCPDECLINE     4
 634#define DHCPACK         5
 635#define DHCPNAK         6
 636#define DHCPRELEASE     7
 637#define DHCPINFORM      8
 638
 639static int ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev);
 640
 641static struct packet_type bootp_packet_type __initdata = {
 642        .type = cpu_to_be16(ETH_P_IP),
 643        .func = ic_bootp_recv,
 644};
 645
 646
 647/*
 648 *  Initialize DHCP/BOOTP extension fields in the request.
 649 */
 650
 651static const u8 ic_bootp_cookie[4] = { 99, 130, 83, 99 };
 652
 653#ifdef IPCONFIG_DHCP
 654
 655static void __init
 656ic_dhcp_init_options(u8 *options)
 657{
 658        u8 mt = ((ic_servaddr == NONE)
 659                 ? DHCPDISCOVER : DHCPREQUEST);
 660        u8 *e = options;
 661        int len;
 662
 663#ifdef IPCONFIG_DEBUG
 664        printk("DHCP: Sending message type %d\n", mt);
 665#endif
 666
 667        memcpy(e, ic_bootp_cookie, 4);  /* RFC1048 Magic Cookie */
 668        e += 4;
 669
 670        *e++ = 53;              /* DHCP message type */
 671        *e++ = 1;
 672        *e++ = mt;
 673
 674        if (mt == DHCPREQUEST) {
 675                *e++ = 54;      /* Server ID (IP address) */
 676                *e++ = 4;
 677                memcpy(e, &ic_servaddr, 4);
 678                e += 4;
 679
 680                *e++ = 50;      /* Requested IP address */
 681                *e++ = 4;
 682                memcpy(e, &ic_myaddr, 4);
 683                e += 4;
 684        }
 685
 686        /* always? */
 687        {
 688                static const u8 ic_req_params[] = {
 689                        1,      /* Subnet mask */
 690                        3,      /* Default gateway */
 691                        6,      /* DNS server */
 692                        12,     /* Host name */
 693                        15,     /* Domain name */
 694                        17,     /* Boot path */
 695                        26,     /* MTU */
 696                        40,     /* NIS domain name */
 697                };
 698
 699                *e++ = 55;      /* Parameter request list */
 700                *e++ = sizeof(ic_req_params);
 701                memcpy(e, ic_req_params, sizeof(ic_req_params));
 702                e += sizeof(ic_req_params);
 703
 704                if (ic_host_name_set) {
 705                        *e++ = 12;      /* host-name */
 706                        len = strlen(utsname()->nodename);
 707                        *e++ = len;
 708                        memcpy(e, utsname()->nodename, len);
 709                        e += len;
 710                }
 711                if (*vendor_class_identifier) {
 712                        pr_info("DHCP: sending class identifier \"%s\"\n",
 713                                vendor_class_identifier);
 714                        *e++ = 60;      /* Class-identifier */
 715                        len = strlen(vendor_class_identifier);
 716                        *e++ = len;
 717                        memcpy(e, vendor_class_identifier, len);
 718                        e += len;
 719                }
 720        }
 721
 722        *e++ = 255;     /* End of the list */
 723}
 724
 725#endif /* IPCONFIG_DHCP */
 726
 727static void __init ic_bootp_init_ext(u8 *e)
 728{
 729        memcpy(e, ic_bootp_cookie, 4);  /* RFC1048 Magic Cookie */
 730        e += 4;
 731        *e++ = 1;               /* Subnet mask request */
 732        *e++ = 4;
 733        e += 4;
 734        *e++ = 3;               /* Default gateway request */
 735        *e++ = 4;
 736        e += 4;
 737        *e++ = 5;               /* Name server request */
 738        *e++ = 8;
 739        e += 8;
 740        *e++ = 12;              /* Host name request */
 741        *e++ = 32;
 742        e += 32;
 743        *e++ = 40;              /* NIS Domain name request */
 744        *e++ = 32;
 745        e += 32;
 746        *e++ = 17;              /* Boot path */
 747        *e++ = 40;
 748        e += 40;
 749
 750        *e++ = 57;              /* set extension buffer size for reply */
 751        *e++ = 2;
 752        *e++ = 1;               /* 128+236+8+20+14, see dhcpd sources */
 753        *e++ = 150;
 754
 755        *e++ = 255;             /* End of the list */
 756}
 757
 758
 759/*
 760 *  Initialize the DHCP/BOOTP mechanism.
 761 */
 762static inline void __init ic_bootp_init(void)
 763{
 764        ic_nameservers_predef();
 765
 766        dev_add_pack(&bootp_packet_type);
 767}
 768
 769
 770/*
 771 *  DHCP/BOOTP cleanup.
 772 */
 773static inline void __init ic_bootp_cleanup(void)
 774{
 775        dev_remove_pack(&bootp_packet_type);
 776}
 777
 778
 779/*
 780 *  Send DHCP/BOOTP request to single interface.
 781 */
 782static void __init ic_bootp_send_if(struct ic_device *d, unsigned long jiffies_diff)
 783{
 784        struct net_device *dev = d->dev;
 785        struct sk_buff *skb;
 786        struct bootp_pkt *b;
 787        struct iphdr *h;
 788        int hlen = LL_RESERVED_SPACE(dev);
 789        int tlen = dev->needed_tailroom;
 790
 791        /* Allocate packet */
 792        skb = alloc_skb(sizeof(struct bootp_pkt) + hlen + tlen + 15,
 793                        GFP_KERNEL);
 794        if (!skb)
 795                return;
 796        skb_reserve(skb, hlen);
 797        b = (struct bootp_pkt *) skb_put(skb, sizeof(struct bootp_pkt));
 798        memset(b, 0, sizeof(struct bootp_pkt));
 799
 800        /* Construct IP header */
 801        skb_reset_network_header(skb);
 802        h = ip_hdr(skb);
 803        h->version = 4;
 804        h->ihl = 5;
 805        h->tot_len = htons(sizeof(struct bootp_pkt));
 806        h->frag_off = htons(IP_DF);
 807        h->ttl = 64;
 808        h->protocol = IPPROTO_UDP;
 809        h->daddr = htonl(INADDR_BROADCAST);
 810        h->check = ip_fast_csum((unsigned char *) h, h->ihl);
 811
 812        /* Construct UDP header */
 813        b->udph.source = htons(68);
 814        b->udph.dest = htons(67);
 815        b->udph.len = htons(sizeof(struct bootp_pkt) - sizeof(struct iphdr));
 816        /* UDP checksum not calculated -- explicitly allowed in BOOTP RFC */
 817
 818        /* Construct DHCP/BOOTP header */
 819        b->op = BOOTP_REQUEST;
 820        if (dev->type < 256) /* check for false types */
 821                b->htype = dev->type;
 822        else if (dev->type == ARPHRD_FDDI)
 823                b->htype = ARPHRD_ETHER;
 824        else {
 825                printk("Unknown ARP type 0x%04x for device %s\n", dev->type, dev->name);
 826                b->htype = dev->type; /* can cause undefined behavior */
 827        }
 828
 829        /* server_ip and your_ip address are both already zero per RFC2131 */
 830        b->hlen = dev->addr_len;
 831        memcpy(b->hw_addr, dev->dev_addr, dev->addr_len);
 832        b->secs = htons(jiffies_diff / HZ);
 833        b->xid = d->xid;
 834
 835        /* add DHCP options or BOOTP extensions */
 836#ifdef IPCONFIG_DHCP
 837        if (ic_proto_enabled & IC_USE_DHCP)
 838                ic_dhcp_init_options(b->exten);
 839        else
 840#endif
 841                ic_bootp_init_ext(b->exten);
 842
 843        /* Chain packet down the line... */
 844        skb->dev = dev;
 845        skb->protocol = htons(ETH_P_IP);
 846        if (dev_hard_header(skb, dev, ntohs(skb->protocol),
 847                            dev->broadcast, dev->dev_addr, skb->len) < 0) {
 848                kfree_skb(skb);
 849                printk("E");
 850                return;
 851        }
 852
 853        if (dev_queue_xmit(skb) < 0)
 854                printk("E");
 855}
 856
 857
 858/*
 859 *  Copy BOOTP-supplied string if not already set.
 860 */
 861static int __init ic_bootp_string(char *dest, char *src, int len, int max)
 862{
 863        if (!len)
 864                return 0;
 865        if (len > max-1)
 866                len = max-1;
 867        memcpy(dest, src, len);
 868        dest[len] = '\0';
 869        return 1;
 870}
 871
 872
 873/*
 874 *  Process BOOTP extensions.
 875 */
 876static void __init ic_do_bootp_ext(u8 *ext)
 877{
 878        u8 servers;
 879        int i;
 880        __be16 mtu;
 881
 882#ifdef IPCONFIG_DEBUG
 883        u8 *c;
 884
 885        printk("DHCP/BOOTP: Got extension %d:",*ext);
 886        for (c=ext+2; c<ext+2+ext[1]; c++)
 887                printk(" %02x", *c);
 888        printk("\n");
 889#endif
 890
 891        switch (*ext++) {
 892        case 1:         /* Subnet mask */
 893                if (ic_netmask == NONE)
 894                        memcpy(&ic_netmask, ext+1, 4);
 895                break;
 896        case 3:         /* Default gateway */
 897                if (ic_gateway == NONE)
 898                        memcpy(&ic_gateway, ext+1, 4);
 899                break;
 900        case 6:         /* DNS server */
 901                servers= *ext/4;
 902                if (servers > CONF_NAMESERVERS_MAX)
 903                        servers = CONF_NAMESERVERS_MAX;
 904                for (i = 0; i < servers; i++) {
 905                        if (ic_nameservers[i] == NONE)
 906                                memcpy(&ic_nameservers[i], ext+1+4*i, 4);
 907                }
 908                break;
 909        case 12:        /* Host name */
 910                ic_bootp_string(utsname()->nodename, ext+1, *ext,
 911                                __NEW_UTS_LEN);
 912                ic_host_name_set = 1;
 913                break;
 914        case 15:        /* Domain name (DNS) */
 915                ic_bootp_string(ic_domain, ext+1, *ext, sizeof(ic_domain));
 916                break;
 917        case 17:        /* Root path */
 918                if (!root_server_path[0])
 919                        ic_bootp_string(root_server_path, ext+1, *ext,
 920                                        sizeof(root_server_path));
 921                break;
 922        case 26:        /* Interface MTU */
 923                memcpy(&mtu, ext+1, sizeof(mtu));
 924                ic_dev_mtu = ntohs(mtu);
 925                break;
 926        case 40:        /* NIS Domain name (_not_ DNS) */
 927                ic_bootp_string(utsname()->domainname, ext+1, *ext,
 928                                __NEW_UTS_LEN);
 929                break;
 930        }
 931}
 932
 933
 934/*
 935 *  Receive BOOTP reply.
 936 */
 937static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
 938{
 939        struct bootp_pkt *b;
 940        struct iphdr *h;
 941        struct ic_device *d;
 942        int len, ext_len;
 943
 944        if (!net_eq(dev_net(dev), &init_net))
 945                goto drop;
 946
 947        /* Perform verifications before taking the lock.  */
 948        if (skb->pkt_type == PACKET_OTHERHOST)
 949                goto drop;
 950
 951        if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
 952                return NET_RX_DROP;
 953
 954        if (!pskb_may_pull(skb,
 955                           sizeof(struct iphdr) +
 956                           sizeof(struct udphdr)))
 957                goto drop;
 958
 959        b = (struct bootp_pkt *)skb_network_header(skb);
 960        h = &b->iph;
 961
 962        if (h->ihl != 5 || h->version != 4 || h->protocol != IPPROTO_UDP)
 963                goto drop;
 964
 965        /* Fragments are not supported */
 966        if (ip_is_fragment(h)) {
 967                net_err_ratelimited("DHCP/BOOTP: Ignoring fragmented reply\n");
 968                goto drop;
 969        }
 970
 971        if (skb->len < ntohs(h->tot_len))
 972                goto drop;
 973
 974        if (ip_fast_csum((char *) h, h->ihl))
 975                goto drop;
 976
 977        if (b->udph.source != htons(67) || b->udph.dest != htons(68))
 978                goto drop;
 979
 980        if (ntohs(h->tot_len) < ntohs(b->udph.len) + sizeof(struct iphdr))
 981                goto drop;
 982
 983        len = ntohs(b->udph.len) - sizeof(struct udphdr);
 984        ext_len = len - (sizeof(*b) -
 985                         sizeof(struct iphdr) -
 986                         sizeof(struct udphdr) -
 987                         sizeof(b->exten));
 988        if (ext_len < 0)
 989                goto drop;
 990
 991        /* Ok the front looks good, make sure we can get at the rest.  */
 992        if (!pskb_may_pull(skb, skb->len))
 993                goto drop;
 994
 995        b = (struct bootp_pkt *)skb_network_header(skb);
 996        h = &b->iph;
 997
 998        /* One reply at a time, please. */
 999        spin_lock(&ic_recv_lock);
1000
1001        /* If we already have a reply, just drop the packet */
1002        if (ic_got_reply)
1003                goto drop_unlock;
1004
1005        /* Find the ic_device that the packet arrived on */
1006        d = ic_first_dev;
1007        while (d && d->dev != dev)
1008                d = d->next;
1009        if (!d)
1010                goto drop_unlock;  /* should never happen */
1011
1012        /* Is it a reply to our BOOTP request? */
1013        if (b->op != BOOTP_REPLY ||
1014            b->xid != d->xid) {
1015                net_err_ratelimited("DHCP/BOOTP: Reply not for us, op[%x] xid[%x]\n",
1016                                    b->op, b->xid);
1017                goto drop_unlock;
1018        }
1019
1020        /* Is it a reply for the device we are configuring? */
1021        if (b->xid != ic_dev_xid) {
1022                net_err_ratelimited("DHCP/BOOTP: Ignoring delayed packet\n");
1023                goto drop_unlock;
1024        }
1025
1026        /* Parse extensions */
1027        if (ext_len >= 4 &&
1028            !memcmp(b->exten, ic_bootp_cookie, 4)) { /* Check magic cookie */
1029                u8 *end = (u8 *) b + ntohs(b->iph.tot_len);
1030                u8 *ext;
1031
1032#ifdef IPCONFIG_DHCP
1033                if (ic_proto_enabled & IC_USE_DHCP) {
1034                        __be32 server_id = NONE;
1035                        int mt = 0;
1036
1037                        ext = &b->exten[4];
1038                        while (ext < end && *ext != 0xff) {
1039                                u8 *opt = ext++;
1040                                if (*opt == 0)  /* Padding */
1041                                        continue;
1042                                ext += *ext + 1;
1043                                if (ext >= end)
1044                                        break;
1045                                switch (*opt) {
1046                                case 53:        /* Message type */
1047                                        if (opt[1])
1048                                                mt = opt[2];
1049                                        break;
1050                                case 54:        /* Server ID (IP address) */
1051                                        if (opt[1] >= 4)
1052                                                memcpy(&server_id, opt + 2, 4);
1053                                        break;
1054                                }
1055                        }
1056
1057#ifdef IPCONFIG_DEBUG
1058                        printk("DHCP: Got message type %d\n", mt);
1059#endif
1060
1061                        switch (mt) {
1062                        case DHCPOFFER:
1063                                /* While in the process of accepting one offer,
1064                                 * ignore all others.
1065                                 */
1066                                if (ic_myaddr != NONE)
1067                                        goto drop_unlock;
1068
1069                                /* Let's accept that offer. */
1070                                ic_myaddr = b->your_ip;
1071                                ic_servaddr = server_id;
1072#ifdef IPCONFIG_DEBUG
1073                                printk("DHCP: Offered address %pI4 by server %pI4\n",
1074                                       &ic_myaddr, &b->iph.saddr);
1075#endif
1076                                /* The DHCP indicated server address takes
1077                                 * precedence over the bootp header one if
1078                                 * they are different.
1079                                 */
1080                                if ((server_id != NONE) &&
1081                                    (b->server_ip != server_id))
1082                                        b->server_ip = ic_servaddr;
1083                                break;
1084
1085                        case DHCPACK:
1086                                if (memcmp(dev->dev_addr, b->hw_addr, dev->addr_len) != 0)
1087                                        goto drop_unlock;
1088
1089                                /* Yeah! */
1090                                break;
1091
1092                        default:
1093                                /* Urque.  Forget it*/
1094                                ic_myaddr = NONE;
1095                                ic_servaddr = NONE;
1096                                goto drop_unlock;
1097                        }
1098
1099                        ic_dhcp_msgtype = mt;
1100
1101                }
1102#endif /* IPCONFIG_DHCP */
1103
1104                ext = &b->exten[4];
1105                while (ext < end && *ext != 0xff) {
1106                        u8 *opt = ext++;
1107                        if (*opt == 0)  /* Padding */
1108                                continue;
1109                        ext += *ext + 1;
1110                        if (ext < end)
1111                                ic_do_bootp_ext(opt);
1112                }
1113        }
1114
1115        /* We have a winner! */
1116        ic_dev = dev;
1117        ic_myaddr = b->your_ip;
1118        ic_servaddr = b->server_ip;
1119        ic_addrservaddr = b->iph.saddr;
1120        if (ic_gateway == NONE && b->relay_ip)
1121                ic_gateway = b->relay_ip;
1122        if (ic_nameservers[0] == NONE)
1123                ic_nameservers[0] = ic_servaddr;
1124        ic_got_reply = IC_BOOTP;
1125
1126drop_unlock:
1127        /* Show's over.  Nothing to see here.  */
1128        spin_unlock(&ic_recv_lock);
1129
1130drop:
1131        /* Throw the packet out. */
1132        kfree_skb(skb);
1133
1134        return 0;
1135}
1136
1137
1138#endif
1139
1140
1141/*
1142 *      Dynamic IP configuration -- DHCP, BOOTP, RARP.
1143 */
1144
1145#ifdef IPCONFIG_DYNAMIC
1146
1147static int __init ic_dynamic(void)
1148{
1149        int retries;
1150        struct ic_device *d;
1151        unsigned long start_jiffies, timeout, jiff;
1152        int do_bootp = ic_proto_have_if & IC_BOOTP;
1153        int do_rarp = ic_proto_have_if & IC_RARP;
1154
1155        /*
1156         * If none of DHCP/BOOTP/RARP was selected, return with an error.
1157         * This routine gets only called when some pieces of information
1158         * are missing, and without DHCP/BOOTP/RARP we are unable to get it.
1159         */
1160        if (!ic_proto_enabled) {
1161                pr_err("IP-Config: Incomplete network configuration information\n");
1162                return -1;
1163        }
1164
1165#ifdef IPCONFIG_BOOTP
1166        if ((ic_proto_enabled ^ ic_proto_have_if) & IC_BOOTP)
1167                pr_err("DHCP/BOOTP: No suitable device found\n");
1168#endif
1169#ifdef IPCONFIG_RARP
1170        if ((ic_proto_enabled ^ ic_proto_have_if) & IC_RARP)
1171                pr_err("RARP: No suitable device found\n");
1172#endif
1173
1174        if (!ic_proto_have_if)
1175                /* Error message already printed */
1176                return -1;
1177
1178        /*
1179         * Setup protocols
1180         */
1181#ifdef IPCONFIG_BOOTP
1182        if (do_bootp)
1183                ic_bootp_init();
1184#endif
1185#ifdef IPCONFIG_RARP
1186        if (do_rarp)
1187                ic_rarp_init();
1188#endif
1189
1190        /*
1191         * Send requests and wait, until we get an answer. This loop
1192         * seems to be a terrible waste of CPU time, but actually there is
1193         * only one process running at all, so we don't need to use any
1194         * scheduler functions.
1195         * [Actually we could now, but the nothing else running note still
1196         *  applies.. - AC]
1197         */
1198        pr_notice("Sending %s%s%s requests .",
1199                  do_bootp
1200                  ? ((ic_proto_enabled & IC_USE_DHCP) ? "DHCP" : "BOOTP") : "",
1201                  (do_bootp && do_rarp) ? " and " : "",
1202                  do_rarp ? "RARP" : "");
1203
1204        start_jiffies = jiffies;
1205        d = ic_first_dev;
1206        retries = CONF_SEND_RETRIES;
1207        get_random_bytes(&timeout, sizeof(timeout));
1208        timeout = CONF_BASE_TIMEOUT + (timeout % (unsigned int) CONF_TIMEOUT_RANDOM);
1209        for (;;) {
1210                /* Track the device we are configuring */
1211                ic_dev_xid = d->xid;
1212
1213#ifdef IPCONFIG_BOOTP
1214                if (do_bootp && (d->able & IC_BOOTP))
1215                        ic_bootp_send_if(d, jiffies - start_jiffies);
1216#endif
1217#ifdef IPCONFIG_RARP
1218                if (do_rarp && (d->able & IC_RARP))
1219                        ic_rarp_send_if(d);
1220#endif
1221
1222                jiff = jiffies + (d->next ? CONF_INTER_TIMEOUT : timeout);
1223                while (time_before(jiffies, jiff) && !ic_got_reply)
1224                        schedule_timeout_uninterruptible(1);
1225#ifdef IPCONFIG_DHCP
1226                /* DHCP isn't done until we get a DHCPACK. */
1227                if ((ic_got_reply & IC_BOOTP) &&
1228                    (ic_proto_enabled & IC_USE_DHCP) &&
1229                    ic_dhcp_msgtype != DHCPACK) {
1230                        ic_got_reply = 0;
1231                        pr_cont(",");
1232                        continue;
1233                }
1234#endif /* IPCONFIG_DHCP */
1235
1236                if (ic_got_reply) {
1237                        pr_cont(" OK\n");
1238                        break;
1239                }
1240
1241                if ((d = d->next))
1242                        continue;
1243
1244                if (! --retries) {
1245                        pr_cont(" timed out!\n");
1246                        break;
1247                }
1248
1249                d = ic_first_dev;
1250
1251                timeout = timeout CONF_TIMEOUT_MULT;
1252                if (timeout > CONF_TIMEOUT_MAX)
1253                        timeout = CONF_TIMEOUT_MAX;
1254
1255                pr_cont(".");
1256        }
1257
1258#ifdef IPCONFIG_BOOTP
1259        if (do_bootp)
1260                ic_bootp_cleanup();
1261#endif
1262#ifdef IPCONFIG_RARP
1263        if (do_rarp)
1264                ic_rarp_cleanup();
1265#endif
1266
1267        if (!ic_got_reply) {
1268                ic_myaddr = NONE;
1269                return -1;
1270        }
1271
1272        printk("IP-Config: Got %s answer from %pI4, ",
1273                ((ic_got_reply & IC_RARP) ? "RARP"
1274                 : (ic_proto_enabled & IC_USE_DHCP) ? "DHCP" : "BOOTP"),
1275               &ic_addrservaddr);
1276        pr_cont("my address is %pI4\n", &ic_myaddr);
1277
1278        return 0;
1279}
1280
1281#endif /* IPCONFIG_DYNAMIC */
1282
1283#ifdef CONFIG_PROC_FS
1284
1285static int pnp_seq_show(struct seq_file *seq, void *v)
1286{
1287        int i;
1288
1289        if (ic_proto_used & IC_PROTO)
1290                seq_printf(seq, "#PROTO: %s\n",
1291                           (ic_proto_used & IC_RARP) ? "RARP"
1292                           : (ic_proto_used & IC_USE_DHCP) ? "DHCP" : "BOOTP");
1293        else
1294                seq_puts(seq, "#MANUAL\n");
1295
1296        if (ic_domain[0])
1297                seq_printf(seq,
1298                           "domain %s\n", ic_domain);
1299        for (i = 0; i < CONF_NAMESERVERS_MAX; i++) {
1300                if (ic_nameservers[i] != NONE)
1301                        seq_printf(seq, "nameserver %pI4\n",
1302                                   &ic_nameservers[i]);
1303        }
1304        if (ic_servaddr != NONE)
1305                seq_printf(seq, "bootserver %pI4\n",
1306                           &ic_servaddr);
1307        return 0;
1308}
1309
1310static int pnp_seq_open(struct inode *indoe, struct file *file)
1311{
1312        return single_open(file, pnp_seq_show, NULL);
1313}
1314
1315static const struct file_operations pnp_seq_fops = {
1316        .owner          = THIS_MODULE,
1317        .open           = pnp_seq_open,
1318        .read           = seq_read,
1319        .llseek         = seq_lseek,
1320        .release        = single_release,
1321};
1322#endif /* CONFIG_PROC_FS */
1323
1324/*
1325 *  Extract IP address from the parameter string if needed. Note that we
1326 *  need to have root_server_addr set _before_ IPConfig gets called as it
1327 *  can override it.
1328 */
1329__be32 __init root_nfs_parse_addr(char *name)
1330{
1331        __be32 addr;
1332        int octets = 0;
1333        char *cp, *cq;
1334
1335        cp = cq = name;
1336        while (octets < 4) {
1337                while (*cp >= '0' && *cp <= '9')
1338                        cp++;
1339                if (cp == cq || cp - cq > 3)
1340                        break;
1341                if (*cp == '.' || octets == 3)
1342                        octets++;
1343                if (octets < 4)
1344                        cp++;
1345                cq = cp;
1346        }
1347        if (octets == 4 && (*cp == ':' || *cp == '\0')) {
1348                if (*cp == ':')
1349                        *cp++ = '\0';
1350                addr = in_aton(name);
1351                memmove(name, cp, strlen(cp) + 1);
1352        } else
1353                addr = NONE;
1354
1355        return addr;
1356}
1357
1358#define DEVICE_WAIT_MAX         12 /* 12 seconds */
1359
1360static int __init wait_for_devices(void)
1361{
1362        int i;
1363
1364        for (i = 0; i < DEVICE_WAIT_MAX; i++) {
1365                struct net_device *dev;
1366                int found = 0;
1367
1368                rtnl_lock();
1369                for_each_netdev(&init_net, dev) {
1370                        if (ic_is_init_dev(dev)) {
1371                                found = 1;
1372                                break;
1373                        }
1374                }
1375                rtnl_unlock();
1376                if (found)
1377                        return 0;
1378                ssleep(1);
1379        }
1380        return -ENODEV;
1381}
1382
1383/*
1384 *      IP Autoconfig dispatcher.
1385 */
1386
1387static int __init ip_auto_config(void)
1388{
1389        __be32 addr;
1390#ifdef IPCONFIG_DYNAMIC
1391        int retries = CONF_OPEN_RETRIES;
1392#endif
1393        int err;
1394        unsigned int i;
1395
1396#ifdef CONFIG_PROC_FS
1397        proc_net_fops_create(&init_net, "pnp", S_IRUGO, &pnp_seq_fops);
1398#endif /* CONFIG_PROC_FS */
1399
1400        if (!ic_enable)
1401                return 0;
1402
1403        DBG(("IP-Config: Entered.\n"));
1404#ifdef IPCONFIG_DYNAMIC
1405 try_try_again:
1406#endif
1407        /* Wait for devices to appear */
1408        err = wait_for_devices();
1409        if (err)
1410                return err;
1411
1412        /* Setup all network devices */
1413        err = ic_open_devs();
1414        if (err)
1415                return err;
1416
1417        /* Give drivers a chance to settle */
1418        msleep(CONF_POST_OPEN);
1419
1420        /*
1421         * If the config information is insufficient (e.g., our IP address or
1422         * IP address of the boot server is missing or we have multiple network
1423         * interfaces and no default was set), use BOOTP or RARP to get the
1424         * missing values.
1425         */
1426        if (ic_myaddr == NONE ||
1427#ifdef CONFIG_ROOT_NFS
1428            (root_server_addr == NONE &&
1429             ic_servaddr == NONE &&
1430             ROOT_DEV == Root_NFS) ||
1431#endif
1432            ic_first_dev->next) {
1433#ifdef IPCONFIG_DYNAMIC
1434                if (ic_dynamic() < 0) {
1435                        ic_close_devs();
1436
1437                        /*
1438                         * I don't know why, but sometimes the
1439                         * eepro100 driver (at least) gets upset and
1440                         * doesn't work the first time it's opened.
1441                         * But then if you close it and reopen it, it
1442                         * works just fine.  So we need to try that at
1443                         * least once before giving up.
1444                         *
1445                         * Also, if the root will be NFS-mounted, we
1446                         * have nowhere to go if DHCP fails.  So we
1447                         * just have to keep trying forever.
1448                         *
1449                         *                              -- Chip
1450                         */
1451#ifdef CONFIG_ROOT_NFS
1452                        if (ROOT_DEV ==  Root_NFS) {
1453                                pr_err("IP-Config: Retrying forever (NFS root)...\n");
1454                                goto try_try_again;
1455                        }
1456#endif
1457
1458                        if (--retries) {
1459                                pr_err("IP-Config: Reopening network devices...\n");
1460                                goto try_try_again;
1461                        }
1462
1463                        /* Oh, well.  At least we tried. */
1464                        pr_err("IP-Config: Auto-configuration of network failed\n");
1465                        return -1;
1466                }
1467#else /* !DYNAMIC */
1468                pr_err("IP-Config: Incomplete network configuration information\n");
1469                ic_close_devs();
1470                return -1;
1471#endif /* IPCONFIG_DYNAMIC */
1472        } else {
1473                /* Device selected manually or only one device -> use it */
1474                ic_dev = ic_first_dev->dev;
1475        }
1476
1477        addr = root_nfs_parse_addr(root_server_path);
1478        if (root_server_addr == NONE)
1479                root_server_addr = addr;
1480
1481        /*
1482         * Use defaults wherever applicable.
1483         */
1484        if (ic_defaults() < 0)
1485                return -1;
1486
1487        /*
1488         * Close all network devices except the device we've
1489         * autoconfigured and set up routes.
1490         */
1491        ic_close_devs();
1492        if (ic_setup_if() < 0 || ic_setup_routes() < 0)
1493                return -1;
1494
1495        /*
1496         * Record which protocol was actually used.
1497         */
1498#ifdef IPCONFIG_DYNAMIC
1499        ic_proto_used = ic_got_reply | (ic_proto_enabled & IC_USE_DHCP);
1500#endif
1501
1502#ifndef IPCONFIG_SILENT
1503        /*
1504         * Clue in the operator.
1505         */
1506        pr_info("IP-Config: Complete:\n");
1507
1508        pr_info("     device=%s, hwaddr=%*phC, ipaddr=%pI4, mask=%pI4, gw=%pI4\n",
1509                ic_dev->name, ic_dev->addr_len, ic_dev->dev_addr,
1510                &ic_myaddr, &ic_netmask, &ic_gateway);
1511        pr_info("     host=%s, domain=%s, nis-domain=%s\n",
1512                utsname()->nodename, ic_domain, utsname()->domainname);
1513        pr_info("     bootserver=%pI4, rootserver=%pI4, rootpath=%s",
1514                &ic_servaddr, &root_server_addr, root_server_path);
1515        if (ic_dev_mtu)
1516                pr_cont(", mtu=%d", ic_dev_mtu);
1517        for (i = 0; i < CONF_NAMESERVERS_MAX; i++)
1518                if (ic_nameservers[i] != NONE) {
1519                        pr_info("     nameserver%u=%pI4",
1520                                i, &ic_nameservers[i]);
1521                        break;
1522                }
1523        for (i++; i < CONF_NAMESERVERS_MAX; i++)
1524                if (ic_nameservers[i] != NONE)
1525                        pr_cont(", nameserver%u=%pI4\n", i, &ic_nameservers[i]);
1526#endif /* !SILENT */
1527
1528        return 0;
1529}
1530
1531late_initcall(ip_auto_config);
1532
1533
1534/*
1535 *  Decode any IP configuration options in the "ip=" or "nfsaddrs=" kernel
1536 *  command line parameter.  See Documentation/filesystems/nfs/nfsroot.txt.
1537 */
1538static int __init ic_proto_name(char *name)
1539{
1540        if (!strcmp(name, "on") || !strcmp(name, "any")) {
1541                return 1;
1542        }
1543        if (!strcmp(name, "off") || !strcmp(name, "none")) {
1544                return 0;
1545        }
1546#ifdef CONFIG_IP_PNP_DHCP
1547        else if (!strcmp(name, "dhcp")) {
1548                ic_proto_enabled &= ~IC_RARP;
1549                return 1;
1550        }
1551#endif
1552#ifdef CONFIG_IP_PNP_BOOTP
1553        else if (!strcmp(name, "bootp")) {
1554                ic_proto_enabled &= ~(IC_RARP | IC_USE_DHCP);
1555                return 1;
1556        }
1557#endif
1558#ifdef CONFIG_IP_PNP_RARP
1559        else if (!strcmp(name, "rarp")) {
1560                ic_proto_enabled &= ~(IC_BOOTP | IC_USE_DHCP);
1561                return 1;
1562        }
1563#endif
1564#ifdef IPCONFIG_DYNAMIC
1565        else if (!strcmp(name, "both")) {
1566                ic_proto_enabled &= ~IC_USE_DHCP; /* backward compat :-( */
1567                return 1;
1568        }
1569#endif
1570        return 0;
1571}
1572
1573static int __init ip_auto_config_setup(char *addrs)
1574{
1575        char *cp, *ip, *dp;
1576        int num = 0;
1577
1578        ic_set_manually = 1;
1579        ic_enable = 1;
1580
1581        /*
1582         * If any dhcp, bootp etc options are set, leave autoconfig on
1583         * and skip the below static IP processing.
1584         */
1585        if (ic_proto_name(addrs))
1586                return 1;
1587
1588        /* If no static IP is given, turn off autoconfig and bail.  */
1589        if (*addrs == 0 ||
1590            strcmp(addrs, "off") == 0 ||
1591            strcmp(addrs, "none") == 0) {
1592                ic_enable = 0;
1593                return 1;
1594        }
1595
1596        ic_nameservers_predef();
1597
1598        /* Parse string for static IP assignment.  */
1599        ip = addrs;
1600        while (ip && *ip) {
1601                if ((cp = strchr(ip, ':')))
1602                        *cp++ = '\0';
1603                if (strlen(ip) > 0) {
1604                        DBG(("IP-Config: Parameter #%d: `%s'\n", num, ip));
1605                        switch (num) {
1606                        case 0:
1607                                if ((ic_myaddr = in_aton(ip)) == ANY)
1608                                        ic_myaddr = NONE;
1609                                break;
1610                        case 1:
1611                                if ((ic_servaddr = in_aton(ip)) == ANY)
1612                                        ic_servaddr = NONE;
1613                                break;
1614                        case 2:
1615                                if ((ic_gateway = in_aton(ip)) == ANY)
1616                                        ic_gateway = NONE;
1617                                break;
1618                        case 3:
1619                                if ((ic_netmask = in_aton(ip)) == ANY)
1620                                        ic_netmask = NONE;
1621                                break;
1622                        case 4:
1623                                if ((dp = strchr(ip, '.'))) {
1624                                        *dp++ = '\0';
1625                                        strlcpy(utsname()->domainname, dp,
1626                                                sizeof(utsname()->domainname));
1627                                }
1628                                strlcpy(utsname()->nodename, ip,
1629                                        sizeof(utsname()->nodename));
1630                                ic_host_name_set = 1;
1631                                break;
1632                        case 5:
1633                                strlcpy(user_dev_name, ip, sizeof(user_dev_name));
1634                                break;
1635                        case 6:
1636                                if (ic_proto_name(ip) == 0 &&
1637                                    ic_myaddr == NONE) {
1638                                        ic_enable = 0;
1639                                }
1640                                break;
1641                        case 7:
1642                                if (CONF_NAMESERVERS_MAX >= 1) {
1643                                        ic_nameservers[0] = in_aton(ip);
1644                                        if (ic_nameservers[0] == ANY)
1645                                                ic_nameservers[0] = NONE;
1646                                }
1647                                break;
1648                        case 8:
1649                                if (CONF_NAMESERVERS_MAX >= 2) {
1650                                        ic_nameservers[1] = in_aton(ip);
1651                                        if (ic_nameservers[1] == ANY)
1652                                                ic_nameservers[1] = NONE;
1653                                }
1654                                break;
1655                        }
1656                }
1657                ip = cp;
1658                num++;
1659        }
1660
1661        return 1;
1662}
1663__setup("ip=", ip_auto_config_setup);
1664
1665static int __init nfsaddrs_config_setup(char *addrs)
1666{
1667        return ip_auto_config_setup(addrs);
1668}
1669__setup("nfsaddrs=", nfsaddrs_config_setup);
1670
1671static int __init vendor_class_identifier_setup(char *addrs)
1672{
1673        if (strlcpy(vendor_class_identifier, addrs,
1674                    sizeof(vendor_class_identifier))
1675            >= sizeof(vendor_class_identifier))
1676                pr_warn("DHCP: vendorclass too long, truncated to \"%s\"",
1677                        vendor_class_identifier);
1678        return 1;
1679}
1680__setup("dhcpclass=", vendor_class_identifier_setup);
1681