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

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

?? ip_output.c

?? vxworks下的實現網絡TCPIP協議的原代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
		m->m_pkthdr.rcvif = (struct ifnet *)0;		mhip->ip_off = htons((u_short)mhip->ip_off);                mhip->ip_sum = 0;                if (_ipCfgFlags & IP_DO_CHECKSUM_SND)                    mhip->ip_sum = in_cksum(m, mhlen);		*mnext = m;		mnext = &m->m_nextpkt;		ipstat.ips_ofragments++;	}	/*	 * Update first fragment by trimming what's been copied out	 * and updating header, then send each fragment (in order).	 */	m = m0;	m_adj(m, hlen + firstlen - (u_short)ip->ip_len);	m->m_pkthdr.len = hlen + firstlen;	ip->ip_len = htons((u_short)m->m_pkthdr.len);	ip->ip_off = htons((u_short)(ip->ip_off | IP_MF));        ip->ip_sum = 0;        if (_ipCfgFlags & IP_DO_CHECKSUM_SND)            ip->ip_sum = in_cksum(m, hlen);sendorfree:	for (m = m0; m; m = m0) {		m0 = m->m_nextpkt;		m->m_nextpkt = 0;		if (error == 0)			error = (*ifp->if_output)(ifp, m,			    (struct sockaddr *)dst, ro->ro_rt);		else			m_freem(m);	}	if (error == 0)		ipstat.ips_fragmented++;    }done:	if (ro == &iproute && (flags & IP_ROUTETOIF) == 0 && ro->ro_rt)		RTFREE(ro->ro_rt);	return (error);bad:	m_freem(m0);	goto done;}/* * Insert IP options into preformed packet. * Adjust IP destination as required for IP source routing, * as indicated by a non-zero in_addr at the start of the options. */static struct mbuf *ip_insertoptions(m, opt, phlen)	register struct mbuf *m;	struct mbuf *opt;	int *phlen;{	register struct ipoption *p = mtod(opt, struct ipoption *);	struct mbuf *n;	register struct ip *ip = mtod(m, struct ip *);	unsigned optlen;	optlen = opt->m_len - sizeof(p->ipopt_dst);	if (optlen + (u_short)ip->ip_len > IP_MAXPACKET)		return (m);		/* XXX should fail */	if (p->ipopt_dst.s_addr)		ip->ip_dst = p->ipopt_dst;#if 0	/* XXX changed for default cluster support vinai         * The reason why always new clusters are allocted,         * is that, data could be overwritten since clusters are shared.         */	if (m->m_flags & M_EXT || m->m_data - optlen < m->m_pktdat) {#endif		n = mHdrClGet(M_DONTWAIT, MT_HEADER, CL_SIZE_128, TRUE);		if (n == 0)			return (m);		n->m_pkthdr.len = m->m_pkthdr.len + optlen;		m->m_len -= sizeof(struct ip);		m->m_data += sizeof(struct ip);		n->m_next = m;		m = n;		m->m_len = optlen + sizeof(struct ip);		m->m_data += max_linkhdr;		bcopy((caddr_t)ip, mtod(m, caddr_t), sizeof(struct ip));#if 0 	/* XXX changed for default cluster support vinai */               	} else {		m->m_data -= optlen;		m->m_len += optlen;		m->m_pkthdr.len += optlen;		ovbcopy((caddr_t)ip, mtod(m, caddr_t), sizeof(struct ip));	}#endif        	ip = mtod(m, struct ip *);	bcopy((caddr_t)p->ipopt_list, (caddr_t)(ip + 1), (unsigned)optlen);	*phlen = sizeof(struct ip) + optlen;	ip->ip_len += optlen;	return (m);}/* * Copy options from ip to jp, * omitting those not copied during fragmentation. */intip_optcopy(ip, jp)	struct ip *ip, *jp;{	register u_char *cp, *dp;	int opt, optlen, cnt;	cp = (u_char *)(ip + 1);	dp = (u_char *)(jp + 1);	cnt = (ip->ip_hl << 2) - sizeof (struct ip);	for (; cnt > 0; cnt -= optlen, cp += optlen) {		opt = cp[0];		if (opt == IPOPT_EOL)			break;		if (opt == IPOPT_NOP) {			/* Preserve for IP mcast tunnel's LSRR alignment. */			*dp++ = IPOPT_NOP;			optlen = 1;			continue;		} else			optlen = cp[IPOPT_OLEN];		/* bogus lengths should have been caught by ip_dooptions */		if (optlen > cnt)			optlen = cnt;		if (IPOPT_COPIED(opt)) {			bcopy((caddr_t)cp, (caddr_t)dp, (unsigned)optlen);			dp += optlen;		}	}	for (optlen = dp - (u_char *)(jp+1); optlen & 0x3; optlen++)		*dp++ = IPOPT_EOL;	return (optlen);}/* * IP socket option processing. */intip_ctloutput(op, so, level, optname, mp)	int op;	struct socket *so;	int level, optname;	struct mbuf **mp;{	register struct inpcb *inp = sotoinpcb(so);	register struct mbuf *m = *mp;	register int optval;	int error = 0;	if (level != IPPROTO_IP) {		error = EINVAL;		if (op == PRCO_SETOPT && *mp)			(void) m_free(*mp);	} else switch (op) {	case PRCO_SETOPT:		switch (optname) {		case IP_OPTIONS:#ifdef notyet		case IP_RETOPTS:			return (ip_pcbopts(optname, &inp->inp_options, m));#else			return (ip_pcbopts(&inp->inp_options, m));#endif		case IP_TOS:		case IP_TTL:		case IP_RECVOPTS:		case IP_RECVRETOPTS:		case IP_RECVDSTADDR:			if (m->m_len != sizeof(int))				error = EINVAL;			else {				optval = *mtod(m, int *);				switch (optname) {				case IP_TOS:					inp->inp_ip.ip_tos = optval;					break;				case IP_TTL:					inp->inp_ip.ip_ttl = optval;					break;#define	OPTSET(bit) \	if (optval) \		inp->inp_flags |= bit; \	else \		inp->inp_flags &= ~bit;				case IP_RECVOPTS:					OPTSET(INP_RECVOPTS);					break;				case IP_RECVRETOPTS:					OPTSET(INP_RECVRETOPTS);					break;				case IP_RECVDSTADDR:					OPTSET(INP_RECVDSTADDR);					break;				}			}			break;#undef OPTSET		case IP_MULTICAST_IF:		case IP_MULTICAST_TTL:		case IP_MULTICAST_LOOP:		case IP_ADD_MEMBERSHIP:		case IP_DROP_MEMBERSHIP:			error = ip_setmoptions(optname, inp, m);			break;		default:			error = ENOPROTOOPT;			break;		}		if (m)			(void)m_free(m);		break;	case PRCO_GETOPT:		switch (optname) {		case IP_OPTIONS:		case IP_RETOPTS:			*mp = m = mBufClGet(M_WAIT, MT_SOOPTS, CL_SIZE_128,					    TRUE);			if (m == NULL)			    {			    error = ENOBUFS;			    break;			    }			if (inp->inp_options) {				m->m_len = inp->inp_options->m_len;				bcopy(mtod(inp->inp_options, caddr_t),				    mtod(m, caddr_t), (unsigned)m->m_len);			} else				m->m_len = 0;			break;		case IP_TOS:		case IP_TTL:		case IP_RECVOPTS:		case IP_RECVRETOPTS:		case IP_RECVDSTADDR:			*mp = m = mBufClGet(M_WAIT, MT_SOOPTS, CL_SIZE_128,					    TRUE);			if (m == NULL)			    {			    error = ENOBUFS;			    break;			    }			m->m_len = sizeof(int);			switch (optname) {			case IP_TOS:				optval = inp->inp_ip.ip_tos;				break;			case IP_TTL:				optval = inp->inp_ip.ip_ttl;				break;#define	OPTBIT(bit)	(inp->inp_flags & bit ? 1 : 0)			case IP_RECVOPTS:				optval = OPTBIT(INP_RECVOPTS);				break;			case IP_RECVRETOPTS:				optval = OPTBIT(INP_RECVRETOPTS);				break;			case IP_RECVDSTADDR:				optval = OPTBIT(INP_RECVDSTADDR);				break;			}			*mtod(m, int *) = optval;			break;		case IP_MULTICAST_IF:		case IP_MULTICAST_TTL:		case IP_MULTICAST_LOOP:		case IP_ADD_MEMBERSHIP:		case IP_DROP_MEMBERSHIP:			error = ip_getmoptions(optname, inp->inp_moptions, mp);			break;		default:			error = ENOPROTOOPT;			break;		}		break;	}	return (error);}/* * Set up IP options in pcb for insertion in output packets. * Store in mbuf with pointer in pcbopt, adding pseudo-option * with destination address if source routed. */int#ifdef notyetip_pcbopts(optname, pcbopt, m)	int optname;#elseip_pcbopts(pcbopt, m)#endif	struct mbuf **pcbopt;	register struct mbuf *m;{	register cnt, optlen;	register u_char *cp;	u_char opt;	/* turn off any old options */	if (*pcbopt)		(void)m_free(*pcbopt);	*pcbopt = 0;	if (m == (struct mbuf *)0 || m->m_len == 0) {		/*		 * Only turning off any previous options.		 */		if (m)			(void)m_free(m);		return (0);	}#ifndef	vax	if (m->m_len % sizeof(long))		goto bad;#endif	/*	 * IP first-hop destination address will be stored before	 * actual options; move other options back	 * and clear it when none present.	 */#if 0 /*XXX changed for default cluster support vinai*/	if (m->m_data + m->m_len + sizeof(struct in_addr) >= &m->m_dat[MLEN])		goto bad;#else	if (m->m_data + m->m_len + sizeof(struct in_addr) >= 	    (m->m_extBuf + m->m_extSize))		goto bad;#endif	cnt = m->m_len;	m->m_len += sizeof(struct in_addr);	cp = mtod(m, u_char *) + sizeof(struct in_addr);	ovbcopy(mtod(m, caddr_t), (caddr_t)cp, (unsigned)cnt);	bzero(mtod(m, caddr_t), sizeof(struct in_addr));	for (; cnt > 0; cnt -= optlen, cp += optlen) {		opt = cp[IPOPT_OPTVAL];		if (opt == IPOPT_EOL)			break;		if (opt == IPOPT_NOP)			optlen = 1;		else {			optlen = cp[IPOPT_OLEN];			if (optlen <= IPOPT_OLEN || optlen > cnt)				goto bad;		}		switch (opt) {		default:			break;		case IPOPT_LSRR:		case IPOPT_SSRR:			/*			 * user process specifies route as:			 *	->A->B->C->D			 * D must be our final destination (but we can't			 * check that since we may not have connected yet).			 * A is first hop destination, which doesn't appear in			 * actual IP option, but is stored before the options.			 */			if (optlen < IPOPT_MINOFF - 1 + sizeof(struct in_addr))				goto bad;			m->m_len -= sizeof(struct in_addr);			cnt -= sizeof(struct in_addr);			optlen -= sizeof(struct in_addr);			cp[IPOPT_OLEN] = optlen;			/*			 * Move first hop before start of options.			 */			bcopy((caddr_t)&cp[IPOPT_OFFSET+1], mtod(m, caddr_t),			    sizeof(struct in_addr));			/*			 * Then copy rest of options back			 * to close up the deleted entry.			 */			ovbcopy((caddr_t)(&cp[IPOPT_OFFSET+1] +			    sizeof(struct in_addr)),			    (caddr_t)&cp[IPOPT_OFFSET+1],			    (unsigned)cnt + sizeof(struct in_addr));			break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久亚洲精品小早川怜子| 亚洲欧美欧美一区二区三区| 精品国产凹凸成av人导航| 中文字幕欧美三区| 天天做天天摸天天爽国产一区| 福利视频网站一区二区三区| 欧美猛男男办公室激情| 欧美国产亚洲另类动漫| 日本不卡高清视频| 91视视频在线直接观看在线看网页在线看| 欧美一区午夜视频在线观看| 国产精品第一页第二页第三页| 精品一二三四区| 91精品国模一区二区三区| 亚洲精品一卡二卡| www.欧美色图| 欧美激情综合在线| 激情久久五月天| 日韩视频一区二区| 午夜不卡在线视频| 欧美精三区欧美精三区| 亚洲激情网站免费观看| 99精品视频一区| 国产欧美日韩三区| 国产精品自拍av| 久久久久久99久久久精品网站| 天天影视网天天综合色在线播放| 欧美亚洲图片小说| 亚洲精品美国一| 91国产精品成人| 亚洲一区欧美一区| 欧美视频一区二区三区| 亚洲一区av在线| 欧美午夜精品一区| 视频一区欧美日韩| 日韩欧美资源站| 国产一区二区调教| 国产校园另类小说区| 国产aⅴ综合色| 亚洲欧洲99久久| 在线视频国内一区二区| 午夜久久电影网| 日韩精品一区二区在线| 国产在线国偷精品产拍免费yy| 精品国精品自拍自在线| 精品亚洲国内自在自线福利| 久久精品人人做| 99久久精品免费| 亚洲在线中文字幕| 欧美一区二区三区视频在线观看| 国模冰冰炮一区二区| 国产精品久久久久久妇女6080| 99久久精品一区| 午夜精品久久久久久久久久久| 欧美美女视频在线观看| 蜜臀av一区二区在线观看 | 一区二区三区四区不卡在线| 欧美在线不卡视频| 日韩一区精品视频| 国产日韩欧美麻豆| 色素色在线综合| 日本亚洲三级在线| 国产精品日韩精品欧美在线 | 国产一区二区三区国产| 久久免费午夜影院| 91视视频在线观看入口直接观看www| 亚洲精品乱码久久久久久久久| 欧美精品高清视频| 岛国一区二区在线观看| 一区二区欧美在线观看| 日韩女优视频免费观看| 91片黄在线观看| 久久精品72免费观看| 亚洲欧美一区二区久久| 欧美日韩aaaaa| 成人中文字幕在线| 日韩专区中文字幕一区二区| 欧美精彩视频一区二区三区| 欧美精品久久一区| 成人性生交大合| 麻豆精品一区二区三区| 亚洲图片激情小说| 欧美成人伊人久久综合网| 97国产一区二区| 国产美女在线观看一区| 亚洲另类色综合网站| 欧美成人性战久久| 欧美日韩国产高清一区| 99久久精品免费看国产免费软件| 黄页视频在线91| 日本不卡一区二区三区| 亚洲乱码中文字幕| 国产精品久久三区| 国产欧美日韩中文久久| 亚洲精品在线观看网站| 91精品国产日韩91久久久久久| jizzjizzjizz欧美| 国产91在线观看| 老色鬼精品视频在线观看播放| 亚洲va欧美va人人爽午夜 | 波多野结衣欧美| 韩国午夜理伦三级不卡影院| 三级亚洲高清视频| 亚洲成人综合在线| 亚洲大尺度视频在线观看| 一区二区在线看| 亚洲一区二区精品久久av| 亚洲色图都市小说| 亚洲美女偷拍久久| 亚洲女爱视频在线| 亚洲国产精品久久不卡毛片 | 天天av天天翘天天综合网 | 国产精品毛片大码女人| 国产色产综合色产在线视频| 精品国产一区二区三区四区四| 欧美久久一二区| 日韩精品一区二区三区四区| 制服丝袜在线91| 欧美不卡在线视频| 久久久一区二区| 国产精品色哟哟网站| 久久精品欧美日韩精品| 国产精品日产欧美久久久久| 欧美国产视频在线| 亚洲图片激情小说| 亚洲一区二区三区激情| 日一区二区三区| 精品亚洲成a人| 成人app下载| 欧美日韩视频在线第一区 | 国产精品拍天天在线| 中文字幕在线不卡一区二区三区| 中文字幕一区二区在线播放 | 久久精品国产亚洲a| 美腿丝袜在线亚洲一区| 老司机精品视频一区二区三区| 久久99国产精品麻豆| 成人性视频免费网站| 91九色最新地址| 欧美一区二区视频观看视频| 欧美成人女星排行榜| 国产偷v国产偷v亚洲高清| 亚洲啪啪综合av一区二区三区| 日韩精品乱码av一区二区| 精品一区二区三区在线播放视频 | 91国在线观看| 日韩一区二区三区视频| 国产亚洲欧美激情| 亚洲永久精品大片| 国产精品一区在线观看你懂的| 91视视频在线观看入口直接观看www| 欧美高清激情brazzers| 久久久99久久| 亚欧色一区w666天堂| 国产成人一级电影| 欧美美女一区二区三区| 日本一区二区三区国色天香| 亚洲尤物视频在线| 国产成人在线视频网站| 欧美日韩一区二区三区在线| 国产日韩av一区| 视频一区二区中文字幕| 91视频免费观看| 久久久噜噜噜久久中文字幕色伊伊| 亚洲欧美日韩久久| 国产在线精品一区二区夜色| 色哟哟一区二区三区| 久久久久久99久久久精品网站| 亚洲图片欧美色图| 99综合电影在线视频| 精品久久久久久亚洲综合网 | 国产精品国产三级国产专播品爱网 | 日韩一区二区三区电影| 1区2区3区欧美| 国产麻豆视频一区| 制服丝袜av成人在线看| 亚洲一区二区三区四区五区黄 | 欧美日本高清视频在线观看| 国产视频一区二区在线| 精品在线免费视频| 91精品国产高清一区二区三区蜜臀| 亚洲男人天堂av网| 成年人国产精品| 久久九九99视频| 国产精品一线二线三线精华| 日韩欧美在线网站| 青青草成人在线观看| 欧美日韩中文字幕精品| 夜夜精品浪潮av一区二区三区| 成人久久视频在线观看| 国产亚洲女人久久久久毛片| 激情综合色综合久久| 精品久久久影院| 裸体健美xxxx欧美裸体表演| 欧美乱熟臀69xxxxxx| 亚洲宅男天堂在线观看无病毒| 91激情五月电影| 亚洲国产婷婷综合在线精品| 欧美三级乱人伦电影| 亚洲午夜精品17c|