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

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

?? tcp_output.c

?? vxwork源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
	/*	 * Grab a header mbuf, attaching a copy of data to	 * be transmitted, and initialize the header from	 * the template for sends on this connection.	 */	if (len) {		if (tp->t_force && len == 1)			tcpstat.tcps_sndprobe++;		else if (SEQ_LT(tp->snd_nxt, tp->snd_max)) {			tcpstat.tcps_sndrexmitpack++;			tcpstat.tcps_sndrexmitbyte += len;		} else {			tcpstat.tcps_sndpack++;			tcpstat.tcps_sndbyte += len;		}#ifdef notyet		if ((m = m_copypack(so->so_snd.sb_mb, off,		    (int)len, max_linkhdr + hdrlen)) == 0) {			error = ENOBUFS;			goto out;		}		/*		 * m_copypack left space for our hdr; use it.		 */		m->m_len += hdrlen;		m->m_data -= hdrlen;#else		/* allocates a small enough cluster for the header */		m = mHdrClGet(M_DONTWAIT, MT_HEADER, (max_linkhdr + hdrlen),			      TRUE);		if (m == NULL) {			error = ENOBUFS;			goto out;		}		m->m_data += max_linkhdr;		m->m_len  = hdrlen;		m->m_next = m_copy(so->so_snd.sb_mb, off, (int) len);		if (m->m_next == 0) {			(void) m_free(m);			error = ENOBUFS;			goto out;		}#endif		/*		 * If we're sending everything we've got, set PUSH.		 * (This will keep happy those implementations which only		 * give data to the user when a buffer fills or		 * a PUSH comes in.)		 */		if (off + len == so->so_snd.sb_cc)			flags |= TH_PUSH;	} else {		if (tp->t_flags & TF_ACKNOW)			tcpstat.tcps_sndacks++;		else if (flags & (TH_SYN|TH_FIN|TH_RST))			tcpstat.tcps_sndctrl++;		else if (SEQ_GT(tp->snd_up, tp->snd_una))			tcpstat.tcps_sndurg++;		else			tcpstat.tcps_sndwinup++;		/* allocates a small enough cluster for the header */		m = mHdrClGet(M_DONTWAIT, MT_HEADER, (max_linkhdr + hdrlen),			      TRUE);		if (m == NULL) {			error = ENOBUFS;			goto out;		}		m->m_data += max_linkhdr;		m->m_len = hdrlen;	}	m->m_pkthdr.rcvif = (struct ifnet *)0;	ti = mtod(m, struct tcpiphdr *);	if (tp->t_template == 0)            {#ifdef WV_INSTRUMENTATION#ifdef INCLUDE_WVNET    /* WV_NET_EMERGENCY event */        WV_NET_PORTOUT_EVENT_1 (NET_CORE_EVENT, WV_NET_EMERGENCY, 29, 2,                                tp->t_inpcb->inp_lport, tp->t_inpcb->inp_fport,                                WV_NETEVENT_TCPOUT_PANIC, WV_NET_SEND,                                so->so_fd)#endif  /* INCLUDE_WVNET */#endif            panic("tcp_output");            }	bcopy((caddr_t)mtod(tp->t_template, struct tcpiphdr *), (caddr_t)ti, 	      sizeof (struct tcpiphdr));	/*	 * Fill in fields, remembering maximum advertised	 * window for use in delaying messages about window sizes.	 * If resending a FIN, be sure not to use a new sequence number.	 */	if (flags & TH_FIN && tp->t_flags & TF_SENTFIN && 	    tp->snd_nxt == tp->snd_max)		tp->snd_nxt--;	/*	 * If we are doing retransmissions, then snd_nxt will	 * not reflect the first unsent octet.  For ACK only	 * packets, we do not want the sequence number of the	 * retransmitted packet, we want the sequence number	 * of the next unsent octet.  So, if there is no data	 * (and no SYN or FIN), use snd_max instead of snd_nxt	 * when filling in ti_seq.  But if we are in persist	 * state, snd_max might reflect one byte beyond the	 * right edge of the window, so use snd_nxt in that	 * case, since we know we aren't doing a retransmission.	 * (retransmit and persist are mutually exclusive...)	 */	if (len || (flags & (TH_SYN|TH_FIN)) || tp->t_timer[TCPT_PERSIST])		ti->ti_seq = htonl(tp->snd_nxt);	else		ti->ti_seq = htonl(tp->snd_max);	ti->ti_ack = htonl(tp->rcv_nxt);	if (optlen) {		bcopy((caddr_t)opt, (caddr_t)(ti + 1), optlen);		ti->ti_off = (sizeof (struct tcphdr) + optlen) >> 2;	}	ti->ti_flags = flags;	/*	 * Calculate receive window.  Don't shrink window,	 * but avoid silly window syndrome.	 */	if (win < (long)(so->so_rcv.sb_hiwat / 4) && win < (long)tp->t_maxseg)		win = 0;	if (win > (long)TCP_MAXWIN << tp->rcv_scale)		win = (long)TCP_MAXWIN << tp->rcv_scale;	if (win < (long)(tp->rcv_adv - tp->rcv_nxt))		win = (long)(tp->rcv_adv - tp->rcv_nxt);	ti->ti_win = htons((u_short) (win>>tp->rcv_scale));	if (SEQ_GT(tp->snd_up, tp->snd_nxt)) {		ti->ti_urp = htons((u_short)(tp->snd_up - tp->snd_nxt));		ti->ti_flags |= TH_URG;	} else		/*		 * If no urgent pointer to send, then we pull		 * the urgent pointer to the left edge of the send window		 * so that it doesn't drift into the send window on sequence		 * number wraparound.		 */		tp->snd_up = tp->snd_una;		/* drag it along */	/*	 * Put TCP length in extended header, and then	 * checksum extended header and data.	 */	if (len + optlen)		ti->ti_len = htons((u_short)(sizeof (struct tcphdr) +		    optlen + len));	ti->ti_sum = in_cksum(m, (int)(hdrlen + len));	/*	 * In transmit state, time the transmission and arrange for	 * the retransmit.  In persist state, just set snd_max.	 */	if (tp->t_force == 0 || tp->t_timer[TCPT_PERSIST] == 0) {		tcp_seq startseq = tp->snd_nxt;		/*		 * Advance snd_nxt over sequence space of this segment.		 */		if (flags & (TH_SYN|TH_FIN)) {			if (flags & TH_SYN)				tp->snd_nxt++;			if (flags & TH_FIN) {				tp->snd_nxt++;				tp->t_flags |= TF_SENTFIN;			}		}		tp->snd_nxt += len;		if (SEQ_GT(tp->snd_nxt, tp->snd_max)) {			tp->snd_max = tp->snd_nxt;			/*			 * Time this transmission if not a retransmission and			 * not currently timing anything.			 */			if (tp->t_rtt == 0) {				tp->t_rtt = 1;				tp->t_rtseq = startseq;				tcpstat.tcps_segstimed++;			}		}		/*		 * Set retransmit timer if not currently set,		 * and not doing an ack or a keep-alive probe.		 * Initial value for retransmit timer is smoothed		 * round-trip time + 2 * round-trip time variance.		 * Initialize shift counter which is used for backoff		 * of retransmit time.		 */		if (tp->t_timer[TCPT_REXMT] == 0 &&		    tp->snd_nxt != tp->snd_una) {			tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;			if (tp->t_timer[TCPT_PERSIST]) {				tp->t_timer[TCPT_PERSIST] = 0;				tp->t_rxtshift = 0;			}		}	} else		if (SEQ_GT(tp->snd_nxt + len, tp->snd_max))			tp->snd_max = tp->snd_nxt + len;	/*	 * Trace.	 */#ifdef	BSDDEBUG	if (so->so_options & SO_DEBUG)		(*tcpTraceRtn)(TA_OUTPUT, tp->t_state, tp, ti, 0);#endif	/* BSDDEBUG */	/*	 * Fill in IP length and desired time to live and	 * send to IP level.  There should be a better way	 * to handle ttl and tos; we could keep them in	 * the template, but need a way to checksum without them.	 */	m->m_pkthdr.len = hdrlen + len;	((struct ip *)ti)->ip_len = m->m_pkthdr.len;	((struct ip *)ti)->ip_ttl = tp->t_inpcb->inp_ip.ip_ttl;	/* XXX */	((struct ip *)ti)->ip_tos = tp->t_inpcb->inp_ip.ip_tos;	/* XXX */        /*         * Prevent fragmentation to continue (or trigger) path MTU discovery         * if the required route and path MTU estimate are available and path         * MTU discovery is enabled for this socket. (TCP sockets enable MTU         * discovery by default).         */        rt = tp->t_inpcb->inp_route.ro_rt;        if (rt && (rt->rt_flags & RTF_UP) && !(rt->rt_rmx.rmx_locks & RTV_MTU))            {            if (tp->t_inpcb->inp_socket->so_options & SO_USEPATHMTU)                ( (struct ip *)ti)->ip_off |= IP_DF;            }#if BSD >= 43	error = ip_output(m, tp->t_inpcb->inp_options, &tp->t_inpcb->inp_route,	    so->so_options & SO_DONTROUTE, 0);#else	error = ip_output(m, (struct mbuf *)0, &tp->t_inpcb->inp_route, 	    so->so_options & SO_DONTROUTE);#endif	pktSent = TRUE;#ifdef WV_INSTRUMENTATION#ifdef INCLUDE_WVNET    /* WV_NET_NOTICE event */    WV_NET_PORTOUT_EVENT_2 (NET_CORE_EVENT, WV_NET_NOTICE, 19, 3,                            tp->t_inpcb->inp_lport, tp->t_inpcb->inp_fport,                            WV_NETEVENT_TCPOUT_FINISH, WV_NET_SEND,                            so->so_fd, error)#endif  /* INCLUDE_WVNET */#endif	if (error) 	    {out:	    /* 	     * State machine needs to be updated even if packet was not sent 	     * due to errors.	     */	    if (! pktSent)		{		if (! SEQ_GT(tp->snd_up, tp->snd_nxt)) 		    {		    /*		     * If no urgent pointer to send, then we pull		     * the urgent pointer to the left edge of the send window		     * so that it doesn't drift into the send window on 		     * sequence number wraparound.		     */		    tp->snd_up = tp->snd_una;		/* drag it along */		    }		/*		 * In transmit state, time the transmission and arrange for		 * the retransmit.  In persist state, just set snd_max.		 */		if (tp->t_force == 0 || tp->t_timer[TCPT_PERSIST] == 0) 		    {		    tcp_seq startseq = tp->snd_nxt;		    		    /*		     * Advance snd_nxt over sequence space of this segment.		     */		    if (flags & (TH_SYN|TH_FIN)) 			{			if (flags & TH_SYN)			    tp->snd_nxt++;			if (flags & TH_FIN) 			    {			    tp->snd_nxt++;			    tp->t_flags |= TF_SENTFIN;			    }			}		    tp->snd_nxt += len;		    if (SEQ_GT(tp->snd_nxt, tp->snd_max)) 			{			tp->snd_max = tp->snd_nxt;			/*			 * Time this transmission if not a retransmission and			 * not currently timing anything.			 */			if (tp->t_rtt == 0) 			    {			    tp->t_rtt = 1;			    tp->t_rtseq = startseq;			    tcpstat.tcps_segstimed++;			    }			}		     		    /*		     * Set retransmit timer if not currently set,		     * and not doing an ack or a keep-alive probe.		     * Initial value for retransmit timer is smoothed		     * round-trip time + 2 * round-trip time variance.		     * Initialize shift counter which is used for backoff		     * of retransmit time.		     */		    if (tp->t_timer[TCPT_REXMT] == 0 &&			tp->snd_nxt != tp->snd_una) 			{			tp->t_timer[TCPT_REXMT] = tp->t_rxtcur;			if (tp->t_timer[TCPT_PERSIST]) 			    {			    tp->t_timer[TCPT_PERSIST] = 0;			    tp->t_rxtshift = 0;			    }			}		    } else			if (SEQ_GT(tp->snd_nxt + len, tp->snd_max))			    tp->snd_max = tp->snd_nxt + len;		}	    if (error == ENOBUFS) 		{		tcp_quench(tp->t_inpcb, 0);		return (0);		}            if (error == EMSGSIZE)                {                /*                 * Update the MSS to reflect the new MTU estimate.                 * Exit when complete since the tcp_updatemtu() routine                 * already triggers retransmission.                 */                 tcp_updatemtu (tp->t_inpcb, 0);                 return (0);                 }	    if ((error == EHOSTUNREACH || error == ENETDOWN)		&& TCPS_HAVERCVDSYN(tp->t_state)) 		{		tp->t_softerror = error;		return (0);		}	    return (error);	    }	tcpstat.tcps_sndtotal++;	/*	 * Data sent (as far as we can tell).	 * If this advertises a larger window than any other segment,	 * then remember the size of the advertised window.	 * Any pending ACK has now been sent.	 */	if (win > 0 && SEQ_GT(tp->rcv_nxt+win, tp->rcv_adv))		tp->rcv_adv = tp->rcv_nxt + win;	tp->last_ack_sent = tp->rcv_nxt;	tp->t_flags &= ~(TF_ACKNOW|TF_DELACK);	if (sendalot)		goto again;	return (0);}voidtcp_setpersist(tp)	register struct tcpcb *tp;{	register int t = ((tp->t_srtt >> 2) + tp->t_rttvar) >> 1;	if (tp->t_timer[TCPT_REXMT])		panic("tcp_output REXMT");	/*	 * Start/restart persistance timer.	 */	TCPT_RANGESET(tp->t_timer[TCPT_PERSIST],	    t * tcp_backoff[tp->t_rxtshift],	    TCPTV_PERSMIN, TCPTV_PERSMAX);	if (tp->t_rxtshift < TCP_MAXRXTSHIFT)		tp->t_rxtshift++;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美sm美女调教| 国产成人丝袜美腿| 欧美色图在线观看| 亚洲图片欧美色图| 欧美高清视频一二三区| 亚洲自拍欧美精品| 欧美三区免费完整视频在线观看| 亚洲国产一二三| 欧美一区二区三区成人| 国产综合久久久久久久久久久久| 国产日韩欧美麻豆| 97成人超碰视| 亚洲成a人v欧美综合天堂 | 国产精品一区三区| 国产午夜精品久久久久久久| caoporn国产精品| 亚洲成人一二三| 精品盗摄一区二区三区| 国产成人超碰人人澡人人澡| 亚洲色图清纯唯美| 正在播放亚洲一区| 丁香婷婷综合激情五月色| 国产精品不卡一区二区三区| 欧美日韩三级视频| 国产酒店精品激情| 亚洲综合色自拍一区| 日韩一区二区三区精品视频| 国产大陆亚洲精品国产| 亚洲综合色丁香婷婷六月图片| 欧美不卡视频一区| 99精品桃花视频在线观看| 丝袜美腿一区二区三区| 国产日韩欧美a| 在线电影一区二区三区| 国产精品自拍一区| 亚洲第一福利视频在线| 久久久久久久国产精品影院| 91国模大尺度私拍在线视频| 蜜桃av噜噜一区二区三区小说| 国产精品福利在线播放| 91精品在线观看入口| 成人免费视频视频在线观看免费| 天堂成人国产精品一区| 欧美激情一区二区三区| 91精品国产入口在线| 中文字幕精品一区二区三区精品| 蜜桃视频免费观看一区| 国产在线精品一区二区不卡了| 国产精品视频九色porn| 欧美日韩精品综合在线| 福利一区福利二区| 亚洲国产欧美一区二区三区丁香婷| 久久午夜色播影院免费高清| 欧美精品一级二级三级| 国产麻豆成人传媒免费观看| 天天综合天天综合色| 亚洲精品中文在线观看| 国产综合色在线| 亚洲区小说区图片区qvod| 国产成人精品一区二| 奇米亚洲午夜久久精品| 亚洲一区二区三区在线播放| 国产精品久久三| 国产蜜臀97一区二区三区| 精品国产一区二区亚洲人成毛片| 91麻豆精品国产91久久久久久久久 | 亚洲欧美日韩在线不卡| 日韩精品专区在线影院重磅| 欧美日韩精品欧美日韩精品| 色综合久久天天综合网| 不卡高清视频专区| 国产二区国产一区在线观看| 国产一区二区三区四区五区美女| 精品一区二区免费| 老鸭窝一区二区久久精品| 亚洲免费高清视频在线| 亚洲免费在线看| 亚洲少妇最新在线视频| 一区二区中文视频| 亚洲黄色小说网站| 一区二区三区成人在线视频| 亚洲最大成人网4388xx| 亚洲乱码国产乱码精品精98午夜| 亚洲欧美日韩精品久久久久| 综合久久久久久| 中文字幕综合网| 亚洲制服丝袜一区| 亚州成人在线电影| 日本成人在线视频网站| 蜜桃av一区二区三区| 国产在线播放一区二区三区| 国产伦精品一区二区三区视频青涩| 国产一区二区三区四区五区入口| 粉嫩嫩av羞羞动漫久久久| 国产黄色精品视频| 成人黄色av电影| 色婷婷综合在线| 在线播放中文一区| 久久午夜老司机| 国产女主播一区| 一区二区三区四区在线| 五月天国产精品| 狠狠色狠狠色综合日日91app| 国产精品一二三四| 99国产精品久久久久久久久久久| 日本韩国欧美一区| 日韩小视频在线观看专区| 日韩精品一区二区三区老鸭窝| 久久久精品中文字幕麻豆发布| 国产精品五月天| 亚洲国产中文字幕在线视频综合| 美女视频网站黄色亚洲| 成人国产精品视频| 欧美日韩一区国产| 久久久不卡影院| 亚洲最快最全在线视频| 国内精品视频一区二区三区八戒| 成人福利视频在线看| 欧美日韩一级黄| 国产午夜一区二区三区| 伊人性伊人情综合网| 美腿丝袜亚洲一区| 99在线精品免费| 欧美草草影院在线视频| 综合激情网...| 美女性感视频久久| 91丨porny丨最新| www一区二区| 亚洲成人资源在线| 国产夫妻精品视频| 欧美一级欧美三级在线观看| 综合久久国产九一剧情麻豆| 精品在线亚洲视频| 国产成人在线视频网址| 在线亚洲高清视频| 婷婷综合久久一区二区三区| 欧美视频第二页| 粉嫩嫩av羞羞动漫久久久| 欧美综合一区二区| 一个色综合网站| 91视频免费观看| 一区二区在线观看av| 91亚洲精华国产精华精华液| 国产精品白丝在线| 91色婷婷久久久久合中文| 亚洲欧美福利一区二区| 欧美在线视频你懂得| 亚洲妇熟xx妇色黄| 欧美精品黑人性xxxx| 日韩影院精彩在线| 欧美电视剧在线观看完整版| 精品一区二区三区在线观看国产| 久久综合色之久久综合| 国产精品一二三四区| 国产精品国产三级国产aⅴ无密码| eeuss鲁片一区二区三区 | 欧美日韩综合在线免费观看| 亚洲国产一区视频| 91精品国产综合久久久久久漫画 | 国产一区在线看| 国产日韩欧美a| 日本道色综合久久| 日韩在线卡一卡二| 久久久久久日产精品| 丁香亚洲综合激情啪啪综合| 一区二区三区免费观看| 日韩午夜在线影院| 国产成人在线色| 亚洲精选视频免费看| 欧美一区二区三区免费在线看 | 高清久久久久久| 亚洲日本在线观看| 欧美精品日日鲁夜夜添| 国产一区二区电影| 亚洲另类在线制服丝袜| 91精品国产入口| 成人精品免费网站| 亚洲成人免费在线| 久久久国产精品午夜一区ai换脸| 成人午夜电影久久影院| 青青草97国产精品免费观看 | 欧美日韩国产精品自在自线| 激情综合色播激情啊| 亚洲日本电影在线| 精品乱人伦小说| 日本道在线观看一区二区| 国模少妇一区二区三区| 中文字幕一区三区| 欧美一区二区成人6969| 成人午夜视频免费看| 日韩av电影免费观看高清完整版 | 亚洲三级电影网站| 日韩精品一区在线观看| 91美女片黄在线| 国产福利不卡视频| 免费精品99久久国产综合精品| 国产欧美一区视频| 正在播放亚洲一区| 91搞黄在线观看| 粉嫩av一区二区三区|