DHCP block boot process

客戶經過command line "ip=dhcp"打開dhcp,可是在網線沒有鏈接的狀況下,dhcp阻塞了啓動過程。linux

就這個問題分析了$ksrc/net/ipv4/ipconfig.c,發現是由於其中retries被重複初始化,因此始終在retry hdcp。網絡

進一步的改善是,若是發現網線沒有鏈接的話,根本不運行dhcp,ide

!             for_each_netdev(&init_net, dev) {
!                 if( (strcmp(dev->name, "eth0") == 0) && (!netif_carrier_ok(dev)) )
!                 {
!                     printk("eth0: link down, do not run dhcp\n");
!                     return -1;
!                 }
!             }ui

另外,若是dhcp server不存在於網絡的話,嘗試鏈接的時間偏長,而源碼中甚至進行了2次嘗試。這種狀況應該只針對於ic eepro100,而咱們項目用的是ip3902,所以不須要作兩次嘗試。server

因此,綜合修改以下面的patch文件:ip

*** /home/qianjiang/pls/oceanblue/stb225/build_STB236_NANDflash_HDdecoding/packages/linux-2.6.24.7_nxp/net/ipv4/ipconfig.c    2008-11-27 16:31:47.000000000 +0800
--- ipconfig.c    2010-08-25 18:03:45.766316864 +0800
***************
*** 92,98 ****
--- 92,102 ----
  #define CONF_POST_OPEN        1    /* After opening: 1 second */
 
  /* Define the timeout for waiting for a DHCP/BOOTP/RARP reply */
+ #ifdef CONFIG_EEPRO100
  #define CONF_OPEN_RETRIES     2    /* (Re)open devices twice */
+ #else
+ #define CONF_OPEN_RETRIES    1
+ #endif
  #define CONF_SEND_RETRIES     6    /* Send six requests per open */
  #define CONF_INTER_TIMEOUT    (HZ/2)    /* Inter-device timeout: 1/2 second */
  #define CONF_BASE_TIMEOUT    (HZ*2)    /* Initial timeout: 2 seconds */
***************
*** 1264,1269 ****
--- 1268,1278 ----
  static int __init ip_auto_config(void)
  {
      __be32 addr;
+     struct net_device *dev;
+
+ #ifdef IPCONFIG_DYNAMIC
+     int retries = CONF_OPEN_RETRIES;
+ #endif
 
  #ifdef CONFIG_PROC_FS
      proc_net_fops_create(&init_net, "pnp", S_IRUGO, &pnp_seq_fops);
***************
*** 1272,1277 ****
--- 1281,1288 ----
      if (!ic_enable)
          return 0;
 
+
+
      DBG(("IP-Config: Entered.\n"));
  #ifdef IPCONFIG_DYNAMIC
   try_try_again:
***************
*** 1316,1322 ****
          ic_first_dev->next) {
  #ifdef IPCONFIG_DYNAMIC
 
!         int retries = CONF_OPEN_RETRIES;
 
          if (ic_dynamic() < 0) {
              ic_close_devs();
--- 1327,1339 ----
          ic_first_dev->next) {
  #ifdef IPCONFIG_DYNAMIC
 
!             for_each_netdev(&init_net, dev) {
!                 if( (strcmp(dev->name, "eth0") == 0) && (!netif_carrier_ok(dev)) )
!                 {
!                     printk("eth0: link down, do not run dhcp\n");
!                     return -1;
!                 }
!             }
 
          if (ic_dynamic() < 0) {
              ic_close_devs();
 源碼

相關文章
相關標籤/搜索