LCOV - code coverage report
Current view: top level - net/ipv4 - ipconfig.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 10 567 1.8 %
Date: 2014-04-07 Functions: 2 27 7.4 %
Branches: 6 477 1.3 %

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

Generated by: LCOV version 1.9