⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dhcpc.lst

📁 c8051f020_uip1.0.rar
💻 LST
📖 第 1 页 / 共 2 页
字号:
 184   1      }
 185          /*---------------------------------------------------------------------------*/
 186          static void
 187          send_request(void)
 188          {
 189   1        u8_t *end;
 190   1        struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata;
 191   1      
 192   1        create_msg(m);
 193   1        
 194   1        end = add_msg_type(&m->options[4], DHCPREQUEST);
 195   1        end = add_server_id(end);
 196   1        end = add_req_ipaddr(end);
 197   1        end = add_end(end);
 198   1        
 199   1        uip_send(uip_appdata, end - (u8_t *)uip_appdata);
 200   1      }
 201          /*---------------------------------------------------------------------------*/
 202          static u8_t
 203          parse_options(u8_t *optptr, int len)
 204          {
 205   1        u8_t *end = optptr + len;
 206   1        u8_t type = 0;
 207   1      
 208   1        while(optptr < end) {
 209   2          switch(*optptr) {
 210   3          case DHCP_OPTION_SUBNET_MASK:
 211   3            memcpy(s.netmask, optptr + 2, 4);
 212   3            break;
 213   3          case DHCP_OPTION_ROUTER:
 214   3            memcpy(s.default_router, optptr + 2, 4);
 215   3            break;
 216   3          case DHCP_OPTION_DNS_SERVER:
 217   3            memcpy(s.dnsaddr, optptr + 2, 4);
 218   3            break;
 219   3          case DHCP_OPTION_MSG_TYPE:
 220   3            type = *(optptr + 2);
 221   3            break;
 222   3          case DHCP_OPTION_SERVER_ID:
 223   3            memcpy(s.serverid, optptr + 2, 4);
 224   3            break;
 225   3          case DHCP_OPTION_LEASE_TIME:
 226   3            memcpy(s.lease_time, optptr + 2, 4);
 227   3            break;
 228   3          case DHCP_OPTION_END:
 229   3            return type;
 230   3          }
 231   2      
 232   2          optptr += optptr[1] + 2;
 233   2        }
 234   1        return type;
 235   1      }
 236          /*---------------------------------------------------------------------------*/
 237          static u8_t
 238          parse_msg(void)
 239          {
C51 COMPILER V9.00   DHCPC                                                                 02/08/2010 20:58:33 PAGE 5   

 240   1        struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata;
 241   1        
 242   1        if(m->op == DHCP_REPLY &&
 243   1           memcmp(m->xid, xid, sizeof(xid)) == 0 &&
 244   1           memcmp(m->chaddr, s.mac_addr, s.mac_len) == 0) {
 245   2          memcpy(s.ipaddr, m->yiaddr, 4);
 246   2          return parse_options(&m->options[4], uip_datalen());
 247   2        }
 248   1        return 0;
 249   1      }
 250          /*---------------------------------------------------------------------------*/
 251          static
 252          PT_THREAD(handle_dhcp(void))
 253          {
 254   1        PT_BEGIN(&s.pt);
 255   3        
 256   3        /* try_again:*/
 257   3        s.state = STATE_SENDING;
 258   3        s.ticks = CLOCK_SECOND;
 259   3      
 260   3        do {
 261   4          send_discover();
 262   4          timer_set(&s.timer, s.ticks);
 263   4          PT_YIELD(&s.pt);
 264   4          PT_WAIT_UNTIL(&s.pt, uip_newdata() || timer_expired(&s.timer));
 265   4      
 266   4          if(uip_newdata() && parse_msg() == DHCPOFFER) {
 267   5            s.state = STATE_OFFER_RECEIVED;
 268   5            break;
 269   5          }
 270   4      
 271   4          if(s.ticks < CLOCK_SECOND * 60) {
 272   5            s.ticks *= 2;
 273   5          }
 274   4        } while(s.state != STATE_OFFER_RECEIVED);
 275   3        
 276   3        s.ticks = CLOCK_SECOND;
 277   3      
 278   3        do {
 279   4          send_request();
 280   4          timer_set(&s.timer, s.ticks);
 281   4          PT_YIELD(&s.pt);
 282   4          PT_WAIT_UNTIL(&s.pt, uip_newdata() || timer_expired(&s.timer));
 283   4      
 284   4          if(uip_newdata() && parse_msg() == DHCPACK) {
 285   5            s.state = STATE_CONFIG_RECEIVED;
 286   5            break;
 287   5          }
 288   4      
 289   4          if(s.ticks <= CLOCK_SECOND * 10) {
 290   5            s.ticks += CLOCK_SECOND;
 291   5          } else {
 292   5            PT_RESTART(&s.pt);
 293   5          }
 294   4        } while(s.state != STATE_CONFIG_RECEIVED);
 295   3        
 296   3      #if 0
                printf("Got IP address %d.%d.%d.%d\n",
                       uip_ipaddr1(s.ipaddr), uip_ipaddr2(s.ipaddr),
                       uip_ipaddr3(s.ipaddr), uip_ipaddr4(s.ipaddr));
                printf("Got netmask %d.%d.%d.%d\n",
                       uip_ipaddr1(s.netmask), uip_ipaddr2(s.netmask),
C51 COMPILER V9.00   DHCPC                                                                 02/08/2010 20:58:33 PAGE 6   

                       uip_ipaddr3(s.netmask), uip_ipaddr4(s.netmask));
                printf("Got DNS server %d.%d.%d.%d\n",
                       uip_ipaddr1(s.dnsaddr), uip_ipaddr2(s.dnsaddr),
                       uip_ipaddr3(s.dnsaddr), uip_ipaddr4(s.dnsaddr));
                printf("Got default router %d.%d.%d.%d\n",
                       uip_ipaddr1(s.default_router), uip_ipaddr2(s.default_router),
                       uip_ipaddr3(s.default_router), uip_ipaddr4(s.default_router));
                printf("Lease expires in %ld seconds\n",
                       ntohs(s.lease_time[0])*65536ul + ntohs(s.lease_time[1]));
              #endif
 312   3      
 313   3        dhcpc_configured(&s);
 314   3        
 315   3        /*  timer_stop(&s.timer);*/
 316   3      
 317   3        /*
 318   3         * PT_END restarts the thread so we do this instead. Eventually we
 319   3         * should reacquire expired leases here.
 320   3         */
 321   3        while(1) {
 322   4          PT_YIELD(&s.pt);
 323   4        }
 324   3      
 325   3        PT_END(&s.pt);
 326   1      }
 327          /*---------------------------------------------------------------------------*/
 328          void
 329          dhcpc_init(const void *mac_addr, int mac_len)
 330          {
 331   1        uip_ipaddr_t addr;
 332   1        
 333   1        s.mac_addr = mac_addr;
 334   1        s.mac_len  = mac_len;
 335   1      
 336   1        s.state = STATE_INITIAL;
 337   1        uip_ipaddr(addr, 255,255,255,255);
 338   1        s.conn = uip_udp_new(&addr, HTONS(DHCPC_SERVER_PORT));
*** WARNING C182 IN LINE 338 OF ..\UIP1.0\APPS\DHCPC\DHCPC.C: pointer to different objects
 339   1        if(s.conn != NULL) {
 340   2          uip_udp_bind(s.conn, HTONS(DHCPC_CLIENT_PORT));
 341   2        }
 342   1        PT_INIT(&s.pt);
 343   1      }
 344          /*---------------------------------------------------------------------------*/
 345          void
 346          dhcpc_appcall(void)
 347          {
 348   1        handle_dhcp();
 349   1      }
 350          /*---------------------------------------------------------------------------*/
 351          void
 352          dhcpc_request(void)
 353          { 
 354   1        u16_t ipaddr[2];      
 355   1        if(s.state == STATE_INITIAL) {
 356   2          uip_ipaddr(ipaddr, 0,0,0,0);
 357   2          uip_sethostaddr(ipaddr);
 358   2          /*    handle_dhcp(PROCESS_EVENT_NONE, NULL);*/
 359   2        }
 360   1      }
 361          /*---------------------------------------------------------------------------*/

C51 COMPILER V9.00   DHCPC                                                                 02/08/2010 20:58:33 PAGE 7   


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2102    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     49      49
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  1 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -