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

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

?? dhcp6relay.c

?? IPv6環境下的DHCP實現
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*	$KAME: dhcp6relay.c,v 1.33 2002/04/24 14:31:32 jinmei Exp $	*//* * Copyright (C) 2000 WIDE Project. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#include <sys/types.h>#include <sys/socket.h>#include <sys/queue.h>#include <sys/uio.h>#include <net/if.h>#if defined(__FreeBSD__) && __FreeBSD__ >= 3#include <net/if_var.h>#endif#include <netinet/in.h>#include <netinet/icmp6.h>#include <netinet6/in6_var.h>#include <netdb.h>#include <arpa/inet.h>#include <stdio.h>#include <stdarg.h>#include <syslog.h>#include <unistd.h>#include <stdlib.h>		/* XXX: freebsd2 needs this for opt{arg,ind} */#include <errno.h>#include <err.h>#include <string.h>#include <dhcp6.h>#include <common.h>static int ssock;		/* socket for servers */static int csock;		/* socket for clients */static int icmp6sock;		/* socket to receive ICMPv6 errors */static int maxfd;		/* maxi file descriptor for select(2) */static int debug = 0;char *device = NULL;		/* must be global */static char *rmsgctlbuf, *smsgctlbuf;static int rmsgctllen, smsgctllen;static struct msghdr rmh, smh;static char rdatabuf[BUFSIZ];static struct in6_pktinfo *spktinfo;static int mhops = DEFAULT_SOLICIT_HOPCOUNT;static struct sockaddr_in6 sa6_all_servers, sa6_client;struct prefix_list {	TAILQ_ENTRY(prefix_list) plink;	struct sockaddr_in6 paddr; /* contains meaningless but enough members */	int plen;};TAILQ_HEAD(, prefix_list) global_prefixes; /* list of non-link-local prefixes */static char *global_strings[] = {	"fec0::/10", "2000::/3",};static void usage __P((void));static struct prefix_list *make_prefix __P((char *));static void relay6_init __P((void));static void relay6_loop __P((void));static int relay6_recv __P((int, char *));static void relay6_react __P((size_t, char *, char *, int));static void relay6_react_solicit __P((char *, size_t, char *));static void relay6_react_advert __P((char *, size_t, char *));static void relay6_forward_response __P((char *, size_t, struct in6_addr *,	const char *));intmain(argc, argv)	int argc;	char *argv[];{	int ch;	char *progname;	char *p;	if ((progname = strrchr(*argv, '/')) == NULL)		progname = *argv;	else		progname++;	while((ch = getopt(argc, argv, "dDfH:")) != -1) {		switch(ch) {		case 'd':			debug = 1;			break;		case 'D':			debug = 2;			break;		case 'f':			foreground++;			break;		case 'H':			p = NULL;			mhops = (int)strtoul(optarg, &p, 10);			if (!*optarg || *p) {				errx(1, "illegal hop limit: %s", optarg);				/* NOTREACHED */			}			if (mhops <= 0 || mhops > 255) {				errx(1, "illegal hop limit: %d", mhops);				/* NOTREACHED */			}			break;		default:			usage();			exit(0);		}	}	argc -= optind;	argv += optind;	if (argc != 1) {		usage();		/* NOTREACHED */	}	device = argv[0];	if (foreground == 0) {		if (daemon(0, 0) < 0)			err(1, "daemon");		openlog(progname, LOG_NDELAY|LOG_PID, LOG_DAEMON);	}	setloglevel(debug);	relay6_init();	relay6_loop();	exit(0);}static voidusage(){	fprintf(stderr,		"usage: dhcp6relay [-dDf] [-H hoplim] intface\n");	exit(0);}static struct prefix_list *make_prefix(pstr0)	char *pstr0;{	struct prefix_list *pent;	char *p, *ep;	int plen;	char pstr[BUFSIZ];	struct in6_addr paddr;	/* make a local copy for safety */	if (strlcpy(pstr, pstr0, sizeof(pstr)) >= sizeof(pstr)) {		dprintf(LOG_WARNING,			"prefix string too long (maybe bogus): %s", pstr0);		return(NULL);	}	/* parse the string */	if ((p = strchr(pstr, '/')) == NULL)		plen = 128; /* assumes it as a host prefix */	else {		if (p[1] == '\0') {			dprintf(LOG_WARNING,				"no prefix length (ignored): %s", p + 1);			return(NULL);		}		plen = (int)strtoul(p + 1, &ep, 10);		if (*ep != '\0') {			dprintf(LOG_WARNING,				"illegal prefix length (ignored): %s", p + 1);			return(NULL);		}		*p = '\0';	}	if (inet_pton(AF_INET6, pstr, &paddr) != 1) {		dprintf(LOG_ERR, "inet_pton failed for %s", pstr); /* warn? */		exit(1);		/* NOTREACHED */	}	/* allocate a new entry */	if ((pent = (struct prefix_list *)malloc(sizeof(*pent))) == NULL) {		dprintf(LOG_ERR, "memory allocation failed");		exit(1);		/* NOTREACHED */	}	/* fill in each member of the entry */	memset(pent, 0, sizeof(*pent));	pent->paddr.sin6_family = AF_INET6;	pent->paddr.sin6_len = sizeof(struct sockaddr_in6);	pent->paddr.sin6_addr = paddr;	pent->plen = plen;	return(pent);}static voidrelay6_init(){	struct addrinfo hints;	struct addrinfo *res, *res2;	int i, ifidx, error;	struct ipv6_mreq mreq6;	int type;	struct icmp6_filter filt;	int on = 1;	static struct iovec iov[2];	struct cmsghdr *cm;	/* initialize non-link-local prefixes list */	TAILQ_INIT(&global_prefixes);	for (i = 0; global_strings[i]; i++) {		struct prefix_list *p;				if ((p = make_prefix(global_strings[i])) != NULL)			TAILQ_INSERT_TAIL(&global_prefixes, p, plink);	}	/* initialize special socket addresses */	memset(&hints, 0, sizeof(hints));	hints.ai_family = PF_INET6;	hints.ai_socktype = SOCK_DGRAM;	hints.ai_protocol = IPPROTO_UDP;	hints.ai_flags = AI_PASSIVE;	error = getaddrinfo(DH6ADDR_ALLSERVER, DH6PORT_UPSTREAM, &hints, &res);	if (error) {		errx(1, "getaddrinfo: %s", gai_strerror(error));		/* NOTREACHED */	}	if (res->ai_family != PF_INET6 ||	    res->ai_addrlen < sizeof(sa6_all_servers)) {		/* this should be impossible, but check for safety */		errx(1, "getaddrinfor returned a bogus address");		/* NOTREACHED */	}	memcpy(&sa6_all_servers, res->ai_addr, sizeof(sa6_all_servers));	freeaddrinfo(res);	/* initialize send/receive buffer */	iov[0].iov_base = (caddr_t)rdatabuf;	iov[0].iov_len = sizeof(rdatabuf);	rmh.msg_iov = iov;	rmh.msg_iovlen = 1;	rmsgctllen = smsgctllen = CMSG_SPACE(sizeof(struct in6_pktinfo));	if ((rmsgctlbuf = (char *)malloc(rmsgctllen)) == NULL) {		errx(1, "memory allocation failed");		/* NOTREACHED */	}	if ((smsgctlbuf = (char *)malloc(smsgctllen)) == NULL) {		errx(1, "memory allocation failed");		/* NOTREACHED */	}	smh.msg_controllen = smsgctllen;	smh.msg_control = smsgctlbuf;	cm = (struct cmsghdr *)CMSG_FIRSTHDR(&smh);	cm->cmsg_len = CMSG_LEN(sizeof(*spktinfo));	cm->cmsg_level = IPPROTO_IPV6;	cm->cmsg_type = IPV6_PKTINFO;	spktinfo = (struct in6_pktinfo *)CMSG_DATA((struct cmsghdr *)cm);	/*	 * Setup a socket to communicate with clients.	 */	ifidx = if_nametoindex(device);	if (ifidx == 0)		errx(1, "invalid interface %s", device);	memset(&hints, 0, sizeof(hints));	hints.ai_family = PF_INET6;	hints.ai_socktype = SOCK_DGRAM;	hints.ai_protocol = IPPROTO_UDP;	hints.ai_flags = AI_PASSIVE;	error = getaddrinfo(NULL, DH6PORT_UPSTREAM, &hints, &res);	if (error) {		errx(1, "getaddrinfo: %s", gai_strerror(error));		/* NOTREACHED */	}	csock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);	if (csock < 0) {		err(1, "socket(csock)");		/* NOTREACHED */	}	if (csock > maxfd)		maxfd = csock;	if (setsockopt(csock, SOL_SOCKET, SO_REUSEPORT,		       &on, sizeof(on)) < 0) {		err(1, "setsockopt(csock, SO_REUSEPORT)");		/* NOTREACHED */	}	if (setsockopt(csock, SOL_SOCKET, SO_REUSEADDR,		       &on, sizeof(on)) < 0) {		err(1, "setsockopt(csock, SO_REUSEADDR)");		/* NOTREACHED */	}	if (bind(csock, res->ai_addr, res->ai_addrlen) < 0) {		err(1, "bind(csock)");		/* NOTREACHED */	}	freeaddrinfo(res);#ifdef IPV6_RECVPKTINFO	if (setsockopt(csock, IPPROTO_IPV6, IPV6_RECVPKTINFO,		       &on, sizeof(on)) < 0) {		err(1, "setsockopt(IPV6_RECVPKTINFO)");		/* NOTREACHED */	}#else	if (setsockopt(csock, IPPROTO_IPV6, IPV6_PKTINFO,		       &on, sizeof(on)) < 0) {		err(1, "setsockopt(IPV6_PKTINFO)");		/* NOTREACHED */	}#endif	hints.ai_flags = 0;	error = getaddrinfo(DH6ADDR_ALLAGENT, 0, &hints, &res2);	if (error) {		errx(1, "getaddrinfo: %s", gai_strerror(error));		/* NOTREACHED */	}	memset(&mreq6, 0, sizeof(mreq6));	mreq6.ipv6mr_interface = ifidx;	memcpy(&mreq6.ipv6mr_multiaddr,		&((struct sockaddr_in6 *)res2->ai_addr)->sin6_addr,		sizeof(mreq6.ipv6mr_multiaddr));	if (setsockopt(csock, IPPROTO_IPV6, IPV6_JOIN_GROUP,			&mreq6, sizeof(mreq6))) {		err(1, "setsockopt(csock, IPV6_JOIN_GROUP)");	}	freeaddrinfo(res2);	/*	 * Setup a socket to communicate with servers.	 */	hints.ai_flags = AI_PASSIVE;	error = getaddrinfo(NULL, DH6PORT_DOWNSTREAM, &hints, &res);	if (error) {		errx(1, "getaddrinfo: %s", gai_strerror(error));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久国产成人午夜av影院| 毛片一区二区三区| 亚洲伊人伊色伊影伊综合网| 视频一区二区欧美| 成人黄色在线视频| 3d动漫精品啪啪一区二区竹菊| 国产女同性恋一区二区| 石原莉奈一区二区三区在线观看 | 岛国av在线一区| 欧美日韩国产小视频| 亚洲欧洲色图综合| 美女诱惑一区二区| 欧美精品日韩综合在线| 一区二区三区欧美激情| 国产精品一二三四| 日韩精品一区二区三区四区视频| 亚洲青青青在线视频| 岛国av在线一区| 久久久久青草大香线综合精品| 无吗不卡中文字幕| 欧美在线不卡视频| 一区二区三区四区亚洲| 91在线观看视频| 国产精品福利一区二区| 成人性生交大片| 日本一区二区成人| 国产成人精品亚洲日本在线桃色 | 污片在线观看一区二区| 日本精品视频一区二区| 中文字幕日本不卡| 99天天综合性| 亚洲视频电影在线| 色婷婷激情一区二区三区| 亚洲女子a中天字幕| 91蝌蚪porny| 一级中文字幕一区二区| 在线一区二区视频| 亚洲高清免费视频| 欧美性大战久久久久久久| 亚洲激情av在线| 欧美视频一区二区在线观看| 亚洲国产精品久久久男人的天堂| 欧美亚洲尤物久久| 婷婷国产在线综合| 欧美成人精品1314www| 九九国产精品视频| 久久精品一二三| 99久久精品国产导航| 一区二区三区av电影| 精品1区2区3区| 日韩成人一区二区| 久久久不卡网国产精品二区| 白白色 亚洲乱淫| 一区二区三区在线视频观看| 欧美精品乱人伦久久久久久| 国产一区二区在线免费观看| 亚洲国产精品ⅴa在线观看| 97久久超碰国产精品| 亚洲一区免费观看| 欧美电影免费观看高清完整版在| caoporn国产精品| 亚洲伦理在线精品| 91精品国产入口在线| 国产麻豆91精品| 亚洲欧美国产毛片在线| 日韩欧美精品三级| caoporn国产一区二区| 午夜视频一区二区| 国产日产精品一区| 欧美日韩成人综合在线一区二区| 国内精品免费**视频| 亚洲免费av高清| 亚洲精品一区在线观看| 色欧美日韩亚洲| 激情综合五月婷婷| 亚洲国产人成综合网站| 久久久精品日韩欧美| 欧美日韩在线一区二区| 国产乱码精品一区二区三区五月婷 | 久久综合精品国产一区二区三区 | 国产精品人人做人人爽人人添 | 午夜精品久久久久久久99樱桃| 26uuu国产在线精品一区二区| 不卡av电影在线播放| 蜜桃av噜噜一区| 亚洲精品欧美专区| 国产日产欧美精品一区二区三区| 欧美日韩中文字幕一区| 成人v精品蜜桃久久一区| 喷水一区二区三区| 亚洲一区在线观看网站| 中文字幕欧美区| 日韩一级黄色大片| 欧美性猛交xxxx黑人交| 成a人片亚洲日本久久| 精一区二区三区| 亚洲超丰满肉感bbw| 一区二区三区中文字幕电影 | 欧美视频精品在线观看| 国产·精品毛片| 经典三级一区二区| 秋霞电影网一区二区| 亚洲一区二区在线播放相泽 | 亚洲欧美激情一区二区| 久久只精品国产| 欧美一级一区二区| 欧美电影在线免费观看| 在线欧美一区二区| 91久久精品一区二区| 色综合久久中文综合久久97| av午夜精品一区二区三区| 国产乱淫av一区二区三区| 麻豆一区二区三| 美女一区二区视频| 美女视频网站黄色亚洲| 久久国产精品99久久久久久老狼| 免费观看在线色综合| 日本午夜精品一区二区三区电影| 亚洲h动漫在线| 成人激情图片网| 成人av免费在线播放| 成人av网站免费观看| av欧美精品.com| 一本一本大道香蕉久在线精品| 9久草视频在线视频精品| 色综合一区二区| 欧美午夜精品免费| 911精品国产一区二区在线| 6080日韩午夜伦伦午夜伦| 日韩欧美不卡在线观看视频| 欧美精品一区二区三区高清aⅴ| 欧美一区二区三区在| 久久久青草青青国产亚洲免观| 久久综合中文字幕| 中文字幕精品—区二区四季| 亚洲欧美国产77777| 同产精品九九九| 国产麻豆欧美日韩一区| 成人a级免费电影| 欧美系列一区二区| 91精品国产丝袜白色高跟鞋| 精品国产伦理网| 国产精品久久久久久久久搜平片| 伊人婷婷欧美激情| 蜜桃免费网站一区二区三区| 成人精品免费网站| 欧美三级韩国三级日本三斤| 日韩欧美电影在线| 亚洲视频一区二区在线| 日韩精品每日更新| 成人午夜av在线| 欧美日韩国产一二三| 亚洲精品一区二区三区在线观看| 国产精品久久久久久久久免费樱桃 | 久久品道一品道久久精品| 1000部国产精品成人观看| 午夜精品一区二区三区电影天堂| 国产一区二区美女诱惑| 色老综合老女人久久久| 国产精品国产三级国产有无不卡 | 精品一区二区综合| 91小视频在线免费看| 日韩欧美国产wwwww| 亚洲六月丁香色婷婷综合久久 | 欧美tickling网站挠脚心| 国产精品久久久久永久免费观看 | 国产精品成人免费在线| 麻豆精品久久精品色综合| av亚洲精华国产精华精| 久久综合色播五月| 天堂蜜桃91精品| 91免费视频观看| 久久精品夜夜夜夜久久| 青娱乐精品在线视频| 欧洲视频一区二区| 国产精品国产三级国产普通话蜜臀| 日本欧洲一区二区| 欧美色综合影院| 国产精品久久久久久久久搜平片| 精品夜夜嗨av一区二区三区| 欧美男生操女生| 一区二区三区欧美日| 91美女福利视频| 国产精品久久久久久久久快鸭| 国产综合色产在线精品| 日韩三级在线观看| 日韩电影一区二区三区| 欧美色手机在线观看| 亚洲美女区一区| www.色综合.com| 国产精品电影一区二区| 91精品国产欧美一区二区成人| 亚洲欧洲在线观看av| 国产成人精品免费在线| 久久精品日韩一区二区三区| 精品一区二区三区免费毛片爱| 欧美一区二区三区性视频| 日韩中文欧美在线| 91麻豆精品国产自产在线观看一区 | 国产欧美日韩不卡|