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

📄 uip.lst

📁 移植uIP1.0到51单片机上的版本mcu_netV1.00 uIP ARP / ICMP / TCP协议的完全移植
💻 LST
📖 第 1 页 / 共 5 页
字号:
 263   3          }
 264   2        }
 265   1        
 266   1        
 267   1        if(uip_acc32[3] < (op16 & 0xff)) {
 268   2          /*++uip_acc32[2]; */
 269   2              uip_acc32[2] = uip_acc32[2] + 1;
 270   2          if(uip_acc32[2] == 0) {
 271   3            /* ++uip_acc32[1];  */
 272   3                uip_acc32[1] = uip_acc32[1] + 1;
 273   3            if(uip_acc32[1] == 0) {
 274   4                 /*++uip_acc32[0];*/
 275   4                 uip_acc32[0] = uip_acc32[0] + 1;
 276   4            }
 277   3          }
 278   2        }
 279   1      }
 280          
 281          #endif /* UIP_ARCH_ADD32 */
 282          
 283          #if ! UIP_ARCH_CHKSUM
 284          /*---------------------------------------------------------------------------*/
 285          /*data为C51的关键字,不能用作变量,需要修改。gateway*/
 286          static u16_t
 287          chksum(u16_t sum, const u8_t *pucdata, u16_t len)
 288          {
 289   1        u16_t t;
 290   1        const u8_t *dataptr;
 291   1        const u8_t *last_byte;
 292   1      
 293   1        dataptr = pucdata;
 294   1        last_byte = pucdata + len - 1;
 295   1        
 296   1        while(dataptr < last_byte) {  /* At least two more bytes */
 297   2          t = (dataptr[0] << 8) + dataptr[1];
 298   2          sum += t;
 299   2          if(sum < t) {
 300   3            sum++;            /* carry */
 301   3          }
 302   2          dataptr += 2;
C51 COMPILER V7.06   UIP                                                                   05/02/2009 15:51:22 PAGE 6   

 303   2        }
 304   1        
 305   1        if(dataptr == last_byte) {
 306   2          t = (dataptr[0] << 8) + 0;
 307   2          sum += t;
 308   2          if(sum < t) {
 309   3            sum++;            /* carry */
 310   3          }
 311   2        }
 312   1      
 313   1        /* Return sum in host byte order. */
 314   1        return sum;
 315   1      }
 316          /*---------------------------------------------------------------------------*/
 317          u16_t
 318          uip_chksum(u16_t *pucdata, u16_t len)
 319          {
 320   1        return htons(chksum(0, (u8_t *)pucdata, len));
 321   1      }
 322          /*---------------------------------------------------------------------------*/
 323          #ifndef UIP_ARCH_IPCHKSUM
 324          u16_t
 325          uip_ipchksum(void)
 326          {
 327   1        u16_t sum;
 328   1      
 329   1        sum = chksum(0, &uip_buf[UIP_LLH_LEN], UIP_IPH_LEN);
 330   1        DEBUG_PRINTF("uip_ipchksum: sum 0x%04x\n", sum);
 331   1        return (sum == 0) ? 0xffff : htons(sum);
 332   1      }
 333          #endif
 334          /*---------------------------------------------------------------------------*/
 335          static u16_t
 336          upper_layer_chksum(u8_t proto)
 337          {
 338   1        u16_t upper_layer_len;
 339   1        u16_t sum;
 340   1        
 341   1      #if UIP_CONF_IPV6
                upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]);
              #else /* UIP_CONF_IPV6 */
 344   1        upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - UIP_IPH_LEN;
 345   1      #endif /* UIP_CONF_IPV6 */
 346   1        
 347   1        /* First sum pseudoheader. */
 348   1        
 349   1        /* IP protocol and length fields. This addition cannot carry. */
 350   1        sum = upper_layer_len + proto;
 351   1        /* Sum IP source and destination addresses. */
 352   1        sum = chksum(sum, (u8_t *)&BUF->srcipaddr[0], 2 * sizeof(uip_ipaddr_t));
 353   1      
 354   1        /* Sum TCP header and data. */
 355   1        sum = chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN],
 356   1                     upper_layer_len);
 357   1          
 358   1        return (sum == 0) ? 0xffff : htons(sum);
 359   1      }
 360          /*---------------------------------------------------------------------------*/
 361          #if UIP_CONF_IPV6
              u16_t
              uip_icmp6chksum(void)
              {
C51 COMPILER V7.06   UIP                                                                   05/02/2009 15:51:22 PAGE 7   

                return upper_layer_chksum(UIP_PROTO_ICMP6);
                
              }
              #endif /* UIP_CONF_IPV6 */
 369          /*---------------------------------------------------------------------------*/
 370          u16_t
 371          uip_tcpchksum(void)
 372          {
 373   1        return upper_layer_chksum(UIP_PROTO_TCP);
 374   1      }
 375          /*---------------------------------------------------------------------------*/
 376          #if UIP_UDP_CHECKSUMS
 377          u16_t
 378          uip_udpchksum(void)
 379          {
 380   1        return upper_layer_chksum(UIP_PROTO_UDP);
 381   1      }
 382          #endif /* UIP_UDP_CHECKSUMS */
 383          #endif /* UIP_ARCH_CHKSUM */
 384          /*---------------------------------------------------------------------------*/
 385          void
 386          uip_init(void)
 387          {
 388   1        for(c = 0; c < UIP_LISTENPORTS; ++c) {
 389   2          uip_listenports[c] = 0;
 390   2        }
 391   1        for(c = 0; c < UIP_CONNS; ++c) {
 392   2          uip_conns[c].tcpstateflags = UIP_CLOSED;
 393   2        }
 394   1      #if UIP_ACTIVE_OPEN
                lastport = 1024;
              #endif /* UIP_ACTIVE_OPEN */
 397   1      
 398   1      #if UIP_UDP
                for(c = 0; c < UIP_UDP_CONNS; ++c) {
                  uip_udp_conns[c].lport = 0;
                }
              #endif /* UIP_UDP */
 403   1        
 404   1      
 405   1        /* IPv4 initialization. */
 406   1      #if UIP_FIXEDADDR == 0
 407   1        /*  uip_hostaddr[0] = uip_hostaddr[1] = 0;*/
 408   1      #endif /* UIP_FIXEDADDR */
 409   1      
 410   1      }
 411          /*---------------------------------------------------------------------------*/
 412          #if UIP_ACTIVE_OPEN
              struct uip_conn *
              uip_connect(uip_ipaddr_t *ripaddr, u16_t rport)
              {
                register struct uip_conn *conn, *cconn;
                
                /* Find an unused local port. */
               again:
                ++lastport;
              
                if(lastport >= 32000) {
                  lastport = 4096;
                }
              
                /* Check if this port is already in use, and if so try to find
C51 COMPILER V7.06   UIP                                                                   05/02/2009 15:51:22 PAGE 8   

                   another one. */
                for(c = 0; c < UIP_CONNS; ++c) {
                  conn = &uip_conns[c];
                  if(conn->tcpstateflags != UIP_CLOSED &&
                     conn->lport == htons(lastport)) {
                    goto again;
                  }
                }
              
                conn = 0;
                for(c = 0; c < UIP_CONNS; ++c) {
                  cconn = &uip_conns[c];
                  if(cconn->tcpstateflags == UIP_CLOSED) {
                    conn = cconn;
                    break;
                  }
                  if(cconn->tcpstateflags == UIP_TIME_WAIT) {
                    if(conn == 0 ||
                       cconn->timer > conn->timer) {
                      conn = cconn;
                    }
                  }
                }
              
                if(conn == 0) {
                  return 0;
                }
                
                conn->tcpstateflags = UIP_SYN_SENT;
              
                conn->snd_nxt[0] = iss[0];
                conn->snd_nxt[1] = iss[1];
                conn->snd_nxt[2] = iss[2];
                conn->snd_nxt[3] = iss[3];
              
                conn->initialmss = conn->mss = UIP_TCP_MSS;
                
                conn->len = 1;   /* TCP length of the SYN is one. */
                conn->nrtx = 0;
                conn->timer = 1; /* Send the SYN next time around. */
                conn->rto = UIP_RTO;
                conn->sa = 0;
                conn->sv = 16;   /* Initial value of the RTT variance. */
                conn->lport = htons(lastport);
                conn->rport = rport;
                uip_ipaddr_copy(&conn->ripaddr, ripaddr);
                
                return conn;
              }
              #endif /* UIP_ACTIVE_OPEN */
 477          /*---------------------------------------------------------------------------*/
 478          #if UIP_UDP
              struct uip_udp_conn *
              uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport)
              {
                register struct uip_udp_conn *conn;
                
                /* Find an unused local port. */
               again:
                ++lastport;
              
                if(lastport >= 32000) {
C51 COMPILER V7.06   UIP                                                                   05/02/2009 15:51:22 PAGE 9   

                  lastport = 4096;
                }
                
                for(c = 0; c < UIP_UDP_CONNS; ++c) {
                  if(uip_udp_conns[c].lport == htons(lastport)) {
                    goto again;
                  }
                }
              
              
                conn = 0;
                for(c = 0; c < UIP_UDP_CONNS; ++c) {
                  if(uip_udp_conns[c].lport == 0) {
                    conn = &uip_udp_conns[c];
                    break;
                  }
                }
              
                if(conn == 0) {
                  return 0;
                }
                
                conn->lport = HTONS(lastport);
                conn->rport = rport;
                if(ripaddr == NULL) {
                  memset(conn->ripaddr, 0, sizeof(uip_ipaddr_t));
                } else {
                  uip_ipaddr_copy(&conn->ripaddr, ripaddr);
                }
                conn->ttl = UIP_TTL;
                
                return conn;
              }
              #endif /* UIP_UDP */
 523          /*---------------------------------------------------------------------------*/
 524          void
 525          uip_unlisten(u16_t port)
 526          {
 527   1        for(c = 0; c < UIP_LISTENPORTS; ++c) {
 528   2          if(uip_listenports[c] == port) {
 529   3            uip_listenports[c] = 0;
 530   3            return;
 531   3          }
 532   2        }
 533   1      }
 534          /*---------------------------------------------------------------------------*/

⌨️ 快捷键说明

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