亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tcp.c

?? Redboot 源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
		BSPLOG(bsp_log("TCP_FLAG_RST rcvd\n"));
		do_reset(s);
		__pktbuf_free(pkt);
		return;
	    }

	    switch (s->state) {

	      case _SYN_SENT:
		/* active open not supported */
                  if (tcp->flags != (TCP_FLAG_SYN | TCP_FLAG_ACK)) {
                      do_reset(s);
                      __pktbuf_free(pkt);
                      return;
                  }
                  s->state = _ESTABLISHED;
                  s->ack = ntohl(tcp->seqnum) + 1;
                  s->seq = ntohl(tcp->acknum);
                  send_ack(s);
		break;

	      case _LISTEN:
		if (tcp->flags & TCP_FLAG_SYN) {
		    s->state = _SYN_RCVD;
		    s->ack = ntohl(tcp->seqnum) + 1;
		    s->his_port = ntohs(tcp->src_port);
		    memcpy(s->his_addr.ip_addr, r->ip_addr, sizeof(ip_addr_t));
		    s->data_bytes = 0;

		    BSPLOG(bsp_log("SYN from %d.%d.%d.%d:%d (seq %x)\n",
			       s->his_addr.ip_addr[0],s->his_addr.ip_addr[1],
			       s->his_addr.ip_addr[2],s->his_addr.ip_addr[3],
			       s->his_port, ntohl(tcp->seqnum)));

		    tcp_send(s, TCP_FLAG_SYN | TCP_FLAG_ACK, 0);
		}
		else
		    send_reset(pkt, r);
		break;

	      case _SYN_RCVD:
		BSPLOG(bsp_log("_SYN_RCVD timer cancel.\n"));
		__timer_cancel(&s->timer);

		/* go back to _LISTEN state if reset */
		if (tcp->flags & TCP_FLAG_RST) {
		    s->state = _LISTEN;

		    BSPLOG(bsp_log("_SYN_RCVD --> _LISTEN\n"));

		} else if (tcp->flags & TCP_FLAG_SYN) {
		    /* apparently our SYN/ACK was lost? */
		    tcp_send(s, 0, 1);

		    BSPLOG(bsp_log("retransmitting SYN/ACK\n"));

		} else if ((tcp->flags & TCP_FLAG_ACK) &&
			   ntohl(tcp->acknum) == (s->seq + 1)) {
		    /* we've established the connection */
		    s->state = _ESTABLISHED;
		    s->seq++;

		    BSPLOG(bsp_log("ACK received - connection established\n"));
		}
		break;

	      case _ESTABLISHED:
	      case _CLOSE_WAIT:
		ack = s->ack;  /* save original ack */
		if (tcp->flags & TCP_FLAG_ACK)
		    handle_ack(s, pkt);

		queued = handle_data(s, pkt);

		if ((tcp->flags & TCP_FLAG_FIN) &&
		    ntohl(tcp->seqnum) == s->ack) {

		    BSPLOG(bsp_log("FIN received - going to _CLOSE_WAIT\n"));

		    s->ack++;
		    s->state = _CLOSE_WAIT;
		}
		/*
		 * Send an ack if neccessary.
		 */
		if (s->ack != ack || pkt->pkt_bytes > (tcp->hdr_len << 2))
		    send_ack(s);
		break;

	      case _LAST_ACK:
		if (tcp->flags & TCP_FLAG_ACK) {
		    handle_ack(s, pkt);
		    if (ntohl(tcp->acknum) == (s->seq + 1)) {
			BSPLOG(bsp_log("_LAST_ACK --> _CLOSED\n"));
			s->state = _CLOSED;
			unlink_socket(s);
		    }
		}
		break;

	      case _FIN_WAIT_1:
		if (tcp->flags & TCP_FLAG_ACK) {
		    handle_ack(s, pkt);
		    if (ntohl(tcp->acknum) == (s->seq + 1)) {
			/* got ACK for FIN packet */
			s->seq++;
			if (tcp->flags & TCP_FLAG_FIN) {
			    BSPLOG(bsp_log("_FIN_WAIT_1 --> _TIME_WAIT\n"));
			    s->ack++;
			    s->state = _TIME_WAIT;
			    send_ack(s);
			} else {
			    s->state = _FIN_WAIT_2;
			    BSPLOG(bsp_log("_FIN_WAIT_1 --> _FIN_WAIT_2\n"));
			}
                        break; /* All done for now */
		    }
		}
                /* At this point, no ACK for FIN has been seen, so check for
                   simultaneous close */
		if (tcp->flags & TCP_FLAG_FIN) {
		    BSPLOG(bsp_log("_FIN_WAIT_1 --> _CLOSING\n"));
		    __timer_cancel(&s->timer);
		    s->ack++;
		    s->state = _CLOSING;
                    /* FIN is resent so the timeout and retry for this packet
                       will also take care of timeout and resend of the
                       previously sent FIN (which got us to FIN_WAIT_1). While
                       not technically correct, resending FIN only causes a
                       duplicate FIN (same sequence number) which should be
                       ignored by the other end. */
		    tcp_send(s, TCP_FLAG_FIN | TCP_FLAG_ACK, 0);
		}
		break;

	      case _FIN_WAIT_2:
		queued = handle_data(s, pkt);
		if (tcp->flags & TCP_FLAG_FIN) {
		    BSPLOG(bsp_log("_FIN_WAIT_2 --> _TIME_WAIT\n"));
		    s->ack++;
		    s->state = _TIME_WAIT;
		    send_ack(s);
		}
		break;

	      case _CLOSING:
		if (tcp->flags & TCP_FLAG_ACK) {
		    handle_ack(s, pkt);
		    if (ntohl(tcp->acknum) == (s->seq + 1)) {
			/* got ACK for FIN packet */
			BSPLOG(bsp_log("_CLOSING --> _TIME_WAIT\n"));
			__timer_cancel(&s->timer);
			s->state = _TIME_WAIT;
		    }
		}
		break;

	      case _TIME_WAIT:
		BSPLOG(bsp_log("_TIME_WAIT resend.\n"));
		if (tcp->flags & TCP_FLAG_FIN)
		    tcp_send(s, 0, 1); /* just resend ack */
		break;
	    }
	} else {
	    BSPLOG(bsp_log("Unexpected segment from: %d.%d.%d.%d:%d\n",
			   r->ip_addr[0], r->ip_addr[1], r->ip_addr[3],
			   r->ip_addr[4], ntohs(tcp->src_port)));
	    send_reset(pkt, r);
	}
    }
    if (!queued)
	__pktbuf_free(pkt);
}


void
__tcp_poll(void)
{
    __enet_poll();
    MS_TICKS_DELAY();
    __timer_poll();
}


int
__tcp_listen(tcp_socket_t *s, word port)
{
    BSPLOG(bsp_log("tcp_listen: s[%p] port[%x]\n", s, port));

    memset(s, 0, sizeof(tcp_socket_t));
    s->state    = _LISTEN;
    s->our_port = port;
    s->pkt.buf = (word *)s->pktbuf;
    s->pkt.bufsize = ETH_MAX_PKTLEN;
    s->pkt.ip_hdr  = (ip_header_t *)s->pkt.buf;
    s->pkt.tcp_hdr = (tcp_header_t *)(s->pkt.ip_hdr + 1);

    s->next = tcp_list;

#if 0
    /* limit to one open socket at a time */
    if (s->next) {
	BSPLOG(bsp_log("tcp_listen: recursion error\n"));
	BSPLOG(while(1));
    }
#endif
    
    tcp_list = s;

    return 0;
}

/*
 * SO_REUSEADDR, no 2MSL.
 */
void
__tcp_so_reuseaddr(tcp_socket_t *s)
{
//    BSPLOG(bsp_log("__tcp_so_reuseaddr.\n"));
    s->reuse = 0x01;
}

/*
 * Block while waiting for all data to be transmitted.
 */
void
__tcp_drain(tcp_socket_t *s)
{
//    BSPLOG(bsp_log("__tcp_drain.\n"));
    while (s->state != _CLOSED && s->data_bytes)
	__tcp_poll();
//    BSPLOG(bsp_log("__tcp_drain done.\n"));
}


/*
 * Close the tcp connection.
 */
static void
do_abort(void *s)
{
    BSPLOG(bsp_log("do_abort: send RST\n"));
    tcp_send((tcp_socket_t *)s, TCP_FLAG_ACK | TCP_FLAG_RST, 0);
    __timer_cancel(&abort_timer);
    ((tcp_socket_t *)s)->state = _CLOSED;
    free_rxlist((tcp_socket_t *)s);
    unlink_socket((tcp_socket_t *)s);
}

void
__tcp_abort(tcp_socket_t *s, unsigned long delay)
{
  __timer_set(&abort_timer, delay, do_abort, s);
}

/*
 * Close the tcp connection.
 */
void
__tcp_close(tcp_socket_t *s)
{
    __tcp_drain(s);
    if (s->state == _ESTABLISHED || s->state == _SYN_RCVD) {
	BSPLOG(bsp_log("__tcp_close: going to _FIN_WAIT_1\n"));
	s->state = _FIN_WAIT_1;
	tcp_send(s, TCP_FLAG_ACK | TCP_FLAG_FIN, 0);
    } else if (s->state == _CLOSE_WAIT) {

	BSPLOG(bsp_log("__tcp_close: going to _LAST_ACK\n"));

	s->state = _LAST_ACK;
	tcp_send(s, TCP_FLAG_ACK | TCP_FLAG_FIN, 0);
    }
    free_rxlist(s);
}


/*
 * Wait for connection to be fully closed.
 */
void
__tcp_close_wait(tcp_socket_t *s)
{
    BSPLOG(bsp_log("__tcp_close_wait.\n"));
    while (s->state != _CLOSED)
	__tcp_poll();
    BSPLOG(bsp_log("__tcp_close_wait done.\n"));
}


/*
 * Read up to 'len' bytes without blocking.
 */
int
__tcp_read(tcp_socket_t *s, char *buf, int len)
{
    int          nread;
    pktbuf_t     *pkt;
    tcp_header_t *tcp;

    if (len <= 0 || s->rxcnt == 0)
	return 0;

    if (s->state != _ESTABLISHED && s->rxcnt == 0)
	return -1;

    nread = 0;
    while (len) {
	if (len < s->rxcnt) {
	    memcpy(buf, s->rxptr, len);
	    BSPLOG(bsp_log("tcp_read: read %d bytes.\n", len));
	    s->rxptr += len;
	    s->rxcnt -= len;
	    nread    += len;

	    BSPLOG(bsp_log("tcp_read: %d bytes left in rxlist head.\n",
		       s->rxcnt));

	    break;
	} else {
	    memcpy(buf, s->rxptr, s->rxcnt);
	    BSPLOG(bsp_log("tcp_read: read %d bytes. pkt[%x] freed.\n",
			   s->rxcnt, s->rxlist));
	    nread += s->rxcnt;
	    buf   += s->rxcnt;
	    len   -= s->rxcnt;

	    /* setup for next packet in list */
	    pkt = s->rxlist;
	    s->rxlist = pkt->next;
	    __pktbuf_free(pkt);

	    if ((pkt = s->rxlist) != NULL) {
		tcp = pkt->tcp_hdr;
		s->rxcnt = pkt->pkt_bytes - (tcp->hdr_len << 2);
		s->rxptr = ((char *)tcp)  + (tcp->hdr_len << 2);

		BSPLOG(bsp_log("tcp_read: next pkt[%x] has %d bytes.\n",
			   s->rxlist, s->rxcnt));
	    } else {

		BSPLOG(bsp_log("tcp_read: no more data.\n"));

		s->rxcnt = 0;
		break;
	    }
	}
    }
    return nread;
}


/*
 * Write up to 'len' bytes without blocking
 */
int
__tcp_write(tcp_socket_t *s, char *buf, int len)
{
    tcp_header_t *tcp = s->pkt.tcp_hdr;

    if (len <= 0)
	return 0;

    if (s->state != _ESTABLISHED && s->state != _CLOSE_WAIT)
	return -1;

    if (s->data_bytes)
	return 0;

    if (len > MAX_TCP_DATA)
	len = MAX_TCP_DATA;

    memcpy(tcp + 1, buf, len);
    s->data_bytes = len;

    tcp_send(s, TCP_FLAG_ACK, 0);

    return len;
}

/*
 * Write 'len' bytes from 'buf', blocking until sent.
 * If connection collapses, return -1
 */
int
__tcp_write_block(tcp_socket_t *s, char *buf, int len)
{
    int total = 0;
    int n;

    while (len) {
        if (s->state == _CLOSE_WAIT) {
            // This connection is tring to close
            // This connection is breaking
            if (s->data_bytes == 0 && s->rxcnt == 0)
                __tcp_close(s);
        }
        if (s->state == _CLOSED) {
            // The connection is gone!
            return -1;
        }
        n = __tcp_write(s, buf, len);
        if (n > 0) {
            len -= n;
            buf += n;
        }
        __tcp_poll();
    }
    __tcp_drain(s);
    return total;
}

/*
 * Establish a new [outgoing] connection, with a timeout.
 */
int 
__tcp_open(tcp_socket_t *s, struct sockaddr_in *host, 
           word port, int timeout, int *err)
{
    // Fill in socket details
    memset(s, 0, sizeof(tcp_socket_t));
    s->state = _SYN_SENT;
    s->our_port = port;
    s->his_port = host->sin_port;
    s->pkt.buf = (word *)s->pktbuf;
    s->pkt.bufsize = ETH_MAX_PKTLEN;
    s->pkt.ip_hdr  = (ip_header_t *)s->pkt.buf;
    s->pkt.tcp_hdr = (tcp_header_t *)(s->pkt.ip_hdr + 1);
    s->seq = (port << 16) | 0xDE77;
    s->ack = 0;
    if (__arp_lookup((ip_addr_t *)&host->sin_addr, &s->his_addr) < 0) {
        diag_printf("%s: Can't find address of server\n", __FUNCTION__);
        return -1;
    }
    s->next = tcp_list;
    tcp_list = s;

    // Send off the SYN packet to open the connection
    tcp_send(s, TCP_FLAG_SYN, 0);
    // Wait for connection to establish
    while (s->state != _ESTABLISHED) {
        if (s->state == _CLOSED) {
            diag_printf("TCP open - host closed connection\n");
            return -1;
        }
        if (--timeout <= 0) {
            diag_printf("TCP open - connection timed out\n");
            return -1;
        }
        MS_TICKS_DELAY();
        __tcp_poll();
    }
    return 0;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美一区二区精品久导航| 欧美日韩久久久久久| 国产suv精品一区二区883| 99国产精品视频免费观看| 欧美日韩一卡二卡| 国产性做久久久久久| 亚洲一区二区三区激情| 国产一区二区不卡在线| 欧美午夜精品免费| 国产精品久久777777| 日韩精品一级二级| a亚洲天堂av| 久久综合九色综合久久久精品综合| 综合久久国产九一剧情麻豆| 乱中年女人伦av一区二区| 99久久精品国产导航| 亚洲与欧洲av电影| 欧美日本视频在线| 久久精品国产一区二区| 久久精品免费在线观看| 99久久精品免费| 天堂午夜影视日韩欧美一区二区| 日韩欧美一级精品久久| 亚洲综合清纯丝袜自拍| 欧美一级欧美三级| 亚洲人午夜精品天堂一二香蕉| 国产精品伊人色| 精品免费视频.| 久久精品国产99| 国产精品对白交换视频 | 91麻豆.com| 国产欧美1区2区3区| 色视频一区二区| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 国产一区二区三区黄视频| 国产精品丝袜一区| 国产成人午夜片在线观看高清观看| 91麻豆精品国产91久久久使用方法| 亚洲三级久久久| 日韩免费成人网| 99久久精品一区| 久久99国产精品尤物| 精品乱码亚洲一区二区不卡| av色综合久久天堂av综合| 日韩av成人高清| 欧美一级二级三级蜜桃| 久久精品国产亚洲a| 亚洲日本护士毛茸茸| ww亚洲ww在线观看国产| 精品视频999| 成人av资源站| 亚洲香肠在线观看| 欧美日韩在线播放三区四区| 懂色av一区二区三区免费看| 日韩国产在线一| 1024亚洲合集| 欧美唯美清纯偷拍| av网站免费线看精品| 国产在线视频精品一区| 亚洲高清久久久| 欧美精品一区二区三区高清aⅴ| 国产成人一级电影| 蜜臀a∨国产成人精品| xf在线a精品一区二区视频网站| 欧美日韩精品一区二区三区蜜桃 | 国产在线国偷精品产拍免费yy| 亚洲午夜激情av| 亚洲日穴在线视频| 国产精品水嫩水嫩| 国产欧美一区二区三区在线看蜜臀| 欧美一区二区黄| 欧美伦理影视网| 国产一区福利在线| 日韩**一区毛片| 日本美女一区二区| 天天操天天干天天综合网| 久久久高清一区二区三区| 色综合天天狠狠| 成人av在线看| av一区二区三区| 97国产精品videossex| 99re6这里只有精品视频在线观看| 国产成人免费在线| 国产成a人亚洲精品| 国产成人在线网站| 成人三级伦理片| 蜜臀国产一区二区三区在线播放| 午夜精品久久久久久久久久久| 亚洲综合免费观看高清完整版在线| 最新国产精品久久精品| 日韩久久一区二区| 依依成人综合视频| 五月开心婷婷久久| 亚洲成人在线免费| 日本一区二区三区dvd视频在线| 国产亚洲综合在线| 中文字幕不卡三区| 久久无码av三级| 国产日韩欧美麻豆| 1024成人网色www| 亚洲一区在线视频| 亚洲gay无套男同| 麻豆91免费观看| 国产一区二区毛片| 91在线丨porny丨国产| 欧美日韩一区二区三区高清| 欧美一卡二卡在线观看| 精品国产a毛片| 亚洲国产成人在线| 亚洲一区二区三区四区的| 日韩在线播放一区二区| 国产在线不卡一卡二卡三卡四卡| 国产99久久久国产精品潘金 | 色婷婷精品久久二区二区蜜臀av| 欧美日韩在线播放| 亚洲精品在线三区| 亚洲精品国产无套在线观| 男人的天堂亚洲一区| 亚洲高清免费观看| 九九视频精品免费| 91香蕉视频污在线| 日韩免费看的电影| 国产精品国产精品国产专区不片| 亚洲精品午夜久久久| 久久99国产精品麻豆| av中文字幕不卡| 日韩欧美在线不卡| 亚洲四区在线观看| 国产资源精品在线观看| 欧美最新大片在线看| 在线亚洲一区观看| 欧美优质美女网站| 久久麻豆一区二区| 亚洲va韩国va欧美va精品| 国产电影一区在线| 欧美日韩一级二级三级| 欧美国产乱子伦| 日韩有码一区二区三区| 99国产欧美久久久精品| 精品国产91九色蝌蚪| 亚洲国产成人porn| 99久久国产综合精品麻豆| 日韩一二在线观看| 亚洲综合色在线| jlzzjlzz欧美大全| 久久亚洲综合色| 奇米影视一区二区三区小说| 99免费精品在线观看| 久久久综合网站| 美女脱光内衣内裤视频久久网站| 在线免费视频一区二区| 中文字幕第一区综合| 国产精品2024| 久久久亚洲欧洲日产国码αv| 日韩中文字幕亚洲一区二区va在线 | 久久综合国产精品| 日本亚洲三级在线| 欧美三级视频在线观看| 成人欧美一区二区三区白人| 高清不卡在线观看| 久久久久久久久99精品| 久久国产成人午夜av影院| 欧美日韩成人在线一区| 亚洲午夜精品一区二区三区他趣| 99re在线视频这里只有精品| 国产精品久久久久一区二区三区共| 国产一区二区电影| 337p粉嫩大胆噜噜噜噜噜91av| 蜜桃在线一区二区三区| 欧美一二三区在线| 热久久免费视频| 91精品国产色综合久久| 免费三级欧美电影| 日韩片之四级片| 国内精品第一页| 久久婷婷成人综合色| 韩国av一区二区三区| 337p粉嫩大胆噜噜噜噜噜91av | 欧美大尺度电影在线| 久久精品国产精品亚洲综合| 日韩视频一区二区三区在线播放 | 国产精品美女久久久久久久久久久 | 欧美经典一区二区| 国产91丝袜在线播放| 国产精品视频一二三区| 99在线精品观看| 亚洲最色的网站| 国产精品18久久久久久久久久久久 | 久久国产欧美日韩精品| 久久一日本道色综合| 成人丝袜高跟foot| 亚洲欧美另类综合偷拍| 欧美日韩精品三区| 久久99精品国产麻豆不卡| 久久久久久影视| 99精品欧美一区二区蜜桃免费 | 一本一道波多野结衣一区二区| 亚洲一区二区三区四区在线观看| 欧美精品在线观看播放| 精品一区二区三区的国产在线播放|