📄 uip.i
字号:
void *memchr(const void *, int, size_t);
# 167 "D:\\Program Files\\Analog Devices\\VisualDSP 4.5\\Blackfin\\include\\string.h"
# 70 "uip.c"
const u16 uip_hostaddr[2] =
{((((u16)(((172 << 8) | 25) & 0xff)) << 8) | ((((172 << 8) | 25) & 0xff00) >> 8)),
((((u16)(((5 << 8) | 100) & 0xff)) << 8) | ((((5 << 8) | 100) & 0xff00) >> 8))};
const u16 uip_arp_draddr[2] =
{((((u16)(((172 << 8) | 25) & 0xff)) << 8) | ((((172 << 8) | 25) & 0xff00) >> 8)),
((((u16)(((5 << 8) | 254) & 0xff)) << 8) | ((((5 << 8) | 254) & 0xff00) >> 8))};
const u16 uip_arp_netmask[2] =
{((((u16)(((255 << 8) | 255) & 0xff)) << 8) | ((((255 << 8) | 255) & 0xff00) >> 8)),
((((u16)(((255 << 8) | 0) & 0xff)) << 8) | ((((255 << 8) | 0) & 0xff00) >> 8))};
u8 uip_buf[1600+2];
volatile u8 *uip_appdata;
volatile unsigned int uip_appdata_length;
volatile u8 *uip_sappdata;
volatile u8 *uip_urgdata;
volatile u8 uip_urglen, uip_surglen;
volatile u16 uip_len, uip_slen;
volatile u8 uip_flags;
struct uip_conn *uip_conn;
struct uip_conn uip_conns[10];
u16 uip_listenports[10];
static u16 ipid;
static u8 iss[4];
static u16 lastport;
volatile u8 uip_acc32[4];
static u8 c, opt;
static u16 tmp16;
# 157 "uip.c"
struct uip_stats uip_stat;
# 181 "uip.c"
void
uip_init(void)
{
for(c = 0; c < 10; ++c) {
uip_listenports[c] = 0;
}
for(c = 0; c < 10; ++c) {
uip_conns[c].tcpstateflags = 0;
}
lastport = 1024;
}
struct uip_conn *
uip_connect(u16 *ripaddr, u16 rport)
{
register struct uip_conn *conn, *cconn;
again:
++lastport;
if(lastport >= 32000) {
lastport = 4096;
}
for(c = 0; c < 10; ++c) {
conn = &uip_conns[c];
if(conn->tcpstateflags != 0 &&
conn->lport == htons(lastport)) {
goto again;
}
}
conn = 0;
for(c = 0; c < 10; ++c) {
cconn = &uip_conns[c];
if(cconn->tcpstateflags == 0) {
conn = cconn;
break;
}
if(cconn->tcpstateflags == 7) {
if(conn == 0 ||
cconn->timer > uip_conn->timer) {
conn = cconn;
}
}
}
if(conn == 0) {
return 0;
}
conn->tcpstateflags = 2;
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 = (1600 - 14 - 40);
conn->len = 1;
conn->nrtx = 0;
conn->timer = 1;
conn->rto = 3;
conn->sa = 0;
conn->sv = 16;
conn->lport = htons(lastport);
conn->rport = rport;
conn->ripaddr[0] = ripaddr[0];
conn->ripaddr[1] = ripaddr[1];
return conn;
}
# 319 "uip.c"
void
uip_unlisten(u16 port)
{
for(c = 0; c < 10; ++c) {
if(uip_listenports[c] == port) {
uip_listenports[c] = 0;
return;
}
}
}
void
uip_listen(u16 port)
{
for(c = 0; c < 10; ++c) {
if(uip_listenports[c] == 0) {
uip_listenports[c] = port;
return;
}
}
}
# 474 "uip.c"
static void
uip_add_rcv_nxt(u16 n)
{
uip_add32(uip_conn->rcv_nxt, n);
uip_conn->rcv_nxt[0] = uip_acc32[0];
uip_conn->rcv_nxt[1] = uip_acc32[1];
uip_conn->rcv_nxt[2] = uip_acc32[2];
uip_conn->rcv_nxt[3] = uip_acc32[3];
}
void
uip_process(u8 flag)
{
int i,address_correction =0;
register struct uip_conn *uip_connr = uip_conn;
uip_appdata = &uip_buf[40 + 14];
uip_appdata_length = 40 + 14;
if(flag == 2) {
if(++iss[3] == 0) {
if(++iss[2] == 0) {
if(++iss[1] == 0) {
++iss[0];
}
}
}
uip_len = 0;
if(uip_connr->tcpstateflags == 7 ||
uip_connr->tcpstateflags == 5) {
++(uip_connr->timer);
if(uip_connr->timer == 120) {
uip_connr->tcpstateflags = 0;
}
} else if(uip_connr->tcpstateflags != 0) {
if(((uip_connr)->len)) {
if(uip_connr->timer-- == 0) {
if(uip_connr->nrtx == 8 ||
((uip_connr->tcpstateflags == 2 ||
uip_connr->tcpstateflags == 1) &&
uip_connr->nrtx == 3)) {
uip_connr->tcpstateflags = 0;
uip_flags = 128;
httpd_appcall();
((uip_tcpip_hdr *)&uip_buf[14])->flags = 0x04 | 0x10;
goto tcp_send_nodata;
}
uip_connr->timer = 3 << (uip_connr->nrtx > 4?
4:
uip_connr->nrtx);
++(uip_connr->nrtx);
++uip_stat . tcp . rexmit;
switch(uip_connr->tcpstateflags & 15) {
case 1:
goto tcp_send_synack;
case 2:
((uip_tcpip_hdr *)&uip_buf[14])->flags = 0;
goto tcp_send_syn;
case 3:
uip_len = 0;
uip_slen = 0;
uip_flags = 4;
httpd_appcall();
goto apprexmit;
case 4:
case 6:
case 8:
goto tcp_send_finack;
}
}
} else if((uip_connr->tcpstateflags & 15) == 3) {
uip_len = 0;
uip_slen = 0;
uip_flags = 8;
httpd_appcall();
goto appsend;
}
}
goto drop;
}
# 610 "uip.c"
++uip_stat . ip . recv;
if(((uip_tcpip_hdr *)&uip_buf[14])->vhl != 0x45) {
++uip_stat . ip . drop;
++uip_stat . ip . vhlerr;
;
goto drop;
}
if(((uip_tcpip_hdr *)&uip_buf[14])->len[0] != (uip_len >> 8)) {
uip_len = (uip_len & 0xff) | (((uip_tcpip_hdr *)&uip_buf[14])->len[0] << 8);
}
if(((uip_tcpip_hdr *)&uip_buf[14])->len[1] != (uip_len & 0xff)) {
uip_len = (uip_len & 0xff00) | ((uip_tcpip_hdr *)&uip_buf[14])->len[1];
}
if((((uip_tcpip_hdr *)&uip_buf[14])->ipoffset[0] & 0x3f) != 0 ||
((uip_tcpip_hdr *)&uip_buf[14])->ipoffset[1] != 0) {
# 645 "uip.c"
++uip_stat . ip . drop;
++uip_stat . ip . fragerr;
;
goto drop;
}
# 666 "uip.c"
if(((uip_tcpip_hdr *)&uip_buf[14])->destipaddr[0] != uip_hostaddr[0]) {
++uip_stat . ip . drop;
;
goto drop;
}
if(((uip_tcpip_hdr *)&uip_buf[14])->destipaddr[1] != uip_hostaddr[1]) {
++uip_stat . ip . drop;
;
goto drop;
}
if(uip_ipchksum() != 0xffff) {
++uip_stat . ip . drop;
++uip_stat . ip . chkerr;
;
goto drop;
}
if(((uip_tcpip_hdr *)&uip_buf[14])->proto == 6)
goto tcp_input;
if(((uip_tcpip_hdr *)&uip_buf[14])->proto != 1) {
++uip_stat . ip . drop;
++uip_stat . ip . protoerr;
;
goto drop;
}
icmp_input:
++uip_stat . icmp . recv;
if(((uip_icmpip_hdr *)&uip_buf[14])->type != 8) {
++uip_stat . icmp . drop;
++uip_stat . icmp . typeerr;
;
goto drop;
}
# 728 "uip.c"
((uip_icmpip_hdr *)&uip_buf[14])->type = 0;
if(((uip_icmpip_hdr *)&uip_buf[14])->icmpchksum >= ((((u16)((0xffff - (8 << 8)) & 0xff)) << 8) | (((0xffff - (8 << 8)) & 0xff00) >> 8))) {
((uip_icmpip_hdr *)&uip_buf[14])->icmpchksum += ((((u16)((8 << 8) & 0xff)) << 8) | (((8 << 8) & 0xff00) >> 8)) + 1;
} else {
((uip_icmpip_hdr *)&uip_buf[14])->icmpchksum += ((((u16)((8 << 8) & 0xff)) << 8) | (((8 << 8) & 0xff00) >> 8));
}
uip_appdata = &uip_buf[14 + 28];
uip_appdata_length = 14 + 28;
tmp16 = ((uip_tcpip_hdr *)&uip_buf[14])->destipaddr[0];
((uip_tcpip_hdr *)&uip_buf[14])->destipaddr[0] = ((uip_tcpip_hdr *)&uip_buf[14])->srcipaddr[0];
((uip_tcpip_hdr *)&uip_buf[14])->srcipaddr[0] = tmp16;
tmp16 = ((uip_tcpip_hdr *)&uip_buf[14])->destipaddr[1];
((uip_tcpip_hdr *)&uip_buf[14])->destipaddr[1] = ((uip_tcpip_hdr *)&uip_buf[14])->srcipaddr[1];
((uip_tcpip_hdr *)&uip_buf[14])->srcipaddr[1] = tmp16;
++uip_stat . icmp . sent;
goto send;
# 827 "uip.c"
tcp_input:
++uip_stat . tcp . recv;
if(uip_tcpchksum() != 0xffff) {
++uip_stat . tcp . drop;
++uip_stat . tcp . chkerr;
;
goto drop;
}
for(uip_connr = &uip_conns[0]; uip_connr < &uip_conns[10]; ++uip_connr) {
if(uip_connr->tcpstateflags != 0 &&
((uip_tcpip_hdr *)&uip_buf[14])->destport == uip_connr->lport &&
((uip_tcpip_hdr *)&uip_buf[14])->srcport == uip_connr->rport &&
((uip_tcpip_hdr *)&uip_buf[14])->srcipaddr[0] == uip_connr->ripaddr[0] &&
((uip_tcpip_hdr *)&uip_buf[14])->srcipaddr[1] == uip_connr->ripaddr[1]) {
goto found;
}
}
if((((uip_tcpip_hdr *)&uip_buf[14])->flags & 0x3f) != 0x02)
goto reset;
tmp16 = ((uip_tcpip_hdr *)&uip_buf[14])->destport;
for(c = 0; c < 10; ++c) {
if(tmp16 == uip_listenports[c])
goto found_listen;
}
++uip_stat . tcp . synrst;
reset:
if(((uip_tcpip_hdr *)&uip_buf[14])->flags & 0x04)
goto drop;
++uip_stat . tcp . rst;
((uip_tcpip_hdr *)&uip_buf[14])->flags = 0x04 | 0x10;
uip_len = 40;
((uip_tcpip_hdr *)&uip_buf[14])->tcpoffset = 5 << 4;
c = ((uip_tcpip_hdr *)&uip_buf[14])->seqno[3];
((uip_tcpip_hdr *)&uip_buf[14])->seqno[3] = ((uip_tcpip_hdr *)&uip_buf[14])->ackno[3];
((uip_tcpip_hdr *)&uip_buf[14])->ackno[3] = c;
c = ((uip_tcpip_hdr *)&uip_buf[14])->seqno[2];
((uip_tcpip_hdr *)&uip_buf[14])->seqno[2] = ((uip_tcpip_hdr *)&uip_buf[14])->ackno[2];
((uip_tcpip_hdr *)&uip_buf[14])->ackno[2] = c;
c = ((uip_tcpip_hdr *)&uip_buf[14])->seqno[1];
((uip_tcpip_hdr *)&uip_buf[14])->seqno[1] = ((uip_tcpip_hdr *)&uip_buf[14])->ackno[1];
((uip_tcpip_hdr *)&uip_buf[14])->ackno[1] = c;
c = ((uip_tcpip_hdr *)&uip_buf[14])->seqno[0];
((uip_tcpip_hdr *)&uip_buf[14])->seqno[0] = ((uip_tcpip_hdr *)&uip_buf[14])->ackno[0];
((uip_tcpip_hdr *)&uip_buf[14])->ackno[0] = c;
if(++((uip_tcpip_hdr *)&uip_buf[14])->ackno[3] == 0) {
if(++((uip_tcpip_hdr *)&uip_buf[14])->ackno[2] == 0) {
if(++((uip_tcpip_hdr *)&uip_buf[14])->ackno[1] == 0) {
++((uip_tcpip_hdr *)&uip_buf[14])->ackno[0];
}
}
}
tmp16 = ((uip_tcpip_hdr *)&uip_buf[14])->srcport;
((uip_tcpip_hdr *)&uip_buf[14])->srcport = ((uip_tcpip_hdr *)&uip_buf[14])->destport;
((uip_tcpip_hdr *)&uip_buf[14])->destport = tmp16;
tmp16 = ((uip_tcpip_hdr *)&uip_buf[14])->destipaddr[0];
((uip_tcpip_hdr *)&uip_buf[14])->destipaddr[0] = ((uip_tcpip_hdr *)&uip_buf[14])->srcipaddr[0];
((uip_tcpip_hdr *)&uip_buf[14])->srcipaddr[0] = tmp16;
tmp16 = ((uip_tcpip_hdr *)&uip_buf[14])->destipaddr[1];
((uip_tcpip_hdr *)&uip_buf[14])->destipaddr[1] = ((uip_tcpip_hdr *)&uip_buf[14])->srcipaddr[1];
((uip_tcpip_hdr *)&uip_buf[14])->srcipaddr[1] = tmp16;
goto tcp_send_noconn;
found_listen:
uip_connr = 0;
for(c = 0; c < 10; ++c) {
if(uip_conns[c].tcpstateflags == 0) {
uip_connr = &uip_conns[c];
break;
}
if(uip_conns[c].tcpstateflags == 7) {
if(uip_connr == 0 ||
uip_conns[c].timer > uip_connr->timer) {
uip_connr = &uip_conns[c];
}
}
}
if(uip_connr == 0) {
++uip_stat . tcp . syndrop;
;
goto drop;
}
uip_conn = uip_connr;
uip_connr->rto = uip_connr->timer = 3;
uip_connr->sa = 0;
uip_connr->sv = 4;
uip_connr->nrtx = 0;
uip_connr->lport = ((uip_tcpip_hdr *)&uip_buf[14])->destport;
uip_connr->rport = ((uip_tcpip_hdr *)&uip_buf[14])->srcport;
uip_connr->ripaddr[0] = ((uip_tcpip_hdr *)&uip_buf[14])->srcipaddr[0];
uip_connr->ripaddr[1] = ((uip_tcpip_hdr *)&uip_buf[14])->srcipaddr[1];
uip_connr->tcpstateflags = 1;
uip_connr->snd_nxt[0] = iss[0];
uip_connr->snd_nxt[1] = iss[1];
uip_connr->snd_nxt[2] = iss[2];
uip_connr->snd_nxt[3] = iss[3];
uip_connr->len = 1;
uip_connr->rcv_nxt[3] = ((uip_tcpip_hdr *)&uip_buf[14])->seqno[3];
uip_connr->rcv_nxt[2] = ((uip_tcpip_hdr *)&uip_buf[14])->seqno[2];
uip_connr->rcv_nxt[1] = ((uip_tcpip_hdr *)&uip_buf[14])->seqno[1];
uip_connr->rcv_nxt[0] = ((uip_tcpip_hdr *)&uip_buf[14])->seqno[0];
uip_add_rcv_nxt(1);
if((((uip_tcpip_hdr *)&uip_buf[14])->tcpoffset & 0xf0) > 0x50) {
for(c = 0; c < ((((uip_tcpip_hdr *)&uip_buf[14])->tcpoffset >> 4) - 5) << 2 ;) {
opt = uip_buf[40 + 14 + c];
if(opt == 0x00) {
break;
} else if(opt == 0x01) {
++c;
} else if(opt == 0x02 &&
uip_buf[40 + 14 + 1 + c] == 0x04) {
tmp16 = ((u16)uip_buf[40 + 14 + 2 + c] << 8) |
(u16)uip_buf[40 + 14 + 3 + c];
uip_connr->initialmss = uip_connr->mss =
tmp16 > (1600 - 14 - 40)? (1600 - 14 - 40): tmp16;
break;
} else {
if(uip_buf[40 + 14 + 1 + c] == 0) {
break;
}
c += uip_buf[40 + 14 + 1 + c];
}
}
}
tcp_send_synack:
((uip_tcpip_hdr *)&uip_buf[14])->flags = 0x10;
tcp_send_syn:
((uip_tcpip_hdr *)&uip_buf[14])->flags |= 0x02;
((uip_tcpip_hdr *)&uip_buf[14])->optdata[0] = 2;
((uip_tcpip_hdr *)&uip_buf[14])->optdata[1] = 4;
((uip_tcpip_hdr *)&uip_buf[14])->optdata[2] = ((1600 - 14 - 40)) / 256;
((uip_tcpip_hdr *)&uip_buf[14])->optdata[3] = ((1600 - 14 - 40)) & 255;
uip_len = 44;
((uip_tcpip_hdr *)&uip_buf[14])->tcpoffset = 6 << 4;
goto tcp_send;
found:
uip_conn = uip_connr;
uip_flags = 0;
if(((uip_tcpip_hdr *)&uip_buf[14])->flags & 0x04) {
uip_connr->tcpstateflags = 0;
;
uip_flags = 32;
httpd_appcall();
goto drop;
}
c = (((uip_tcpip_hdr *)&uip_buf[14])->tcpoffset >> 4) << 2;
uip_len = uip_len - c - 20;
if(uip_len > 0 &&
(((uip_tcpip_hdr *)&uip_buf[14])->seqno[0] != uip_connr->rcv_nxt[0] ||
((uip_tcpip_hdr *)&uip_buf[14])->seqno[1] != uip_connr->rcv_nxt[1] ||
((uip_tcpip_hdr *)&uip_buf[14])->seqno[2] != uip_connr->rcv_nxt[2] ||
((uip_tcpip_hdr *)&uip_buf[14])->seqno[3] != uip_connr->rcv_nxt[3])) {
goto tcp_send_ack;
}
if((((uip_tcpip_hdr *)&uip_buf[14])->flags & 0x10) && ((uip_connr)->len)) {
uip_add32(uip_connr->snd_nxt, uip_connr->len);
if(((uip_tcpip_hdr *)&uip_buf[14])->ackno[0] == uip_acc32[0] &&
((uip_tcpip_hdr *)&uip_buf[14])->ackno[1] == uip_acc32[1] &&
((uip_tcpip_hdr *)&uip_buf[14])->ackno[2] == uip_acc32[2] &&
((uip_tcpip_hdr *)&uip_buf[14])->ackno[3] == uip_acc32[3]) {
uip_connr->snd_nxt[0] = uip_acc32[0];
uip_connr->snd_nxt[1] = uip_acc32[1];
uip_connr->snd_nxt[2] = uip_acc32[2];
uip_connr->snd_nxt[3] = uip_acc32[3];
if(uip_connr->nrtx == 0) {
signed char m;
m = uip_connr->rto - uip_connr->timer;
m = m - (uip_connr->sa >> 3);
uip_connr->sa += m;
if(m < 0) {
m = -m;
}
m = m - (uip_connr->sv >> 2);
uip_connr->sv += m;
uip_connr->rto = (uip_connr->sa >> 3) + uip_connr->sv;
}
uip_flags = 1;
uip_connr->timer = uip_connr->rto;
}
}
switch(uip_connr->tcpstateflags & 15) {
case 1:
if(uip_flags & 1) {
uip_connr->tcpstateflags = 3;
uip_flags = 64;
uip_connr->len = 0;
if(uip_len > 0) {
uip_flags |= 2;
uip_add_rcv_nxt(uip_len);
}
uip_slen = 0;
httpd_appcall();
goto appsend;
}
goto drop;
case 2:
if((uip_flags & 1) &&
((uip_tcpip_hdr *)&uip_buf[14])->flags == (0x02 | 0x10)) {
if((((uip_tcpip_hdr *)&uip_buf[14])->tcpoffset & 0xf0) > 0x50) {
for(c = 0; c < ((((uip_tcpip_hdr *)&uip_buf[14])->tcpoffset >> 4) - 5) << 2 ;) {
opt = uip_buf[40 + 14 + c];
if(opt == 0x00) {
break;
} else if(opt == 0x01) {
++c;
} else if(opt == 0x02 &&
uip_buf[40 + 14 + 1 + c] == 0x04) {
tmp16 = (uip_buf[40 + 14 + 2 + c] << 8) |
uip_buf[40 + 14 + 3 + c];
uip_connr->initialmss =
uip_connr->mss = tmp16 > (1600 - 14 - 40)? (1600 - 14 - 40): tmp16;
break;
} else {
if(uip_buf[40 + 14 + 1 + c] == 0) {
break;
}
c += uip_buf[40 + 14 + 1 + c];
}
}
}
uip_connr->tcpstateflags = 3;
uip_connr->rcv_nxt[0] = ((uip_tcpip_hdr *)&uip_buf[14])->seqno[0];
uip_connr->rcv_nxt[1] = ((uip_tcpip_hdr *)&uip_buf[14])->seqno[1];
uip_connr->rcv_nxt[2] = ((uip_tcpip_hdr *)&uip_buf[14])->seqno[2];
uip_connr->rcv_nxt[3] = ((uip_tcpip_hdr *)&uip_buf[14])->seqno[3];
uip_add_rcv_nxt(1);
uip_flags = 64 | 2;
uip_connr->len = 0;
uip_len = 0;
uip_slen = 0;
httpd_appcall();
goto appsend;
}
goto reset;
case 3:
if(((uip_tcpip_hdr *)&uip_buf[14])->flags & 0x01) {
if(((uip_connr)->len)) {
goto drop;
}
uip_add_rcv_nxt(1 + uip_len);
uip_flags = 16;
if(uip_len > 0) {
uip_flags |= 2;
}
httpd_appcall();
uip_connr->len = 1;
uip_connr->tcpstateflags = 8;
uip_connr->nrtx = 0;
tcp_send_finack:
((uip_tcpip_hdr *)&uip_buf[14])->flags = 0x01 | 0x10;
goto tcp_send_nodata;
}
if(((uip_tcpip_hdr *)&uip_buf[14])->flags & 0x20) {
uip_urglen = (((uip_tcpip_hdr *)&uip_buf[14])->urgp[0] << 8) | ((uip_tcpip_hdr *)&uip_buf[14])->urgp[1];
if(uip_urglen > uip_len) {
uip_urglen = uip_len;
}
uip_add_rcv_nxt(uip_urglen);
uip_len -= uip_urglen;
uip_urgdata = uip_appdata;
uip_appdata += uip_urglen;
} else {
uip_urglen = 0;
uip_appdata += (((uip_tcpip_hdr *)&uip_buf[14])->urgp[0] << 8) | ((uip_tcpip_hdr *)&uip_buf[14])->urgp[1];
uip_len -= (((uip_tcpip_hdr *)&uip_buf[14])->urgp[0] << 8) | ((uip_tcpip_hdr *)&uip_buf[14])->urgp[1];
}
if(uip_len > 0 && !(uip_connr->tcpstateflags & 16)) {
uip_flags |= 2;
uip_add_rcv_nxt(uip_len);
}
tmp16 = ((u16)((uip_tcpip_hdr *)&uip_buf[14])->wnd[0] << 8) + (u16)((uip_tcpip_hdr *)&uip_buf[14])->wnd[1];
if(tmp16 > uip_connr->initialmss ||
tmp16 == 0) {
tmp16 = uip_connr->initialmss;
}
uip_connr->mss = tmp16;
if(uip_flags & (2 | 1)) {
uip_slen = 0;
httpd_appcall();
appsend:
if(uip_flags & 32) {
uip_slen = 0;
uip_connr->tcpstateflags = 0;
((uip_tcpip_hdr *)&uip_buf[14])->flags = 0x04 | 0x10;
goto tcp_send_nodata;
}
if(uip_flags & 16) {
uip_slen = 0;
uip_connr->len = 1;
uip_connr->tcpstateflags = 4;
uip_connr->nrtx = 0;
((uip_tcpip_hdr *)&uip_buf[14])->flags = 0x01 | 0x10;
goto tcp_send_nodata;
}
if(uip_slen > 0) {
if((uip_flags & 1) != 0) {
uip_connr->len = 0;
}
if(uip_connr->len == 0) {
if(uip_slen > uip_connr->mss) {
uip_slen = uip_connr->mss;
}
uip_connr->len = uip_slen;
} else {
uip_slen = uip_connr->len;
}
} else {
uip_connr->len = 0;
}
uip_connr->nrtx = 0;
apprexmit:
address_correction = (int)uip_sappdata;
if(address_correction&0x00000001){
address_correction -=1;
uip_sappdata = (u8 *)address_correction;
*uip_sappdata = 0;
uip_slen +=1;
}
__builtin_memcpy((void *)uip_appdata,(void *)uip_sappdata,uip_slen);
if(uip_slen > 0 && uip_connr->len > 0) {
uip_len = uip_connr->len + 40;
((uip_tcpip_hdr *)&uip_buf[14])->flags = 0x10 | 0x08;
goto tcp_send_noopts;
}
if(uip_flags & 2) {
uip_len = 40;
((uip_tcpip_hdr *)&uip_buf[14])->flags = 0x10;
goto tcp_send_noopts;
}
}
goto drop;
case 8:
if(uip_flags & 1) {
uip_connr->tcpstateflags = 0;
uip_flags = 16;
httpd_appcall();
}
break;
case 4:
if(uip_len > 0) {
uip_add_rcv_nxt(uip_len);
}
if(((uip_tcpip_hdr *)&uip_buf[14])->flags & 0x01) {
if(uip_flags & 1) {
uip_connr->tcpstateflags = 7;
uip_connr->timer = 0;
uip_connr->len = 0;
} else {
uip_connr->tcpstateflags = 6;
}
uip_add_rcv_nxt(1);
uip_flags = 16;
httpd_appcall();
goto tcp_send_ack;
} else if(uip_flags & 1) {
uip_connr->tcpstateflags = 5;
uip_connr->len = 0;
goto drop;
}
if(uip_len > 0) {
goto tcp_send_ack;
}
goto drop;
case 5:
if(uip_len > 0) {
uip_add_rcv_nxt(uip_len);
}
if(((uip_tcpip_hdr *)&uip_buf[14])->flags & 0x01) {
uip_connr->tcpstateflags = 7;
uip_connr->timer = 0;
uip_add_rcv_nxt(1);
uip_flags = 16;
httpd_appcall();
goto tcp_send_ack;
}
if(uip_len > 0) {
goto tcp_send_ack;
}
goto drop;
case 7:
goto tcp_send_ack;
case 6:
if(uip_flags & 1) {
uip_connr->tcpstateflags = 7;
uip_connr->timer = 0;
}
}
goto drop;
tcp_send_ack:
((uip_tcpip_hdr *)&uip_buf[14])->flags = 0x10;
tcp_send_nodata:
uip_len = 40;
tcp_send_noopts:
((uip_tcpip_hdr *)&uip_buf[14])->tcpoffset = 5 << 4;
tcp_send:
((uip_tcpip_hdr *)&uip_buf[14])->ackno[0] = uip_connr->rcv_nxt[0];
((uip_tcpip_hdr *)&uip_buf[14])->ackno[1] = uip_connr->rcv_nxt[1];
((uip_tcpip_hdr *)&uip_buf[14])->ackno[2] = uip_connr->rcv_nxt[2];
((uip_tcpip_hdr *)&uip_buf[14])->ackno[3] = uip_connr->rcv_nxt[3];
((uip_tcpip_hdr *)&uip_buf[14])->seqno[0] = uip_connr->snd_nxt[0];
((uip_tcpip_hdr *)&uip_buf[14])->seqno[1] = uip_connr->snd_nxt[1];
((uip_tcpip_hdr *)&uip_buf[14])->seqno[2] = uip_connr->snd_nxt[2];
((uip_tcpip_hdr *)&uip_buf[14])->seqno[3] = uip_connr->snd_nxt[3];
((uip_tcpip_hdr *)&uip_buf[14])->proto = 6;
((uip_tcpip_hdr *)&uip_buf[14])->srcport = uip_connr->lport;
((uip_tcpip_hdr *)&uip_buf[14])->destport = uip_connr->rport;
((uip_tcpip_hdr *)&uip_buf[14])->srcipaddr[0] = uip_hostaddr[0];
((uip_tcpip_hdr *)&uip_buf[14])->srcipaddr[1] = uip_hostaddr[1];
((uip_tcpip_hdr *)&uip_buf[14])->destipaddr[0] = uip_connr->ripaddr[0];
((uip_tcpip_hdr *)&uip_buf[14])->destipaddr[1] = uip_connr->ripaddr[1];
if(uip_connr->tcpstateflags & 16) {
((uip_tcpip_hdr *)&uip_buf[14])->wnd[0] = ((uip_tcpip_hdr *)&uip_buf[14])->wnd[1] = 0;
} else {
((uip_tcpip_hdr *)&uip_buf[14])->wnd[0] = ((32768) >> 8);
((uip_tcpip_hdr *)&uip_buf[14])->wnd[1] = ((32768) & 0xff);
}
tcp_send_noconn:
((uip_tcpip_hdr *)&uip_buf[14])->len[0] = (uip_len >> 8);
((uip_tcpip_hdr *)&uip_buf[14])->len[1] = (uip_len & 0xff);
((uip_tcpip_hdr *)&uip_buf[14])->tcpchksum = 0;
((uip_tcpip_hdr *)&uip_buf[14])->tcpchksum = ~(uip_tcpchksum());
ip_send_nolen:
((uip_tcpip_hdr *)&uip_buf[14])->vhl = 0x45;
((uip_tcpip_hdr *)&uip_buf[14])->tos = 0;
((uip_tcpip_hdr *)&uip_buf[14])->ipoffset[0] = ((uip_tcpip_hdr *)&uip_buf[14])->ipoffset[1] = 0;
((uip_tcpip_hdr *)&uip_buf[14])->ttl = 255;
++ipid;
((uip_tcpip_hdr *)&uip_buf[14])->ipid[0] = ipid >> 8;
((uip_tcpip_hdr *)&uip_buf[14])->ipid[1] = ipid & 0xff;
((uip_tcpip_hdr *)&uip_buf[14])->ipchksum = 0;
((uip_tcpip_hdr *)&uip_buf[14])->ipchksum = ~(uip_ipchksum());
++uip_stat . tcp . sent;
send:
++uip_stat . ip . sent;
STACK_BUSY = 1;
return;
drop:
STACK_BUSY = 0;
uip_len = 0;
return;
}
u16
htons(u16 val)
{
return ((((u16)((val) & 0xff)) << 8) | (((val) & 0xff00) >> 8));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -