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

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

?? device-linux.c

?? tinyos-2.x.rar
?? C
字號:
/*
 *   $Id: device-linux.c,v 1.3 2009/08/20 17:03:05 sdhsdh Exp $
 *
 *   Authors:
 *    Lars Fenneberg		<lf@elemental.net>	 
 *
 *   This software is Copyright 1996,1997 by the above mentioned author(s), 
 *   All Rights Reserved.
 *
 *   The license which is distributed with this software in the file COPYRIGHT
 *   applies to this software. If your distribution is missing this file, you
 *   may request it from <pekkas@netcore.fi>.
 *
 */

#include "config.h"
#include "includes.h"
#include "radvd.h"
#include "defaults.h"
#include "pathnames.h"		/* for PATH_PROC_NET_IF_INET6 */

#ifndef IPV6_ADDR_LINKLOCAL
#define IPV6_ADDR_LINKLOCAL   0x0020U
#endif

/*
 * this function gets the hardware type and address of an interface,
 * determines the link layer token length and checks it against
 * the defined prefixes
 */
int
setup_deviceinfo(int sock, struct Interface *iface)
{
	struct ifreq	ifr;
	struct AdvPrefix *prefix;
	char zero[sizeof(iface->if_addr)];
	
	strncpy(ifr.ifr_name, iface->Name, IFNAMSIZ-1);
	ifr.ifr_name[IFNAMSIZ-1] = '\0';

	if (ioctl(sock, SIOCGIFMTU, &ifr) < 0) {
		flog(LOG_ERR, "ioctl(SIOCGIFMTU) failed for %s: %s",
			iface->Name, strerror(errno));
		return (-1);
	}

	dlog(LOG_DEBUG, 3, "mtu for %s is %d", iface->Name, ifr.ifr_mtu);
	iface->if_maxmtu = ifr.ifr_mtu;

	if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0)
	{
		flog(LOG_ERR, "ioctl(SIOCGIFHWADDR) failed for %s: %s",
			iface->Name, strerror(errno));
		return (-1);
	}

	dlog(LOG_DEBUG, 3, "hardware type for %s is %d", iface->Name,
		ifr.ifr_hwaddr.sa_family); 

	switch(ifr.ifr_hwaddr.sa_family)
        {
	case ARPHRD_ETHER:
		iface->if_hwaddr_len = 48;
		iface->if_prefix_len = 64;
		break;
#ifdef ARPHRD_FDDI
	case ARPHRD_FDDI:
		iface->if_hwaddr_len = 48;
		iface->if_prefix_len = 64;
		break;
#endif /* ARPHDR_FDDI */
#ifdef ARPHRD_ARCNET
	case ARPHRD_ARCNET:
		iface->if_hwaddr_len = 8;
		iface->if_prefix_len = -1;
		iface->if_maxmtu = -1;
		break;
#endif /* ARPHDR_ARCNET */
	default:
		iface->if_hwaddr_len = -1;
		iface->if_prefix_len = -1;
		iface->if_maxmtu = -1;
		break;
	}

	dlog(LOG_DEBUG, 3, "link layer token length for %s is %d", iface->Name,
		iface->if_hwaddr_len);

	dlog(LOG_DEBUG, 3, "prefix length for %s is %d", iface->Name,
		iface->if_prefix_len);

	if (iface->if_hwaddr_len != -1) {
		unsigned int if_hwaddr_len_bytes = (iface->if_hwaddr_len + 7) >> 3;
		
		if (if_hwaddr_len_bytes > sizeof(iface->if_hwaddr)) {
			flog(LOG_ERR, "address length %d too big for %s", if_hwaddr_len_bytes, iface->Name);
			return(-2);
		}
		memcpy(iface->if_hwaddr, ifr.ifr_hwaddr.sa_data, if_hwaddr_len_bytes);

		memset(zero, 0, sizeof(zero));
		if (!memcmp(iface->if_hwaddr, zero, if_hwaddr_len_bytes))
			flog(LOG_WARNING, "WARNING, MAC address on %s is all zero!",
				iface->Name);
	}

	prefix = iface->AdvPrefixList;
	while (prefix)
	{
		if ((iface->if_prefix_len != -1) &&
		   (iface->if_prefix_len != prefix->PrefixLen))
		{
			flog(LOG_WARNING, "prefix length should be %d for %s",
				iface->if_prefix_len, iface->Name);
 		}
 			
 		prefix = prefix->next;
	}
                
	return (0);
}

/*
 * this function extracts the link local address and interface index
 * from PATH_PROC_NET_IF_INET6.  Note: 'sock' unused in Linux.
 */
int setup_linklocal_addr(int sock, struct Interface *iface)
{
	FILE *fp;
	char str_addr[40];
	unsigned int plen, scope, dad_status, if_idx;
	char devname[IFNAMSIZ];

	if ((fp = fopen(PATH_PROC_NET_IF_INET6, "r")) == NULL)
	{
		flog(LOG_ERR, "can't open %s: %s", PATH_PROC_NET_IF_INET6,
			strerror(errno));
		return (-1);	
	}
	
	while (fscanf(fp, "%32s %x %02x %02x %02x %15s\n",
		      str_addr, &if_idx, &plen, &scope, &dad_status,
		      devname) != EOF)
	{
		if (scope == IPV6_ADDR_LINKLOCAL &&
		    strcmp(devname, iface->Name) == 0)
		{
			struct in6_addr addr;
			unsigned int ap;
			int i;
			
			for (i=0; i<16; i++)
			{
				sscanf(str_addr + i * 2, "%02x", &ap);
				addr.s6_addr[i] = (unsigned char)ap;
			}
			memcpy(&iface->if_addr, &addr, sizeof(iface->if_addr));

			iface->if_index = if_idx;
			fclose(fp);
			return 0;
		}
	}

	flog(LOG_ERR, "no linklocal address configured for %s", iface->Name);
	fclose(fp);
	return (-1);
}

int setup_allrouters_membership(int sock, struct Interface *iface)
{
	struct ipv6_mreq mreq;                  
	
	memset(&mreq, 0, sizeof(mreq));                  
	mreq.ipv6mr_interface = iface->if_index;
	
	/* ipv6-allrouters: ff02::2 */
	mreq.ipv6mr_multiaddr.s6_addr32[0] = htonl(0xFF020000);                                          
	mreq.ipv6mr_multiaddr.s6_addr32[3] = htonl(0x2);     

	if (setsockopt(sock, SOL_IPV6, IPV6_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)
	{
		/* linux-2.6.12-bk4 returns error with HUP signal but keep listening */
		if (errno != EADDRINUSE)
		{
			flog(LOG_ERR, "can't join ipv6-allrouters on %s", iface->Name);
			return (-1);
		}
	}

	return (0);
}

int check_allrouters_membership(int sock, struct Interface *iface)
{
	#define ALL_ROUTERS_MCAST "ff020000000000000000000000000002"
	
	FILE *fp;
	unsigned int if_idx, allrouters_ok=0;
	char addr[32+1];
	int ret=0;

	if ((fp = fopen(PATH_PROC_NET_IGMP6, "r")) == NULL)
	{
		flog(LOG_ERR, "can't open %s: %s", PATH_PROC_NET_IGMP6,
			strerror(errno));
		return (-1);	
	}
	
	while ( (ret=fscanf(fp, "%u %*s %32[0-9A-Fa-f] %*x %*x %*x\n", &if_idx, addr)) != EOF) {
		if (ret == 2) {
			if (iface->if_index == if_idx) {
				if (strncmp(addr, ALL_ROUTERS_MCAST, sizeof(addr)) == 0)
					allrouters_ok = 1;
			}
		}
	}

	fclose(fp);

	if (!allrouters_ok) {
		flog(LOG_WARNING, "resetting ipv6-allrouters membership on %s", iface->Name);
		setup_allrouters_membership(sock, iface);
	}	

	return(0);
}		

static int
set_interface_var(const char *iface,
		  const char *var, const char *name,
		  uint32_t val)
{
	FILE *fp;
	char spath[64+IFNAMSIZ];	/* XXX: magic constant */
	snprintf(spath, sizeof(spath), var, iface);

	fp = fopen(spath, "w");
	if (!fp) {
		if (name)
			flog(LOG_ERR, "failed to set %s (%u) for %s",
			     name, val, iface);
		return -1;
	}
	fprintf(fp, "%u", val);
	fclose(fp);

	return 0;
}

int
set_interface_linkmtu(const char *iface, uint32_t mtu)
{
	return set_interface_var(iface,
				 PROC_SYS_IP6_LINKMTU, "LinkMTU",
				 mtu);
}

int
set_interface_curhlim(const char *iface, uint8_t hlim)
{
	return set_interface_var(iface,
				 PROC_SYS_IP6_CURHLIM, "CurHopLimit",
				 hlim);
}

int
set_interface_reachtime(const char *iface, uint32_t rtime)
{
	int ret;
	ret = set_interface_var(iface,
				PROC_SYS_IP6_BASEREACHTIME_MS,
				NULL,
				rtime);
	if (ret)
		ret = set_interface_var(iface,
					PROC_SYS_IP6_BASEREACHTIME,
					"BaseReachableTimer",
					rtime / 1000);
	return ret;
}

int
set_interface_retranstimer(const char *iface, uint32_t rettimer)
{
	int ret;
	ret = set_interface_var(iface,
				PROC_SYS_IP6_RETRANSTIMER_MS,
				NULL,
				rettimer);
	if (ret)
		ret = set_interface_var(iface,
					PROC_SYS_IP6_RETRANSTIMER,
					"RetransTimer",
					rettimer / 1000);
	return ret;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品久久久久久久久久久久包黑料| 国产成人午夜视频| 国产精品久久久久一区二区三区| 5566中文字幕一区二区电影| 欧美日韩免费观看一区三区| 在线免费观看成人短视频| 99re热这里只有精品视频| va亚洲va日韩不卡在线观看| 成人app网站| av午夜一区麻豆| 色哟哟在线观看一区二区三区| 91免费视频网| 在线视频欧美精品| 欧美日韩一级黄| 91精品国产麻豆| 国产亚洲美州欧州综合国| 国产欧美日韩麻豆91| 欧美国产丝袜视频| 亚洲私人黄色宅男| 亚洲国产精品一区二区久久| 三级精品在线观看| 国产最新精品免费| 不卡的电视剧免费网站有什么| 91偷拍与自偷拍精品| 欧美日韩色一区| 精品国产乱码久久久久久浪潮| 久久久五月婷婷| 自拍视频在线观看一区二区| 亚洲国产精品久久久久秋霞影院| 日韩国产一二三区| 成人丝袜视频网| 欧美日韩1区2区| 久久久久久久久蜜桃| 一区二区三区中文字幕电影| 秋霞影院一区二区| 91蜜桃网址入口| 日韩欧美高清在线| 一区二区三区欧美亚洲| 久久99精品久久久久久| 一本色道亚洲精品aⅴ| 91精品国产免费| 国产精品免费人成网站| 蜜臂av日日欢夜夜爽一区| 国产69精品久久777的优势| 欧美日韩国产影片| 自拍偷拍亚洲欧美日韩| 日本午夜精品一区二区三区电影| 国产精品系列在线播放| 欧美欧美午夜aⅴ在线观看| 国产精品乱码久久久久久| 午夜免费久久看| 99国产精品久久久久久久久久| 91精品国产91久久久久久一区二区| 欧美激情综合网| 韩国视频一区二区| 欧美日韩免费不卡视频一区二区三区 | 久久久久久久久97黄色工厂| 一区二区三区在线看| 国产精品综合一区二区| 日韩视频免费直播| 亚洲不卡av一区二区三区| av午夜精品一区二区三区| 国产欧美精品日韩区二区麻豆天美| 日韩影视精彩在线| 欧美性视频一区二区三区| 国产精品盗摄一区二区三区| 国产麻豆精品在线观看| 日韩写真欧美这视频| 丝袜美腿成人在线| 欧美精品亚洲二区| 天天操天天色综合| 欧美日韩视频在线第一区 | 日韩精品中文字幕在线一区| 一级做a爱片久久| 91在线观看一区二区| 国产精品沙发午睡系列990531| 狠狠色丁香婷综合久久| 日韩欧美国产1| 韩国成人精品a∨在线观看| 欧美va亚洲va| 精品亚洲成av人在线观看| 精品噜噜噜噜久久久久久久久试看| 日韩成人免费电影| 日韩亚洲欧美综合| 韩国毛片一区二区三区| 精品999在线播放| 国产麻豆精品在线| 国产精品热久久久久夜色精品三区 | 三级精品在线观看| 7777女厕盗摄久久久| 久久成人羞羞网站| 国产欧美日韩三区| 91蜜桃免费观看视频| 亚洲一二三专区| 欧美一区二区三区系列电影| 黄页视频在线91| 中文子幕无线码一区tr| 在线观看一区二区视频| 丝袜a∨在线一区二区三区不卡| 欧美人成免费网站| 国产福利精品导航| 亚洲欧美激情插 | 国产自产高清不卡| 国产精品高潮久久久久无| 欧美日韩专区在线| 国产一区二区三区久久悠悠色av| 国产精品二区一区二区aⅴ污介绍| 99re热视频精品| 日本强好片久久久久久aaa| 欧美激情一区二区三区蜜桃视频| 91麻豆国产在线观看| 蜜桃视频一区二区| 国产精品久久久久永久免费观看 | 91精品国产手机| 国产精品1区2区| 亚洲小说欧美激情另类| 久久理论电影网| 欧美日韩久久一区二区| 成人小视频免费观看| 麻豆精品在线播放| 亚洲乱码中文字幕| 久久精品欧美一区二区三区麻豆| 欧洲精品在线观看| 国产高清成人在线| 热久久久久久久| 一区二区三区美女视频| 国产欧美一区二区在线| 欧美美女网站色| 91美女蜜桃在线| 国产精品自拍av| 美女性感视频久久| 亚洲成年人影院| 国产精品美女www爽爽爽| 日韩午夜在线观看视频| 欧美视频日韩视频在线观看| 成人综合婷婷国产精品久久蜜臀| 日本成人在线网站| 亚洲va韩国va欧美va| 成人免费一区二区三区视频 | 丁香激情综合国产| 久久福利资源站| 日韩综合一区二区| 亚洲国产一区二区在线播放| 亚洲人成网站影音先锋播放| 久久久精品蜜桃| ww久久中文字幕| 日韩视频一区在线观看| 91精品国产免费| 这里只有精品电影| 欧美精品粉嫩高潮一区二区| 在线观看网站黄不卡| 欧美在线免费播放| 色视频一区二区| 欧美综合一区二区| 日本高清无吗v一区| 色www精品视频在线观看| aaa欧美色吧激情视频| 久草热8精品视频在线观看| 蜜臀av亚洲一区中文字幕| 另类小说图片综合网| 美女视频网站久久| 国产麻豆成人传媒免费观看| 国产一区二区三区在线观看免费视频 | 国产日本一区二区| 欧美极品xxx| 亚洲欧美日韩久久| 亚洲伊人伊色伊影伊综合网| 亚洲自拍偷拍图区| 五月开心婷婷久久| 美女诱惑一区二区| 激情文学综合丁香| 成人中文字幕在线| 91国内精品野花午夜精品| 在线观看欧美精品| 91精品婷婷国产综合久久竹菊| 欧美日韩在线播放一区| 4438x亚洲最大成人网| 精品少妇一区二区三区免费观看| 欧美激情中文字幕一区二区| 亚洲欧美精品午睡沙发| 日韩精品亚洲一区| 国产最新精品免费| 91丨porny丨蝌蚪视频| 91精品国产一区二区三区香蕉| 久久在线观看免费| 亚洲精品欧美综合四区| 日韩中文字幕区一区有砖一区| 国产精品一区一区三区| 91美女在线视频| 欧美成人aa大片| 成人欧美一区二区三区小说| 视频精品一区二区| 成人av网站大全| 欧美人体做爰大胆视频| 国产女人水真多18毛片18精品视频| 亚洲激情av在线| 国产在线播精品第三| 欧美日韩一区二区三区四区| 久久久综合网站| 青青草国产精品亚洲专区无|