0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #include <linux/types.h>
0037 #include <linux/string.h>
0038 #include <linux/kernel.h>
0039 #include <linux/jiffies.h>
0040 #include <linux/random.h>
0041 #include <linux/init.h>
0042 #include <linux/utsname.h>
0043 #include <linux/in.h>
0044 #include <linux/if.h>
0045 #include <linux/inet.h>
0046 #include <linux/inetdevice.h>
0047 #include <linux/netdevice.h>
0048 #include <linux/if_arp.h>
0049 #include <linux/skbuff.h>
0050 #include <linux/ip.h>
0051 #include <linux/socket.h>
0052 #include <linux/route.h>
0053 #include <linux/udp.h>
0054 #include <linux/proc_fs.h>
0055 #include <linux/seq_file.h>
0056 #include <linux/major.h>
0057 #include <linux/root_dev.h>
0058 #include <linux/delay.h>
0059 #include <linux/nfs_fs.h>
0060 #include <linux/slab.h>
0061 #include <linux/export.h>
0062 #include <net/net_namespace.h>
0063 #include <net/arp.h>
0064 #include <net/ip.h>
0065 #include <net/ipconfig.h>
0066 #include <net/route.h>
0067
0068 #include <linux/uaccess.h>
0069 #include <net/checksum.h>
0070 #include <asm/processor.h>
0071
0072 #if defined(CONFIG_IP_PNP_DHCP)
0073 #define IPCONFIG_DHCP
0074 #endif
0075 #if defined(CONFIG_IP_PNP_BOOTP) || defined(CONFIG_IP_PNP_DHCP)
0076 #define IPCONFIG_BOOTP
0077 #endif
0078 #if defined(CONFIG_IP_PNP_RARP)
0079 #define IPCONFIG_RARP
0080 #endif
0081 #if defined(IPCONFIG_BOOTP) || defined(IPCONFIG_RARP)
0082 #define IPCONFIG_DYNAMIC
0083 #endif
0084
0085
0086 #define CONF_POST_OPEN 10
0087
0088
0089 #define CONF_OPEN_RETRIES 2
0090 #define CONF_SEND_RETRIES 6
0091 #define CONF_BASE_TIMEOUT (HZ*2)
0092 #define CONF_TIMEOUT_RANDOM (HZ)
0093 #define CONF_TIMEOUT_MULT *7/4
0094 #define CONF_TIMEOUT_MAX (HZ*30)
0095 #define CONF_NAMESERVERS_MAX 3
0096
0097 #define CONF_NTP_SERVERS_MAX 3
0098
0099 #define NONE cpu_to_be32(INADDR_NONE)
0100 #define ANY cpu_to_be32(INADDR_ANY)
0101
0102
0103 static unsigned int carrier_timeout = 120;
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113 int ic_set_manually __initdata = 0;
0114
0115 static int ic_enable __initdata;
0116
0117
0118 int ic_proto_enabled __initdata = 0
0119 #ifdef IPCONFIG_BOOTP
0120 | IC_BOOTP
0121 #endif
0122 #ifdef CONFIG_IP_PNP_DHCP
0123 | IC_USE_DHCP
0124 #endif
0125 #ifdef IPCONFIG_RARP
0126 | IC_RARP
0127 #endif
0128 ;
0129
0130 static int ic_host_name_set __initdata;
0131
0132 __be32 ic_myaddr = NONE;
0133 static __be32 ic_netmask = NONE;
0134 __be32 ic_gateway = NONE;
0135
0136 #ifdef IPCONFIG_DYNAMIC
0137 static __be32 ic_addrservaddr = NONE;
0138 #endif
0139
0140 __be32 ic_servaddr = NONE;
0141
0142 __be32 root_server_addr = NONE;
0143 u8 root_server_path[256] = { 0, };
0144
0145
0146 static char vendor_class_identifier[253] __initdata;
0147
0148 #if defined(CONFIG_IP_PNP_DHCP)
0149 static char dhcp_client_identifier[253] __initdata;
0150 #endif
0151
0152
0153
0154 #ifdef IPCONFIG_DYNAMIC
0155 static int ic_proto_used;
0156 #else
0157 #define ic_proto_used 0
0158 #endif
0159 static __be32 ic_nameservers[CONF_NAMESERVERS_MAX];
0160 static __be32 ic_ntp_servers[CONF_NTP_SERVERS_MAX];
0161 static u8 ic_domain[64];
0162
0163
0164
0165
0166
0167
0168 static char user_dev_name[IFNAMSIZ] __initdata = { 0, };
0169
0170
0171 static int ic_proto_have_if __initdata;
0172
0173
0174 static int ic_dev_mtu __initdata;
0175
0176 #ifdef IPCONFIG_DYNAMIC
0177 static DEFINE_SPINLOCK(ic_recv_lock);
0178 static volatile int ic_got_reply __initdata;
0179 #endif
0180 #ifdef IPCONFIG_DHCP
0181 static int ic_dhcp_msgtype __initdata;
0182 #endif
0183
0184
0185
0186
0187
0188
0189 struct ic_device {
0190 struct ic_device *next;
0191 struct net_device *dev;
0192 unsigned short flags;
0193 short able;
0194 __be32 xid;
0195 };
0196
0197 static struct ic_device *ic_first_dev __initdata;
0198 static struct ic_device *ic_dev __initdata;
0199
0200 static bool __init ic_is_init_dev(struct net_device *dev)
0201 {
0202 if (dev->flags & IFF_LOOPBACK)
0203 return false;
0204 return user_dev_name[0] ? !strcmp(dev->name, user_dev_name) :
0205 (!(dev->flags & IFF_LOOPBACK) &&
0206 (dev->flags & (IFF_POINTOPOINT|IFF_BROADCAST)) &&
0207 strncmp(dev->name, "dummy", 5));
0208 }
0209
0210 static int __init ic_open_devs(void)
0211 {
0212 struct ic_device *d, **last;
0213 struct net_device *dev;
0214 unsigned short oflags;
0215 unsigned long start, next_msg;
0216
0217 last = &ic_first_dev;
0218 rtnl_lock();
0219
0220
0221 for_each_netdev(&init_net, dev) {
0222 if (!(dev->flags & IFF_LOOPBACK))
0223 continue;
0224 if (dev_change_flags(dev, dev->flags | IFF_UP, NULL) < 0)
0225 pr_err("IP-Config: Failed to open %s\n", dev->name);
0226 }
0227
0228 for_each_netdev(&init_net, dev) {
0229 if (ic_is_init_dev(dev)) {
0230 int able = 0;
0231 if (dev->mtu >= 364)
0232 able |= IC_BOOTP;
0233 else
0234 pr_warn("DHCP/BOOTP: Ignoring device %s, MTU %d too small\n",
0235 dev->name, dev->mtu);
0236 if (!(dev->flags & IFF_NOARP))
0237 able |= IC_RARP;
0238 able &= ic_proto_enabled;
0239 if (ic_proto_enabled && !able)
0240 continue;
0241 oflags = dev->flags;
0242 if (dev_change_flags(dev, oflags | IFF_UP, NULL) < 0) {
0243 pr_err("IP-Config: Failed to open %s\n",
0244 dev->name);
0245 continue;
0246 }
0247 if (!(d = kmalloc(sizeof(struct ic_device), GFP_KERNEL))) {
0248 rtnl_unlock();
0249 return -ENOMEM;
0250 }
0251 d->dev = dev;
0252 *last = d;
0253 last = &d->next;
0254 d->flags = oflags;
0255 d->able = able;
0256 if (able & IC_BOOTP)
0257 get_random_bytes(&d->xid, sizeof(__be32));
0258 else
0259 d->xid = 0;
0260 ic_proto_have_if |= able;
0261 pr_debug("IP-Config: %s UP (able=%d, xid=%08x)\n",
0262 dev->name, able, d->xid);
0263 }
0264 }
0265
0266
0267
0268
0269 rtnl_unlock();
0270
0271
0272 if (!ic_first_dev)
0273 goto have_carrier;
0274
0275
0276 start = jiffies;
0277 next_msg = start + msecs_to_jiffies(20000);
0278 while (time_before(jiffies, start +
0279 msecs_to_jiffies(carrier_timeout * 1000))) {
0280 int wait, elapsed;
0281
0282 rtnl_lock();
0283 for_each_netdev(&init_net, dev)
0284 if (ic_is_init_dev(dev) && netif_carrier_ok(dev)) {
0285 rtnl_unlock();
0286 goto have_carrier;
0287 }
0288 rtnl_unlock();
0289
0290 msleep(1);
0291
0292 if (time_before(jiffies, next_msg))
0293 continue;
0294
0295 elapsed = jiffies_to_msecs(jiffies - start);
0296 wait = (carrier_timeout * 1000 - elapsed + 500) / 1000;
0297 pr_info("Waiting up to %d more seconds for network.\n", wait);
0298 next_msg = jiffies + msecs_to_jiffies(20000);
0299 }
0300 have_carrier:
0301
0302 *last = NULL;
0303
0304 if (!ic_first_dev) {
0305 if (user_dev_name[0])
0306 pr_err("IP-Config: Device `%s' not found\n",
0307 user_dev_name);
0308 else
0309 pr_err("IP-Config: No network devices available\n");
0310 return -ENODEV;
0311 }
0312 return 0;
0313 }
0314
0315
0316
0317
0318 static void __init ic_close_devs(void)
0319 {
0320 struct net_device *selected_dev = ic_dev ? ic_dev->dev : NULL;
0321 struct ic_device *d, *next;
0322 struct net_device *dev;
0323
0324 rtnl_lock();
0325 next = ic_first_dev;
0326 while ((d = next)) {
0327 bool bring_down = (d != ic_dev);
0328 struct net_device *lower;
0329 struct list_head *iter;
0330
0331 next = d->next;
0332 dev = d->dev;
0333
0334 if (selected_dev) {
0335 netdev_for_each_lower_dev(selected_dev, lower, iter) {
0336 if (dev == lower) {
0337 bring_down = false;
0338 break;
0339 }
0340 }
0341 }
0342 if (bring_down) {
0343 pr_debug("IP-Config: Downing %s\n", dev->name);
0344 dev_change_flags(dev, d->flags, NULL);
0345 }
0346 kfree(d);
0347 }
0348 rtnl_unlock();
0349 }
0350
0351
0352
0353
0354
0355 static inline void
0356 set_sockaddr(struct sockaddr_in *sin, __be32 addr, __be16 port)
0357 {
0358 sin->sin_family = AF_INET;
0359 sin->sin_addr.s_addr = addr;
0360 sin->sin_port = port;
0361 }
0362
0363
0364
0365
0366
0367 static int __init ic_setup_if(void)
0368 {
0369 struct ifreq ir;
0370 struct sockaddr_in *sin = (void *) &ir.ifr_ifru.ifru_addr;
0371 int err;
0372
0373 memset(&ir, 0, sizeof(ir));
0374 strcpy(ir.ifr_ifrn.ifrn_name, ic_dev->dev->name);
0375 set_sockaddr(sin, ic_myaddr, 0);
0376 if ((err = devinet_ioctl(&init_net, SIOCSIFADDR, &ir)) < 0) {
0377 pr_err("IP-Config: Unable to set interface address (%d)\n",
0378 err);
0379 return -1;
0380 }
0381 set_sockaddr(sin, ic_netmask, 0);
0382 if ((err = devinet_ioctl(&init_net, SIOCSIFNETMASK, &ir)) < 0) {
0383 pr_err("IP-Config: Unable to set interface netmask (%d)\n",
0384 err);
0385 return -1;
0386 }
0387 set_sockaddr(sin, ic_myaddr | ~ic_netmask, 0);
0388 if ((err = devinet_ioctl(&init_net, SIOCSIFBRDADDR, &ir)) < 0) {
0389 pr_err("IP-Config: Unable to set interface broadcast address (%d)\n",
0390 err);
0391 return -1;
0392 }
0393
0394
0395
0396
0397 if (ic_dev_mtu != 0) {
0398 rtnl_lock();
0399 if ((err = dev_set_mtu(ic_dev->dev, ic_dev_mtu)) < 0)
0400 pr_err("IP-Config: Unable to set interface mtu to %d (%d)\n",
0401 ic_dev_mtu, err);
0402 rtnl_unlock();
0403 }
0404 return 0;
0405 }
0406
0407 static int __init ic_setup_routes(void)
0408 {
0409
0410
0411 if (ic_gateway != NONE) {
0412 struct rtentry rm;
0413 int err;
0414
0415 memset(&rm, 0, sizeof(rm));
0416 if ((ic_gateway ^ ic_myaddr) & ic_netmask) {
0417 pr_err("IP-Config: Gateway not on directly connected network\n");
0418 return -1;
0419 }
0420 set_sockaddr((struct sockaddr_in *) &rm.rt_dst, 0, 0);
0421 set_sockaddr((struct sockaddr_in *) &rm.rt_genmask, 0, 0);
0422 set_sockaddr((struct sockaddr_in *) &rm.rt_gateway, ic_gateway, 0);
0423 rm.rt_flags = RTF_UP | RTF_GATEWAY;
0424 if ((err = ip_rt_ioctl(&init_net, SIOCADDRT, &rm)) < 0) {
0425 pr_err("IP-Config: Cannot add default route (%d)\n",
0426 err);
0427 return -1;
0428 }
0429 }
0430
0431 return 0;
0432 }
0433
0434
0435
0436
0437
0438 static int __init ic_defaults(void)
0439 {
0440
0441
0442
0443
0444
0445 if (!ic_host_name_set)
0446 sprintf(init_utsname()->nodename, "%pI4", &ic_myaddr);
0447
0448 if (root_server_addr == NONE)
0449 root_server_addr = ic_servaddr;
0450
0451 if (ic_netmask == NONE) {
0452 if (IN_CLASSA(ntohl(ic_myaddr)))
0453 ic_netmask = htonl(IN_CLASSA_NET);
0454 else if (IN_CLASSB(ntohl(ic_myaddr)))
0455 ic_netmask = htonl(IN_CLASSB_NET);
0456 else if (IN_CLASSC(ntohl(ic_myaddr)))
0457 ic_netmask = htonl(IN_CLASSC_NET);
0458 else if (IN_CLASSE(ntohl(ic_myaddr)))
0459 ic_netmask = htonl(IN_CLASSE_NET);
0460 else {
0461 pr_err("IP-Config: Unable to guess netmask for address %pI4\n",
0462 &ic_myaddr);
0463 return -1;
0464 }
0465 pr_notice("IP-Config: Guessing netmask %pI4\n",
0466 &ic_netmask);
0467 }
0468
0469 return 0;
0470 }
0471
0472
0473
0474
0475
0476 #ifdef IPCONFIG_RARP
0477
0478 static int ic_rarp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev);
0479
0480 static struct packet_type rarp_packet_type __initdata = {
0481 .type = cpu_to_be16(ETH_P_RARP),
0482 .func = ic_rarp_recv,
0483 };
0484
0485 static inline void __init ic_rarp_init(void)
0486 {
0487 dev_add_pack(&rarp_packet_type);
0488 }
0489
0490 static inline void __init ic_rarp_cleanup(void)
0491 {
0492 dev_remove_pack(&rarp_packet_type);
0493 }
0494
0495
0496
0497
0498 static int __init
0499 ic_rarp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
0500 {
0501 struct arphdr *rarp;
0502 unsigned char *rarp_ptr;
0503 __be32 sip, tip;
0504 unsigned char *tha;
0505 struct ic_device *d;
0506
0507 if (!net_eq(dev_net(dev), &init_net))
0508 goto drop;
0509
0510 skb = skb_share_check(skb, GFP_ATOMIC);
0511 if (!skb)
0512 return NET_RX_DROP;
0513
0514 if (!pskb_may_pull(skb, sizeof(struct arphdr)))
0515 goto drop;
0516
0517
0518 rarp = (struct arphdr *)skb_transport_header(skb);
0519
0520
0521
0522
0523 if (rarp->ar_hln != dev->addr_len || dev->type != ntohs(rarp->ar_hrd))
0524 goto drop;
0525
0526
0527 if (rarp->ar_op != htons(ARPOP_RREPLY))
0528 goto drop;
0529
0530
0531 if (rarp->ar_pro != htons(ETH_P_IP))
0532 goto drop;
0533
0534 if (!pskb_may_pull(skb, arp_hdr_len(dev)))
0535 goto drop;
0536
0537
0538 rarp = (struct arphdr *)skb_transport_header(skb);
0539 rarp_ptr = (unsigned char *) (rarp + 1);
0540
0541
0542 spin_lock(&ic_recv_lock);
0543
0544
0545 if (ic_got_reply)
0546 goto drop_unlock;
0547
0548
0549 d = ic_first_dev;
0550 while (d && d->dev != dev)
0551 d = d->next;
0552 if (!d)
0553 goto drop_unlock;
0554
0555
0556 rarp_ptr += dev->addr_len;
0557 memcpy(&sip, rarp_ptr, 4);
0558 rarp_ptr += 4;
0559 tha = rarp_ptr;
0560 rarp_ptr += dev->addr_len;
0561 memcpy(&tip, rarp_ptr, 4);
0562
0563
0564 if (memcmp(tha, dev->dev_addr, dev->addr_len))
0565 goto drop_unlock;
0566
0567
0568 if (ic_servaddr != NONE && ic_servaddr != sip)
0569 goto drop_unlock;
0570
0571
0572 ic_dev = d;
0573 if (ic_myaddr == NONE)
0574 ic_myaddr = tip;
0575 ic_servaddr = sip;
0576 ic_addrservaddr = sip;
0577 ic_got_reply = IC_RARP;
0578
0579 drop_unlock:
0580
0581 spin_unlock(&ic_recv_lock);
0582
0583 drop:
0584
0585 kfree_skb(skb);
0586 return 0;
0587 }
0588
0589
0590
0591
0592
0593 static void __init ic_rarp_send_if(struct ic_device *d)
0594 {
0595 struct net_device *dev = d->dev;
0596 arp_send(ARPOP_RREQUEST, ETH_P_RARP, 0, dev, 0, NULL,
0597 dev->dev_addr, dev->dev_addr);
0598 }
0599 #endif
0600
0601
0602
0603
0604 static inline void __init ic_nameservers_predef(void)
0605 {
0606 int i;
0607
0608 for (i = 0; i < CONF_NAMESERVERS_MAX; i++)
0609 ic_nameservers[i] = NONE;
0610 }
0611
0612
0613 static inline void __init ic_ntp_servers_predef(void)
0614 {
0615 int i;
0616
0617 for (i = 0; i < CONF_NTP_SERVERS_MAX; i++)
0618 ic_ntp_servers[i] = NONE;
0619 }
0620
0621
0622
0623
0624
0625 #ifdef IPCONFIG_BOOTP
0626
0627 struct bootp_pkt {
0628 struct iphdr iph;
0629 struct udphdr udph;
0630 u8 op;
0631 u8 htype;
0632 u8 hlen;
0633 u8 hops;
0634 __be32 xid;
0635 __be16 secs;
0636 __be16 flags;
0637 __be32 client_ip;
0638 __be32 your_ip;
0639 __be32 server_ip;
0640 __be32 relay_ip;
0641 u8 hw_addr[16];
0642 u8 serv_name[64];
0643 u8 boot_file[128];
0644 u8 exten[312];
0645 };
0646
0647
0648 #define BOOTP_REQUEST 1
0649 #define BOOTP_REPLY 2
0650
0651
0652 #define DHCPDISCOVER 1
0653 #define DHCPOFFER 2
0654 #define DHCPREQUEST 3
0655 #define DHCPDECLINE 4
0656 #define DHCPACK 5
0657 #define DHCPNAK 6
0658 #define DHCPRELEASE 7
0659 #define DHCPINFORM 8
0660
0661 static int ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev);
0662
0663 static struct packet_type bootp_packet_type __initdata = {
0664 .type = cpu_to_be16(ETH_P_IP),
0665 .func = ic_bootp_recv,
0666 };
0667
0668
0669
0670
0671
0672 static const u8 ic_bootp_cookie[4] = { 99, 130, 83, 99 };
0673
0674 #ifdef IPCONFIG_DHCP
0675
0676 static void __init
0677 ic_dhcp_init_options(u8 *options, struct ic_device *d)
0678 {
0679 u8 mt = ((ic_servaddr == NONE)
0680 ? DHCPDISCOVER : DHCPREQUEST);
0681 u8 *e = options;
0682 int len;
0683
0684 pr_debug("DHCP: Sending message type %d (%s)\n", mt, d->dev->name);
0685
0686 memcpy(e, ic_bootp_cookie, 4);
0687 e += 4;
0688
0689 *e++ = 53;
0690 *e++ = 1;
0691 *e++ = mt;
0692
0693 if (mt == DHCPREQUEST) {
0694 *e++ = 54;
0695 *e++ = 4;
0696 memcpy(e, &ic_servaddr, 4);
0697 e += 4;
0698
0699 *e++ = 50;
0700 *e++ = 4;
0701 memcpy(e, &ic_myaddr, 4);
0702 e += 4;
0703 }
0704
0705
0706 {
0707 static const u8 ic_req_params[] = {
0708 1,
0709 3,
0710 6,
0711 12,
0712 15,
0713 17,
0714 26,
0715 40,
0716 42,
0717 };
0718
0719 *e++ = 55;
0720 *e++ = sizeof(ic_req_params);
0721 memcpy(e, ic_req_params, sizeof(ic_req_params));
0722 e += sizeof(ic_req_params);
0723
0724 if (ic_host_name_set) {
0725 *e++ = 12;
0726 len = strlen(utsname()->nodename);
0727 *e++ = len;
0728 memcpy(e, utsname()->nodename, len);
0729 e += len;
0730 }
0731 if (*vendor_class_identifier) {
0732 pr_info("DHCP: sending class identifier \"%s\"\n",
0733 vendor_class_identifier);
0734 *e++ = 60;
0735 len = strlen(vendor_class_identifier);
0736 *e++ = len;
0737 memcpy(e, vendor_class_identifier, len);
0738 e += len;
0739 }
0740 len = strlen(dhcp_client_identifier + 1);
0741
0742
0743
0744 if (len >= 1 && len < 312 - (e - options) - 1) {
0745 *e++ = 61;
0746 *e++ = len + 1;
0747 memcpy(e, dhcp_client_identifier, len + 1);
0748 e += len + 1;
0749 }
0750 }
0751
0752 *e++ = 255;
0753 }
0754
0755 #endif
0756
0757 static void __init ic_bootp_init_ext(u8 *e)
0758 {
0759 memcpy(e, ic_bootp_cookie, 4);
0760 e += 4;
0761 *e++ = 1;
0762 *e++ = 4;
0763 e += 4;
0764 *e++ = 3;
0765 *e++ = 4;
0766 e += 4;
0767 #if CONF_NAMESERVERS_MAX > 0
0768 *e++ = 6;
0769 *e++ = 4 * CONF_NAMESERVERS_MAX;
0770 e += 4 * CONF_NAMESERVERS_MAX;
0771 #endif
0772 *e++ = 12;
0773 *e++ = 32;
0774 e += 32;
0775 *e++ = 40;
0776 *e++ = 32;
0777 e += 32;
0778 *e++ = 17;
0779 *e++ = 40;
0780 e += 40;
0781
0782 *e++ = 57;
0783 *e++ = 2;
0784 *e++ = 1;
0785 *e++ = 150;
0786
0787 *e++ = 255;
0788 }
0789
0790
0791
0792
0793
0794 static inline void __init ic_bootp_init(void)
0795 {
0796
0797
0798
0799
0800
0801 ic_nameservers_predef();
0802 ic_ntp_servers_predef();
0803
0804 dev_add_pack(&bootp_packet_type);
0805 }
0806
0807
0808
0809
0810
0811 static inline void __init ic_bootp_cleanup(void)
0812 {
0813 dev_remove_pack(&bootp_packet_type);
0814 }
0815
0816
0817
0818
0819
0820 static void __init ic_bootp_send_if(struct ic_device *d, unsigned long jiffies_diff)
0821 {
0822 struct net_device *dev = d->dev;
0823 struct sk_buff *skb;
0824 struct bootp_pkt *b;
0825 struct iphdr *h;
0826 int hlen = LL_RESERVED_SPACE(dev);
0827 int tlen = dev->needed_tailroom;
0828
0829
0830 skb = alloc_skb(sizeof(struct bootp_pkt) + hlen + tlen + 15,
0831 GFP_KERNEL);
0832 if (!skb)
0833 return;
0834 skb_reserve(skb, hlen);
0835 b = skb_put_zero(skb, sizeof(struct bootp_pkt));
0836
0837
0838 skb_reset_network_header(skb);
0839 h = ip_hdr(skb);
0840 h->version = 4;
0841 h->ihl = 5;
0842 h->tot_len = htons(sizeof(struct bootp_pkt));
0843 h->frag_off = htons(IP_DF);
0844 h->ttl = 64;
0845 h->protocol = IPPROTO_UDP;
0846 h->daddr = htonl(INADDR_BROADCAST);
0847 h->check = ip_fast_csum((unsigned char *) h, h->ihl);
0848
0849
0850 b->udph.source = htons(68);
0851 b->udph.dest = htons(67);
0852 b->udph.len = htons(sizeof(struct bootp_pkt) - sizeof(struct iphdr));
0853
0854
0855
0856 b->op = BOOTP_REQUEST;
0857 if (dev->type < 256)
0858 b->htype = dev->type;
0859 else if (dev->type == ARPHRD_FDDI)
0860 b->htype = ARPHRD_ETHER;
0861 else {
0862 pr_warn("Unknown ARP type 0x%04x for device %s\n", dev->type,
0863 dev->name);
0864 b->htype = dev->type;
0865 }
0866
0867
0868 b->hlen = dev->addr_len;
0869 memcpy(b->hw_addr, dev->dev_addr, dev->addr_len);
0870 b->secs = htons(jiffies_diff / HZ);
0871 b->xid = d->xid;
0872
0873
0874 #ifdef IPCONFIG_DHCP
0875 if (ic_proto_enabled & IC_USE_DHCP)
0876 ic_dhcp_init_options(b->exten, d);
0877 else
0878 #endif
0879 ic_bootp_init_ext(b->exten);
0880
0881
0882 skb->dev = dev;
0883 skb->protocol = htons(ETH_P_IP);
0884 if (dev_hard_header(skb, dev, ntohs(skb->protocol),
0885 dev->broadcast, dev->dev_addr, skb->len) < 0) {
0886 kfree_skb(skb);
0887 printk("E");
0888 return;
0889 }
0890
0891 if (dev_queue_xmit(skb) < 0)
0892 printk("E");
0893 }
0894
0895
0896
0897
0898
0899 static int __init ic_bootp_string(char *dest, char *src, int len, int max)
0900 {
0901 if (!len)
0902 return 0;
0903 if (len > max-1)
0904 len = max-1;
0905 memcpy(dest, src, len);
0906 dest[len] = '\0';
0907 return 1;
0908 }
0909
0910
0911
0912
0913
0914 static void __init ic_do_bootp_ext(u8 *ext)
0915 {
0916 u8 servers;
0917 int i;
0918 __be16 mtu;
0919
0920 u8 *c;
0921
0922 pr_debug("DHCP/BOOTP: Got extension %d:", *ext);
0923 for (c=ext+2; c<ext+2+ext[1]; c++)
0924 pr_debug(" %02x", *c);
0925 pr_debug("\n");
0926
0927 switch (*ext++) {
0928 case 1:
0929 if (ic_netmask == NONE)
0930 memcpy(&ic_netmask, ext+1, 4);
0931 break;
0932 case 3:
0933 if (ic_gateway == NONE)
0934 memcpy(&ic_gateway, ext+1, 4);
0935 break;
0936 case 6:
0937 servers= *ext/4;
0938 if (servers > CONF_NAMESERVERS_MAX)
0939 servers = CONF_NAMESERVERS_MAX;
0940 for (i = 0; i < servers; i++) {
0941 if (ic_nameservers[i] == NONE)
0942 memcpy(&ic_nameservers[i], ext+1+4*i, 4);
0943 }
0944 break;
0945 case 12:
0946 if (!ic_host_name_set) {
0947 ic_bootp_string(utsname()->nodename, ext+1, *ext,
0948 __NEW_UTS_LEN);
0949 ic_host_name_set = 1;
0950 }
0951 break;
0952 case 15:
0953 if (!ic_domain[0])
0954 ic_bootp_string(ic_domain, ext+1, *ext, sizeof(ic_domain));
0955 break;
0956 case 17:
0957 if (!root_server_path[0])
0958 ic_bootp_string(root_server_path, ext+1, *ext,
0959 sizeof(root_server_path));
0960 break;
0961 case 26:
0962 memcpy(&mtu, ext+1, sizeof(mtu));
0963 ic_dev_mtu = ntohs(mtu);
0964 break;
0965 case 40:
0966 ic_bootp_string(utsname()->domainname, ext+1, *ext,
0967 __NEW_UTS_LEN);
0968 break;
0969 case 42:
0970 servers = *ext / 4;
0971 if (servers > CONF_NTP_SERVERS_MAX)
0972 servers = CONF_NTP_SERVERS_MAX;
0973 for (i = 0; i < servers; i++) {
0974 if (ic_ntp_servers[i] == NONE)
0975 memcpy(&ic_ntp_servers[i], ext+1+4*i, 4);
0976 }
0977 break;
0978 }
0979 }
0980
0981
0982
0983
0984
0985 static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
0986 {
0987 struct bootp_pkt *b;
0988 struct iphdr *h;
0989 struct ic_device *d;
0990 int len, ext_len;
0991
0992 if (!net_eq(dev_net(dev), &init_net))
0993 goto drop;
0994
0995
0996 if (skb->pkt_type == PACKET_OTHERHOST)
0997 goto drop;
0998
0999 skb = skb_share_check(skb, GFP_ATOMIC);
1000 if (!skb)
1001 return NET_RX_DROP;
1002
1003 if (!pskb_may_pull(skb,
1004 sizeof(struct iphdr) +
1005 sizeof(struct udphdr)))
1006 goto drop;
1007
1008 b = (struct bootp_pkt *)skb_network_header(skb);
1009 h = &b->iph;
1010
1011 if (h->ihl != 5 || h->version != 4 || h->protocol != IPPROTO_UDP)
1012 goto drop;
1013
1014
1015 if (ip_is_fragment(h)) {
1016 net_err_ratelimited("DHCP/BOOTP: Ignoring fragmented reply\n");
1017 goto drop;
1018 }
1019
1020 if (skb->len < ntohs(h->tot_len))
1021 goto drop;
1022
1023 if (ip_fast_csum((char *) h, h->ihl))
1024 goto drop;
1025
1026 if (b->udph.source != htons(67) || b->udph.dest != htons(68))
1027 goto drop;
1028
1029 if (ntohs(h->tot_len) < ntohs(b->udph.len) + sizeof(struct iphdr))
1030 goto drop;
1031
1032 len = ntohs(b->udph.len) - sizeof(struct udphdr);
1033 ext_len = len - (sizeof(*b) -
1034 sizeof(struct iphdr) -
1035 sizeof(struct udphdr) -
1036 sizeof(b->exten));
1037 if (ext_len < 0)
1038 goto drop;
1039
1040
1041 if (!pskb_may_pull(skb, skb->len))
1042 goto drop;
1043
1044 b = (struct bootp_pkt *)skb_network_header(skb);
1045 h = &b->iph;
1046
1047
1048 spin_lock(&ic_recv_lock);
1049
1050
1051 if (ic_got_reply)
1052 goto drop_unlock;
1053
1054
1055 d = ic_first_dev;
1056 while (d && d->dev != dev)
1057 d = d->next;
1058 if (!d)
1059 goto drop_unlock;
1060
1061
1062 if (b->op != BOOTP_REPLY ||
1063 b->xid != d->xid) {
1064 net_err_ratelimited("DHCP/BOOTP: Reply not for us on %s, op[%x] xid[%x]\n",
1065 d->dev->name, b->op, b->xid);
1066 goto drop_unlock;
1067 }
1068
1069
1070 if (ext_len >= 4 &&
1071 !memcmp(b->exten, ic_bootp_cookie, 4)) {
1072 u8 *end = (u8 *) b + ntohs(b->iph.tot_len);
1073 u8 *ext;
1074
1075 #ifdef IPCONFIG_DHCP
1076 if (ic_proto_enabled & IC_USE_DHCP) {
1077 __be32 server_id = NONE;
1078 int mt = 0;
1079
1080 ext = &b->exten[4];
1081 while (ext < end && *ext != 0xff) {
1082 u8 *opt = ext++;
1083 if (*opt == 0)
1084 continue;
1085 ext += *ext + 1;
1086 if (ext >= end)
1087 break;
1088 switch (*opt) {
1089 case 53:
1090 if (opt[1])
1091 mt = opt[2];
1092 break;
1093 case 54:
1094 if (opt[1] >= 4)
1095 memcpy(&server_id, opt + 2, 4);
1096 break;
1097 }
1098 }
1099
1100 pr_debug("DHCP: Got message type %d (%s)\n", mt, d->dev->name);
1101
1102 switch (mt) {
1103 case DHCPOFFER:
1104
1105
1106
1107 if (ic_myaddr != NONE)
1108 goto drop_unlock;
1109
1110
1111 ic_myaddr = b->your_ip;
1112 ic_servaddr = server_id;
1113 pr_debug("DHCP: Offered address %pI4 by server %pI4\n",
1114 &ic_myaddr, &b->iph.saddr);
1115
1116
1117
1118
1119 if ((server_id != NONE) &&
1120 (b->server_ip != server_id))
1121 b->server_ip = ic_servaddr;
1122 break;
1123
1124 case DHCPACK:
1125 if (memcmp(dev->dev_addr, b->hw_addr, dev->addr_len) != 0)
1126 goto drop_unlock;
1127
1128
1129 break;
1130
1131 default:
1132
1133 ic_myaddr = NONE;
1134 ic_servaddr = NONE;
1135 goto drop_unlock;
1136 }
1137
1138 ic_dhcp_msgtype = mt;
1139
1140 }
1141 #endif
1142
1143 ext = &b->exten[4];
1144 while (ext < end && *ext != 0xff) {
1145 u8 *opt = ext++;
1146 if (*opt == 0)
1147 continue;
1148 ext += *ext + 1;
1149 if (ext < end)
1150 ic_do_bootp_ext(opt);
1151 }
1152 }
1153
1154
1155 ic_dev = d;
1156 ic_myaddr = b->your_ip;
1157 ic_servaddr = b->server_ip;
1158 ic_addrservaddr = b->iph.saddr;
1159 if (ic_gateway == NONE && b->relay_ip)
1160 ic_gateway = b->relay_ip;
1161 if (ic_nameservers[0] == NONE)
1162 ic_nameservers[0] = ic_servaddr;
1163 ic_got_reply = IC_BOOTP;
1164
1165 drop_unlock:
1166
1167 spin_unlock(&ic_recv_lock);
1168
1169 drop:
1170
1171 kfree_skb(skb);
1172
1173 return 0;
1174 }
1175
1176
1177 #endif
1178
1179
1180
1181
1182
1183
1184 #ifdef IPCONFIG_DYNAMIC
1185
1186 static int __init ic_dynamic(void)
1187 {
1188 int retries;
1189 struct ic_device *d;
1190 unsigned long start_jiffies, timeout, jiff;
1191 int do_bootp = ic_proto_have_if & IC_BOOTP;
1192 int do_rarp = ic_proto_have_if & IC_RARP;
1193
1194
1195
1196
1197
1198
1199 if (!ic_proto_enabled) {
1200 pr_err("IP-Config: Incomplete network configuration information\n");
1201 return -1;
1202 }
1203
1204 #ifdef IPCONFIG_BOOTP
1205 if ((ic_proto_enabled ^ ic_proto_have_if) & IC_BOOTP)
1206 pr_err("DHCP/BOOTP: No suitable device found\n");
1207 #endif
1208 #ifdef IPCONFIG_RARP
1209 if ((ic_proto_enabled ^ ic_proto_have_if) & IC_RARP)
1210 pr_err("RARP: No suitable device found\n");
1211 #endif
1212
1213 if (!ic_proto_have_if)
1214
1215 return -1;
1216
1217
1218
1219
1220 #ifdef IPCONFIG_BOOTP
1221 if (do_bootp)
1222 ic_bootp_init();
1223 #endif
1224 #ifdef IPCONFIG_RARP
1225 if (do_rarp)
1226 ic_rarp_init();
1227 #endif
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237 pr_notice("Sending %s%s%s requests .",
1238 do_bootp
1239 ? ((ic_proto_enabled & IC_USE_DHCP) ? "DHCP" : "BOOTP") : "",
1240 (do_bootp && do_rarp) ? " and " : "",
1241 do_rarp ? "RARP" : "");
1242
1243 start_jiffies = jiffies;
1244 d = ic_first_dev;
1245 retries = CONF_SEND_RETRIES;
1246 get_random_bytes(&timeout, sizeof(timeout));
1247 timeout = CONF_BASE_TIMEOUT + (timeout % (unsigned int) CONF_TIMEOUT_RANDOM);
1248 for (;;) {
1249 #ifdef IPCONFIG_BOOTP
1250 if (do_bootp && (d->able & IC_BOOTP))
1251 ic_bootp_send_if(d, jiffies - start_jiffies);
1252 #endif
1253 #ifdef IPCONFIG_RARP
1254 if (do_rarp && (d->able & IC_RARP))
1255 ic_rarp_send_if(d);
1256 #endif
1257
1258 if (!d->next) {
1259 jiff = jiffies + timeout;
1260 while (time_before(jiffies, jiff) && !ic_got_reply)
1261 schedule_timeout_uninterruptible(1);
1262 }
1263 #ifdef IPCONFIG_DHCP
1264
1265 if ((ic_got_reply & IC_BOOTP) &&
1266 (ic_proto_enabled & IC_USE_DHCP) &&
1267 ic_dhcp_msgtype != DHCPACK) {
1268 ic_got_reply = 0;
1269
1270 d = ic_dev;
1271 pr_cont(",");
1272 continue;
1273 }
1274 #endif
1275
1276 if (ic_got_reply) {
1277 pr_cont(" OK\n");
1278 break;
1279 }
1280
1281 if ((d = d->next))
1282 continue;
1283
1284 if (! --retries) {
1285 pr_cont(" timed out!\n");
1286 break;
1287 }
1288
1289 d = ic_first_dev;
1290
1291 timeout = timeout CONF_TIMEOUT_MULT;
1292 if (timeout > CONF_TIMEOUT_MAX)
1293 timeout = CONF_TIMEOUT_MAX;
1294
1295 pr_cont(".");
1296 }
1297
1298 #ifdef IPCONFIG_BOOTP
1299 if (do_bootp)
1300 ic_bootp_cleanup();
1301 #endif
1302 #ifdef IPCONFIG_RARP
1303 if (do_rarp)
1304 ic_rarp_cleanup();
1305 #endif
1306
1307 if (!ic_got_reply) {
1308 ic_myaddr = NONE;
1309 return -1;
1310 }
1311
1312 pr_info("IP-Config: Got %s answer from %pI4, my address is %pI4\n",
1313 ((ic_got_reply & IC_RARP) ? "RARP"
1314 : (ic_proto_enabled & IC_USE_DHCP) ? "DHCP" : "BOOTP"),
1315 &ic_addrservaddr, &ic_myaddr);
1316
1317 return 0;
1318 }
1319
1320 #endif
1321
1322 #ifdef CONFIG_PROC_FS
1323
1324 static struct proc_dir_entry *ipconfig_dir;
1325
1326
1327 static int pnp_seq_show(struct seq_file *seq, void *v)
1328 {
1329 int i;
1330
1331 if (ic_proto_used & IC_PROTO)
1332 seq_printf(seq, "#PROTO: %s\n",
1333 (ic_proto_used & IC_RARP) ? "RARP"
1334 : (ic_proto_used & IC_USE_DHCP) ? "DHCP" : "BOOTP");
1335 else
1336 seq_puts(seq, "#MANUAL\n");
1337
1338 if (ic_domain[0])
1339 seq_printf(seq,
1340 "domain %s\n", ic_domain);
1341 for (i = 0; i < CONF_NAMESERVERS_MAX; i++) {
1342 if (ic_nameservers[i] != NONE)
1343 seq_printf(seq, "nameserver %pI4\n",
1344 &ic_nameservers[i]);
1345 }
1346 if (ic_servaddr != NONE)
1347 seq_printf(seq, "bootserver %pI4\n",
1348 &ic_servaddr);
1349 return 0;
1350 }
1351
1352
1353 static int __init ipconfig_proc_net_init(void)
1354 {
1355 ipconfig_dir = proc_net_mkdir(&init_net, "ipconfig", init_net.proc_net);
1356 if (!ipconfig_dir)
1357 return -ENOMEM;
1358
1359 return 0;
1360 }
1361
1362
1363 static int ipconfig_proc_net_create(const char *name,
1364 const struct proc_ops *proc_ops)
1365 {
1366 char *pname;
1367 struct proc_dir_entry *p;
1368
1369 if (!ipconfig_dir)
1370 return -ENOMEM;
1371
1372 pname = kasprintf(GFP_KERNEL, "%s%s", "ipconfig/", name);
1373 if (!pname)
1374 return -ENOMEM;
1375
1376 p = proc_create(pname, 0444, init_net.proc_net, proc_ops);
1377 kfree(pname);
1378 if (!p)
1379 return -ENOMEM;
1380
1381 return 0;
1382 }
1383
1384
1385 static int ntp_servers_show(struct seq_file *seq, void *v)
1386 {
1387 int i;
1388
1389 for (i = 0; i < CONF_NTP_SERVERS_MAX; i++) {
1390 if (ic_ntp_servers[i] != NONE)
1391 seq_printf(seq, "%pI4\n", &ic_ntp_servers[i]);
1392 }
1393 return 0;
1394 }
1395 DEFINE_PROC_SHOW_ATTRIBUTE(ntp_servers);
1396 #endif
1397
1398
1399
1400
1401
1402
1403 __be32 __init root_nfs_parse_addr(char *name)
1404 {
1405 __be32 addr;
1406 int octets = 0;
1407 char *cp, *cq;
1408
1409 cp = cq = name;
1410 while (octets < 4) {
1411 while (*cp >= '0' && *cp <= '9')
1412 cp++;
1413 if (cp == cq || cp - cq > 3)
1414 break;
1415 if (*cp == '.' || octets == 3)
1416 octets++;
1417 if (octets < 4)
1418 cp++;
1419 cq = cp;
1420 }
1421 if (octets == 4 && (*cp == ':' || *cp == '\0')) {
1422 if (*cp == ':')
1423 *cp++ = '\0';
1424 addr = in_aton(name);
1425 memmove(name, cp, strlen(cp) + 1);
1426 } else
1427 addr = NONE;
1428
1429 return addr;
1430 }
1431
1432 #define DEVICE_WAIT_MAX 12
1433
1434 static int __init wait_for_devices(void)
1435 {
1436 int i;
1437 bool try_init_devs = true;
1438
1439 for (i = 0; i < DEVICE_WAIT_MAX; i++) {
1440 struct net_device *dev;
1441 int found = 0;
1442
1443
1444 wait_for_device_probe();
1445
1446 rtnl_lock();
1447 for_each_netdev(&init_net, dev) {
1448 if (ic_is_init_dev(dev)) {
1449 found = 1;
1450 break;
1451 }
1452 }
1453 rtnl_unlock();
1454 if (found)
1455 return 0;
1456 if (try_init_devs &&
1457 (ROOT_DEV == Root_NFS || ROOT_DEV == Root_CIFS)) {
1458 try_init_devs = false;
1459 wait_for_init_devices_probe();
1460 }
1461 ssleep(1);
1462 }
1463 return -ENODEV;
1464 }
1465
1466
1467
1468
1469
1470 static int __init ip_auto_config(void)
1471 {
1472 __be32 addr;
1473 #ifdef IPCONFIG_DYNAMIC
1474 int retries = CONF_OPEN_RETRIES;
1475 #endif
1476 int err;
1477 unsigned int i, count;
1478
1479
1480
1481
1482
1483 if (ic_set_manually == 0) {
1484 ic_nameservers_predef();
1485 ic_ntp_servers_predef();
1486 }
1487
1488 #ifdef CONFIG_PROC_FS
1489 proc_create_single("pnp", 0444, init_net.proc_net, pnp_seq_show);
1490
1491 if (ipconfig_proc_net_init() == 0)
1492 ipconfig_proc_net_create("ntp_servers", &ntp_servers_proc_ops);
1493 #endif
1494
1495 if (!ic_enable)
1496 return 0;
1497
1498 pr_debug("IP-Config: Entered.\n");
1499 #ifdef IPCONFIG_DYNAMIC
1500 try_try_again:
1501 #endif
1502
1503 err = wait_for_devices();
1504 if (err)
1505 return err;
1506
1507
1508 err = ic_open_devs();
1509 if (err)
1510 return err;
1511
1512
1513 msleep(CONF_POST_OPEN);
1514
1515
1516
1517
1518
1519
1520
1521 if (ic_myaddr == NONE ||
1522 #if defined(CONFIG_ROOT_NFS) || defined(CONFIG_CIFS_ROOT)
1523 (root_server_addr == NONE &&
1524 ic_servaddr == NONE &&
1525 (ROOT_DEV == Root_NFS || ROOT_DEV == Root_CIFS)) ||
1526 #endif
1527 ic_first_dev->next) {
1528 #ifdef IPCONFIG_DYNAMIC
1529 if (ic_dynamic() < 0) {
1530 ic_close_devs();
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546 #ifdef CONFIG_ROOT_NFS
1547 if (ROOT_DEV == Root_NFS) {
1548 pr_err("IP-Config: Retrying forever (NFS root)...\n");
1549 goto try_try_again;
1550 }
1551 #endif
1552 #ifdef CONFIG_CIFS_ROOT
1553 if (ROOT_DEV == Root_CIFS) {
1554 pr_err("IP-Config: Retrying forever (CIFS root)...\n");
1555 goto try_try_again;
1556 }
1557 #endif
1558
1559 if (--retries) {
1560 pr_err("IP-Config: Reopening network devices...\n");
1561 goto try_try_again;
1562 }
1563
1564
1565 pr_err("IP-Config: Auto-configuration of network failed\n");
1566 return -1;
1567 }
1568 #else
1569 pr_err("IP-Config: Incomplete network configuration information\n");
1570 ic_close_devs();
1571 return -1;
1572 #endif
1573 } else {
1574
1575 ic_dev = ic_first_dev;
1576 }
1577
1578 addr = root_nfs_parse_addr(root_server_path);
1579 if (root_server_addr == NONE)
1580 root_server_addr = addr;
1581
1582
1583
1584
1585 if (ic_defaults() < 0)
1586 return -1;
1587
1588
1589
1590
1591 #ifdef IPCONFIG_DYNAMIC
1592 ic_proto_used = ic_got_reply | (ic_proto_enabled & IC_USE_DHCP);
1593 #endif
1594
1595 #ifndef IPCONFIG_SILENT
1596
1597
1598
1599 pr_info("IP-Config: Complete:\n");
1600
1601 pr_info(" device=%s, hwaddr=%*phC, ipaddr=%pI4, mask=%pI4, gw=%pI4\n",
1602 ic_dev->dev->name, ic_dev->dev->addr_len, ic_dev->dev->dev_addr,
1603 &ic_myaddr, &ic_netmask, &ic_gateway);
1604 pr_info(" host=%s, domain=%s, nis-domain=%s\n",
1605 utsname()->nodename, ic_domain, utsname()->domainname);
1606 pr_info(" bootserver=%pI4, rootserver=%pI4, rootpath=%s",
1607 &ic_servaddr, &root_server_addr, root_server_path);
1608 if (ic_dev_mtu)
1609 pr_cont(", mtu=%d", ic_dev_mtu);
1610
1611 for (i = 0, count = 0; i < CONF_NAMESERVERS_MAX; i++) {
1612 if (ic_nameservers[i] != NONE) {
1613 if (i == 0)
1614 pr_info(" nameserver%u=%pI4",
1615 i, &ic_nameservers[i]);
1616 else
1617 pr_cont(", nameserver%u=%pI4",
1618 i, &ic_nameservers[i]);
1619
1620 count++;
1621 }
1622 if ((i + 1 == CONF_NAMESERVERS_MAX) && count > 0)
1623 pr_cont("\n");
1624 }
1625
1626 for (i = 0, count = 0; i < CONF_NTP_SERVERS_MAX; i++) {
1627 if (ic_ntp_servers[i] != NONE) {
1628 if (i == 0)
1629 pr_info(" ntpserver%u=%pI4",
1630 i, &ic_ntp_servers[i]);
1631 else
1632 pr_cont(", ntpserver%u=%pI4",
1633 i, &ic_ntp_servers[i]);
1634
1635 count++;
1636 }
1637 if ((i + 1 == CONF_NTP_SERVERS_MAX) && count > 0)
1638 pr_cont("\n");
1639 }
1640 #endif
1641
1642
1643
1644
1645
1646 if (ic_setup_if() < 0 || ic_setup_routes() < 0)
1647 err = -1;
1648 else
1649 err = 0;
1650
1651 ic_close_devs();
1652
1653 return err;
1654 }
1655
1656 late_initcall(ip_auto_config);
1657
1658
1659
1660
1661
1662
1663 static int __init ic_proto_name(char *name)
1664 {
1665 if (!strcmp(name, "on") || !strcmp(name, "any")) {
1666 return 1;
1667 }
1668 if (!strcmp(name, "off") || !strcmp(name, "none")) {
1669 return 0;
1670 }
1671 #ifdef CONFIG_IP_PNP_DHCP
1672 else if (!strncmp(name, "dhcp", 4)) {
1673 char *client_id;
1674
1675 ic_proto_enabled &= ~IC_RARP;
1676 client_id = strstr(name, "dhcp,");
1677 if (client_id) {
1678 char *v;
1679
1680 client_id = client_id + 5;
1681 v = strchr(client_id, ',');
1682 if (!v)
1683 return 1;
1684 *v = 0;
1685 if (kstrtou8(client_id, 0, dhcp_client_identifier))
1686 pr_debug("DHCP: Invalid client identifier type\n");
1687 strncpy(dhcp_client_identifier + 1, v + 1, 251);
1688 *v = ',';
1689 }
1690 return 1;
1691 }
1692 #endif
1693 #ifdef CONFIG_IP_PNP_BOOTP
1694 else if (!strcmp(name, "bootp")) {
1695 ic_proto_enabled &= ~(IC_RARP | IC_USE_DHCP);
1696 return 1;
1697 }
1698 #endif
1699 #ifdef CONFIG_IP_PNP_RARP
1700 else if (!strcmp(name, "rarp")) {
1701 ic_proto_enabled &= ~(IC_BOOTP | IC_USE_DHCP);
1702 return 1;
1703 }
1704 #endif
1705 #ifdef IPCONFIG_DYNAMIC
1706 else if (!strcmp(name, "both")) {
1707 ic_proto_enabled &= ~IC_USE_DHCP;
1708 return 1;
1709 }
1710 #endif
1711 return 0;
1712 }
1713
1714 static int __init ip_auto_config_setup(char *addrs)
1715 {
1716 char *cp, *ip, *dp;
1717 int num = 0;
1718
1719 ic_set_manually = 1;
1720 ic_enable = 1;
1721
1722
1723
1724
1725
1726 if (ic_proto_name(addrs))
1727 return 1;
1728
1729
1730 if (*addrs == 0 ||
1731 strcmp(addrs, "off") == 0 ||
1732 strcmp(addrs, "none") == 0) {
1733 ic_enable = 0;
1734 return 1;
1735 }
1736
1737
1738 ic_nameservers_predef();
1739 ic_ntp_servers_predef();
1740
1741
1742 ip = addrs;
1743 while (ip && *ip) {
1744 if ((cp = strchr(ip, ':')))
1745 *cp++ = '\0';
1746 if (strlen(ip) > 0) {
1747 pr_debug("IP-Config: Parameter #%d: `%s'\n", num, ip);
1748 switch (num) {
1749 case 0:
1750 if ((ic_myaddr = in_aton(ip)) == ANY)
1751 ic_myaddr = NONE;
1752 break;
1753 case 1:
1754 if ((ic_servaddr = in_aton(ip)) == ANY)
1755 ic_servaddr = NONE;
1756 break;
1757 case 2:
1758 if ((ic_gateway = in_aton(ip)) == ANY)
1759 ic_gateway = NONE;
1760 break;
1761 case 3:
1762 if ((ic_netmask = in_aton(ip)) == ANY)
1763 ic_netmask = NONE;
1764 break;
1765 case 4:
1766 if ((dp = strchr(ip, '.'))) {
1767 *dp++ = '\0';
1768 strscpy(utsname()->domainname, dp,
1769 sizeof(utsname()->domainname));
1770 }
1771 strscpy(utsname()->nodename, ip,
1772 sizeof(utsname()->nodename));
1773 ic_host_name_set = 1;
1774 break;
1775 case 5:
1776 strscpy(user_dev_name, ip, sizeof(user_dev_name));
1777 break;
1778 case 6:
1779 if (ic_proto_name(ip) == 0 &&
1780 ic_myaddr == NONE) {
1781 ic_enable = 0;
1782 }
1783 break;
1784 case 7:
1785 if (CONF_NAMESERVERS_MAX >= 1) {
1786 ic_nameservers[0] = in_aton(ip);
1787 if (ic_nameservers[0] == ANY)
1788 ic_nameservers[0] = NONE;
1789 }
1790 break;
1791 case 8:
1792 if (CONF_NAMESERVERS_MAX >= 2) {
1793 ic_nameservers[1] = in_aton(ip);
1794 if (ic_nameservers[1] == ANY)
1795 ic_nameservers[1] = NONE;
1796 }
1797 break;
1798 case 9:
1799 if (CONF_NTP_SERVERS_MAX >= 1) {
1800 ic_ntp_servers[0] = in_aton(ip);
1801 if (ic_ntp_servers[0] == ANY)
1802 ic_ntp_servers[0] = NONE;
1803 }
1804 break;
1805 }
1806 }
1807 ip = cp;
1808 num++;
1809 }
1810
1811 return 1;
1812 }
1813 __setup("ip=", ip_auto_config_setup);
1814
1815 static int __init nfsaddrs_config_setup(char *addrs)
1816 {
1817 return ip_auto_config_setup(addrs);
1818 }
1819 __setup("nfsaddrs=", nfsaddrs_config_setup);
1820
1821 static int __init vendor_class_identifier_setup(char *addrs)
1822 {
1823 if (strscpy(vendor_class_identifier, addrs,
1824 sizeof(vendor_class_identifier))
1825 >= sizeof(vendor_class_identifier))
1826 pr_warn("DHCP: vendorclass too long, truncated to \"%s\"\n",
1827 vendor_class_identifier);
1828 return 1;
1829 }
1830 __setup("dhcpclass=", vendor_class_identifier_setup);
1831
1832 static int __init set_carrier_timeout(char *str)
1833 {
1834 ssize_t ret;
1835
1836 if (!str)
1837 return 0;
1838
1839 ret = kstrtouint(str, 0, &carrier_timeout);
1840 if (ret)
1841 return 0;
1842
1843 return 1;
1844 }
1845 __setup("carrier_timeout=", set_carrier_timeout);