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

📄 ip_lib.c

📁 操作系统源代码
💻 C
字号:
/*ip_lib.c*/#include "inet.h"#include "buf.h"#include "type.h"#include "assert.h"#include "io.h"#include "ip_int.h"INIT_PANIC();PUBLIC ipaddr_t ip_get_netmask (hostaddr)ipaddr_t hostaddr;{	ipaddr_t host, mask;#if DEBUG & 256 { where(); printf("ip_lib.c: ip_get_netmask(hostaddr= ");   writeIpAddr(hostaddr); printf(")\n"); }#endif	host= ntohl(hostaddr);	if (!(host & 0x80000000L))		mask= 0xff000000L;	else if (!(host & 0x40000000L))		mask= 0xffff0000L;	else if (!(host & 0x20000000L))		mask= 0xffffff00L;	else	{#if DEBUG { where(); printf("ip.c: marsian address: "); writeIpAddr (hostaddr);   printf("\n"); }#endif		mask= 0xffffffffL;	}	return htonl(mask);}PUBLIC int ip_chk_hdropt (opt, optlen)u8_t *opt;int optlen;{	int i, security_present= FALSE, lose_source_present= FALSE,		strict_source_present= FALSE, record_route_present= FALSE,		timestamp_present= FALSE;#if DEBUG { where(); printf("ip_chk_hdropt(..., %d) called\n", optlen); }#endifassert (!(optlen & 3));	i= 0;	while (i<optlen)	{#if DEBUG { where(); printf("*opt= %d\n", *opt); }#endif		switch (*opt)		{		case 0x0:		/* End of Option list */			return NW_OK;		case 0x1:		/* No Operation */			i++;			opt++;			break;		case 0x82:		/* Security */			if (security_present)				return EINVAL;			security_present= TRUE;			if (opt[1] != 11)				return EINVAL;			i += opt[1];			opt += opt[1];			break;		case 0x83:		/* Lose Source and Record Route */			if (lose_source_present)			{#if DEBUG { where(); printf("snd lose soruce route\n"); }#endif				return EINVAL;			}			lose_source_present= TRUE;			if (opt[1]<3)			{#if DEBUG { where(); printf("wrong length in source route\n"); }#endif				return EINVAL;			}			i += opt[1];			opt += opt[1];			break;		case 0x89:		/* Strict Source and Record Route */			if (strict_source_present)				return EINVAL;			strict_source_present= TRUE;			if (opt[1]<3)				return EINVAL;			i += opt[1];			opt += opt[1];			break;		case 0x7:		/* Record Route */			if (record_route_present)				return EINVAL;			record_route_present= TRUE;			if (opt[1]<3)				return EINVAL;			i += opt[1];			opt += opt[1];			break;		case 0x88:			if (timestamp_present)				return EINVAL;			timestamp_present= TRUE;			if (opt[1] != 4)				return EINVAL;			switch (opt[3] & 0xff)			{			case 0:			case 1:			case 3:				break;			default:				return EINVAL;			}			i += opt[1];			opt += opt[1];			break;		default:			return EINVAL;		}	}	if (i > optlen)	{#if DEBUG { where(); printf("option of wrong length\n"); }#endif		return EINVAL;	}	return NW_OK;}void ip_print_frags(acc)acc_t *acc;{	ip_hdr_t *ip_hdr;	int first;	if (!acc)		printf("(null)");	for (first= 1; acc; acc= acc->acc_ext_link, first= 0)	{assert (acc->acc_length >= IP_MIN_HDR_SIZE);		ip_hdr= (ip_hdr_t *)ptr2acc_data(acc);		if (first)		{			writeIpAddr(ip_hdr->ih_src);			printf(" > ");			writeIpAddr(ip_hdr->ih_dst);		}		printf(" {%x:%d@%d%c}", ip_hdr->ih_id,			ntohs(ip_hdr->ih_length), 			(ntohs(ip_hdr->ih_flags_fragoff) & IH_FRAGOFF_MASK)*8,			(ntohs(ip_hdr->ih_flags_fragoff) & IH_MORE_FRAGS) ?			'+' : '\0');	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -