📄 uip.lst
字号:
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 + -