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

📄 uip.i

📁 实现在指定视频服务器下的视频点播
💻 I
📖 第 1 页 / 共 3 页
字号:
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 + -