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

📄 rsvp_trans.c

📁 radius协议源码÷The Radius Stack will connect to a Radius Server. This stack implementation is built upo
💻 C
📖 第 1 页 / 共 3 页
字号:
	return(rc);}staticintdel_interface(net_if *inf){	switch(NET_GET_TYPE(inf)) {		case NET_IF_PHY:			switch (NET_GET_TYPE(&NET_GET_IF_PHY_ADDR(inf))) {				case NET_ADDR_IPv4:					return(del_if_ipv4(inf,&maddr));#ifdef	USE_IPV6				case NET_ADDR_IPv6:					return(del_if_ipv6(inf,&maddr6));#endif	/* USE_IPV6 */				default:					return(SYS_ERROR);			}		case NET_IF_VIF:			switch (NET_GET_TYPE(&NET_GET_IF_VIF_ADDR(inf))) {				case NET_ADDR_IPv4:					return(del_vif_ipv4(inf));				default:					return(SYS_ERROR);			}		default:			return(SYS_ERROR);	}}staticintsend_ipv4(net_addr_type type,struct sockaddr_in *to,struct sockaddr_in *from,	void *msg,int len,net_if *inf,u_char hops,int ra){	int fd,n;	struct msghdr hdr;	hdr.msg_name = (void *) to;	hdr.msg_namelen = sizeof(*to);	hdr.msg_control = NULL;	hdr.msg_controllen = 0;	fd = set_ancillary_data_ipv4(&hdr,type,to,from,msg,len,inf,hops,ra);	if (FAILED(fd))		return(fd);	n = sendmsg(fd,&hdr,0);	if (FAILED(n)) {		net_error(NET_ERROR_SYSTEM,"sendmsg");		return(SYS_ERROR);	}	return(n);}staticintsocket_ipv4(int type,int proto,net_addr_type atype){	int fd,one = 1;	u_char on = FALSE;	fd = socket(AF_INET,type,proto);	if (FAILED(fd)) {		if (type == SOCK_RAW) {			if (rawmode) {				net_error(NET_ERROR_USER,					"Using UDP encapsulation\n");				rawmode = FALSE;			}		}		else			net_error(NET_ERROR_SYSTEM,"socket");		return(fd);	}	if (FAILED(setsockopt(fd,SOL_SOCKET,SO_REUSEXXXX,			(char *) &one,sizeof(one)))) {		net_error(NET_ERROR_SYSTEM,"SO_REUSEXXXX");		return(failed(fd));	}	if (!FAILED(pid)) {		if (FAILED(fcntl(fd, F_SETFL, (fcntl(fd, F_GETFL) | FASYNC))))			return(failed(fd));#ifndef	SOLARIS		if (FAILED(fcntl(fd, F_SETOWN, pid)))			return(failed(fd));#endif	/* SOLARIS */	}	/* Ignore errors on non-multicast interfaces */	setsockopt(fd,IPPROTO_IP,IP_MULTICAST_LOOP,(char *) &on,sizeof(on));	if (FAILED(init_ancillary_data_ipv4(fd)))		return(failed(fd));	FD_SET(fd,&fset);	protocol_type[fd] = atype;	finalize[fd] = NULL;	return(fd);}staticintsocket_recv_rsvp_ipv4(int proto){	int fd;	fd = socket_ipv4(SOCK_RAW,proto,NET_ADDR_IPv4);		/* Side effect: sets rawmode to FALSE if fails */	if (FAILED(fd))		return(fd);	if (FAILED(rsvp_on_ipv4(fd))) {		net_error(NET_ERROR_USER,"Pre-3.3 multicast kernel\n");		return(failed(fd));	}	FD_SET(fd,&rset);	finalize[fd] = rsvp_off_ipv4;	return(fd);}/* *	Turn on protocol 46 intercept for RSVP. */staticintrsvp_on_ipv4(int fd){#ifdef	IP_ROUTER_ALERT	int on = TRUE;	if (FAILED(setsockopt(fd,IPPROTO_IP,IP_ROUTER_ALERT,			(char *) &on,sizeof(on)))) {		net_error(NET_ERROR_SYSTEM,"IP_ROUTER_ALERT");		return(SYS_ERROR);	}#else	/* IP_ROUTER_ALERT */#ifdef	IP_RSVP_ON	if (FAILED(setsockopt(fd,IPPROTO_IP,IP_RSVP_ON,(char *) NULL,0))) {		net_error(NET_ERROR_SYSTEM,"IP_RSVP_ON");		return(SYS_ERROR);	}#endif	/* IP_RSVP_ON */#endif	/* IP_ROUTER_ALERT */	return(SYS_NOERROR);}staticintrsvp_off_ipv4(int fd){#ifdef	IP_ROUTER_ALERT	int off = FALSE;	if (FAILED(setsockopt(fd,IPPROTO_IP,IP_ROUTER_ALERT,			(char *) &off,sizeof(off)))) {		net_error(NET_ERROR_SYSTEM,"IP_ROUTER_ALERT");		return(SYS_ERROR);	}#else	/* IP_ROUTER_ALERT */#ifdef	IP_RSVP_OFF	if (FAILED(setsockopt(fd,IPPROTO_IP,IP_RSVP_OFF,(char *) NULL,0))) {		net_error(NET_ERROR_SYSTEM,"IP_RSVP_OFF");		return(SYS_ERROR);	}#endif	/* IP_RSVP_OFF */#endif	/* IP_ROUTER_ALERT */	return(SYS_NOERROR);}staticintsocket_recv_udp_ipv4(struct sockaddr_in *addr){	int fd;	fd = socket_ipv4(SOCK_DGRAM,PF_UNSPEC,NET_ADDR_UDP_IPv4);	if (FAILED(fd))		return(fd);	if (FAILED(bind(fd,(struct sockaddr *) addr,sizeof(*addr)))) {		net_error(NET_ERROR_SYSTEM,"bind");		return(failed(fd));	}	FD_SET(fd,&rset);	return(fd);}staticintjoin_multicast_ipv4(int fd,net_if *inf,struct in_addr *g){	struct ip_mreq mreq;	mreq.imr_multiaddr = *g;	mreq.imr_interface = NET_GET_ADDR_IPv4(&NET_GET_IF_PHY_ADDR(inf));	/* Ignore errors on non-multicast interfaces */	if (FAILED(setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,			(char *) &mreq,sizeof(mreq))))		return(SYS_NOERROR);	finalize[fd] = drop_all_multicast_ipv4;	return(SYS_NOERROR);}staticintdrop_multicast_ipv4(int fd,net_if *inf,struct in_addr *g){	struct ip_mreq mreq;	mreq.imr_multiaddr = *g;	mreq.imr_interface = NET_GET_ADDR_IPv4(&NET_GET_IF_PHY_ADDR(inf));	if (FAILED(setsockopt(fd,IPPROTO_IP,IP_DROP_MEMBERSHIP,			(char *) &mreq,sizeof(mreq)))) {		net_error(NET_ERROR_SYSTEM,"IP_DROP_MEMBERSHIP");		return(SYS_ERROR);	}	return(SYS_NOERROR);}staticintdrop_all_multicast_ipv4(int fd){	/* FIX: Finish */	return(SYS_ERROR);}/* *	Use ancillary data to specific outgoing network interface, *	source address, hop count, and router alert option.  This *	function returns the file descriptor to use for the send *	operation. */staticintinit_ancillary_data_ipv4(int fd){	int on = TRUE;#ifdef	IP_PKTINFO	if (FAILED(setsockopt(fd,IPPROTO_IP,IP_PKTINFO,			(char *) &on,sizeof(on)))) {		net_error(NET_ERROR_SYSTEM,"IP_PKTINFO");		return(SYS_ERROR);	}#endif	/* IP_PKTINFO */	return(SYS_NOERROR);}#ifdef	USE_IPV6staticintsend_ipv6(net_addr_type type,struct sockaddr_in6 *to,struct sockaddr_in6 *from,	void *msg,int len,net_if *inf,u_char hops,int ra){	int fd,n;	struct msghdr hdr;	hdr.msg_name = (void *) to;	hdr.msg_namelen = sizeof(*to);	hdr.msg_control = NULL;	hdr.msg_controllen = 0;	fd = set_ancillary_data_ipv6(&hdr,type,to,from,msg,len,inf,hops,ra);	if (FAILED(fd))		return(fd);	n = sendmsg(fd,&hdr,0);	if (FAILED(n)) {		net_error(NET_ERROR_SYSTEM,"sendmsg-1");		return(SYS_ERROR);	}	return(n);}staticintsocket_ipv6(int type,int proto,net_addr_type atype){	int fd,one = 1;	u_char on = FALSE;	fd = socket(AF_INET6,type,proto);	if (FAILED(fd)) {		if (type == SOCK_RAW) {			if (rawmode) {				net_error(NET_ERROR_USER,					"Using UDP encapsulation\n");				rawmode = FALSE;			}		}		else			net_error(NET_ERROR_SYSTEM,"socket");		return(fd);	}	if (FAILED(setsockopt(fd,SOL_SOCKET,SO_REUSEXXXX,			(char *) &one,sizeof(one)))) {		net_error(NET_ERROR_SYSTEM,"SO_REUSEXXXX");		return(failed(fd));	}	if (!FAILED(pid)) {		if (FAILED(fcntl(fd, F_SETFL, (fcntl(fd, F_GETFL) | FASYNC))))			return(failed(fd));#ifndef	SOLARIS		if (FAILED(fcntl(fd, F_SETOWN, pid)))			return(failed(fd));#endif	/* SOLARIS */	}	/* Ignore errors on non-multicast interfaces */	setsockopt(fd,IPPROTO_IPV6,IPV6_MULTICAST_LOOP,		(char *) &on,sizeof(on));	if (FAILED(init_ancillary_data_ipv6(fd)))		return(failed(fd));	FD_SET(fd,&fset);	protocol_type[fd] = atype;	finalize[fd] = NULL;	return(fd);}staticintsocket_recv_rsvp_ipv6(int proto){	int fd;	fd = socket_ipv6(SOCK_RAW,proto,NET_ADDR_IPv6);	if (FAILED(fd))		return(fd);	if (FAILED(rsvp_on_ipv6(fd))) {		net_error(NET_ERROR_USER,"Pre-3.3 multicast kernel\n");		return(failed(fd));	}	FD_SET(fd,&rset);	finalize[fd] = rsvp_off_ipv6;	return(fd);}staticintrsvp_on_ipv6(int fd){#ifdef	IPV6_ROUTER_ALERT	int on = TRUE;	if (FAILED(setsockopt(fd,IPPROTO_IPV6,IPV6_ROUTER_ALERT,			(char *) &on,sizeof(on)))) {		net_error(NET_ERROR_SYSTEM,"IPV6_ROUTER_ALERT");		return(SYS_ERROR);	}#else	/* IPV6_ROUTER_ALERT */#ifdef	IPV6_RSVP_ON	if (FAILED(setsockopt(fd,IPPROTO_IPV6,IPV6_RSVP_ON,(char *) NULL,0))) {		net_error(NET_ERROR_SYSTEM,"IPV6_RSVP_ON");		return(SYS_ERROR);	}#endif	/* IPV6_RSVP_ON */#endif	/* IPV6_ROUTER_ALERT */	return(SYS_NOERROR);}staticintrsvp_off_ipv6(int fd){#ifdef	IPV6_ROUTER_ALERT	int off = FALSE;	if (FAILED(setsockopt(fd,IPPROTO_IPV6,IPV6_ROUTER_ALERT,			(char *) &off,sizeof(off)))) {		net_error(NET_ERROR_SYSTEM,"IPV6_ROUTER_ALERT");		return(SYS_ERROR);	}#else	/* IPV6_ROUTER_ALERT */#ifdef	IPV6_RSVP_OFF	if (FAILED(setsockopt(fd,IPPROTO_IPV6,IPV6_RSVP_OFF,(char *) NULL,0))) {		net_error(NET_ERROR_SYSTEM,"IPV6_RSVP_OFF");		return(SYS_ERROR);	}#endif	/* IPV6_RSVP_OFF */#endif	/* IPV6_ROUTER_ALERT */	return(SYS_NOERROR);}staticintsocket_recv_udp_ipv6(struct sockaddr_in6 *addr){	int fd;	fd = socket_ipv6(SOCK_DGRAM,PF_UNSPEC,NET_ADDR_UDP_IPv6);	if (FAILED(fd))		return(fd);	if (FAILED(bind(fd,(struct sockaddr *) addr,sizeof(*addr)))) {		net_error(NET_ERROR_SYSTEM,"bind");		return(failed(fd));	}	FD_SET(fd,&rset);	return(fd);}staticintjoin_multicast_ipv6(int fd,net_if *inf,struct in6_addr *g){	struct ipv6_mreq mreq;	mreq.ipv6mr_multiaddr = *g;#ifdef	WORKAROUNDS	mreq.ipv6mr_interface = NET_GET_ADDR_IPv6(&NET_GET_IF_PHY_ADDR(inf));#else	/* WORKAROUNDS */	mreq.ipv6mr_interface = NET_GET_IF_PHY_ID(inf);#endif	/* WORKAROUNDS */	/* Ignore errors on non-multicast interfaces */	setsockopt(fd,IPPROTO_IPV6,IPV6_ADD_MEMBERSHIP,		(char *) &mreq,sizeof(mreq));	finalize[fd] = drop_all_multicast_ipv6;	return(SYS_NOERROR);}staticintdrop_multicast_ipv6(int fd,net_if *inf,struct in6_addr *g){	struct ipv6_mreq mreq;	mreq.ipv6mr_multiaddr = *g;#ifdef	WORKAROUNDS	mreq.ipv6mr_interface = NET_GET_ADDR_IPv6(&NET_GET_IF_PHY_ADDR(inf));#else	/* WORKAROUNDS */	mreq.ipv6mr_interface = NET_GET_IF_PHY_ID(inf);#endif	/* WORKAROUNDS */	if (FAILED(setsockopt(fd,IPPROTO_IPV6,IPV6_DROP_MEMBERSHIP,			(char *) &mreq,sizeof(mreq)))) {		net_error(NET_ERROR_SYSTEM,"IPV6_DROP_MEMBERSHIP");		return(SYS_ERROR);	}	return(SYS_NOERROR);}staticintdrop_all_multicast_ipv6(int fd){	/* FIX: Finish */	return(SYS_ERROR);}staticintinit_ancillary_data_ipv6(int fd){	int on = TRUE;#ifdef	IPV6_PKTINFO	if (FAILED(setsockopt(fd,IPPROTO_IPV6,IPV6_PKTINFO,			(char *) &on,sizeof(on)))) {		net_error(NET_ERROR_SYSTEM,"IPV6_PKTINFO");		return(SYS_ERROR);	}#endif	/* IPV6_PKTINFO */	return(SYS_NOERROR);}#endif	/* USE_IPV6 */#ifdef	IP_PKTINFO/*	receive(): Read input from given file descriptor, and set *	incoming interface *inf and source address *from. * *	Use ancillary data to get incoming network interface. */staticintreceive(int fd,net_addr *from,void *msg,int len,net_if *inf){	int n;	struct iovec iov;	struct msghdr hdr;	struct cmsghdr *chdr;	struct in_pktinfo *p;	net_addr addr;	char buffer[10240];#ifdef	USE_IPV6	struct in6_pktinfo *p6;#endif	/* USE_IPV6 */	hdr.msg_name = (void *) &NET_GET_ADDR(from);	hdr.msg_namelen = sizeof(NET_GET_ADDR(from));	hdr.msg_control = buffer;	hdr.msg_controllen = sizeof(buffer);	hdr.msg_iov = &iov;	hdr.msg_iovlen = 1;	iov.iov_base = msg;	iov.iov_len = len;	n = recvmsg(fd,&hdr,0);	if (FAILED(n))		return(n);	adjust(from,protocol_type[fd]);	*inf = unknown;	if (hdr.msg_controllen == 0)		return(n);	for (chdr = CMSG_FIRSTHDR(&hdr); chdr != NULL;			chdr = CMSG_NXTHDR(&hdr,chdr)) {		if (chdr->cmsg_len == 0)			continue;		switch (chdr->cmsg_level) {			case IPPROTO_IP:				if (chdr->cmsg_type != IP_PKTINFO)					break;				p = (struct in_pktinfo *) CMSG_DATA(chdr);				if (p->ipi_ifindex == 0)					break;				NET_SET_ADDR_IPv4(&addr,					((struct sockaddr_in *)					if_indextoaddr(p->ipi_ifindex,					AF_INET))->sin_addr);				NET_SET_IF_PHY(inf,addr,p->ipi_ifindex);				break;#ifdef	USE_IPV6			case IPPROTO_IPV6:				if (chdr->cmsg_type != IPV6_PKTINFO)					break;				p6 = (struct in6_pktinfo *) CMSG_DATA(chdr);				if (p6->ipi6_ifindex == 0)					break;				NET_SET_ADDR_IPv6(&addr,					((struct sockaddr_in6 *)					if_indextoaddr(p6->ipi6_ifindex,					AF_INET6))->sin6_addr);				NET_SET_IF_PHY(inf,addr,p6->ipi6_ifindex);				break;#endif	/* USE_IPV6 */			default:				break;		}	}	return(n);}#endif	/* IP_PKTINFO */#ifdef	IP_DSTOPTSstaticintset_ancillary_data_ipv4(struct msghdr *hdr,net_addr_type type,	struct sockaddr_in *to,struct sockaddr_in *from,	void *msg,int len,net_if *inf,u_char hops,int ra){	/* FIX: fill in hdr->msg_control */	return(ulist[type]);}staticintadd_if_ipv4(net_if *inf,struct in_addr *g){	int status = SYS_NOERROR;	/* Receive Multicast RSVP/UDP/IPv4 (Specified Interface) */	if (FAILED(join_multicast_ipv4(fd_pu,inf,g)))		status = SYS_ERROR;	if (!rawmode) {		if (FAILED(join_multicast_ipv4(fd_pup,inf,g)))			status = SYS_ERROR;	}	return(status);}staticintdel_if_ipv4(net_if *inf,struct in_addr *g){	int status = SYS_NOERROR;	/* Receive Multicast RSVP/UDP/IPv4 (Specified Interface) */	if (FAILED(drop_multicast_ipv4(fd_pu,inf,g)))		status = SYS_ERROR;	if (!rawmode) {		if (FAILED(drop_multicast_ipv4(fd_pup,inf,g)))			status = SYS_ERROR;	}	return(status);}staticintadd_vif_ipv4(net_if *inf){	/* FIX: Finish */	return(SYS_ERROR);}staticintdel_vif_ipv4(net_if *inf){	/* FIX: Finish */	return(SYS_ERROR);}/* *	Perform initialization and shutdown. */staticint#ifdef	USE_IPV6initialize(int pu,int pup,struct in_addr *g,struct in6_addr *g6)#else	/* USE_IPV6 */initialize(int pu,int pup,struct in_addr *g)#endif	/* USE_IPV6 */{	return(SYS_NOERROR);}#ifdef	USE_IPV6staticintinit_ancillary_data_ipv6(int fd){	/* FIX: setsockopt(s) for ancillary data (IPV6_PKTINFO) */	return(SYS_ERROR);}staticintset_ancillary_data_ipv6(struct msghdr *hdr,net_addr_type type,	struct sockaddr_in6 *to,struct sockaddr_in6 *from,	void *msg,int len,net_if *inf,u_char hops,int ra){	/* FIX: fill in hdr->msg_control */	return(ulist[type]);}staticintadd_if_ipv6(net_if *inf,struct in6_addr *g){	int status = SYS_NOERROR;	/* Receive Multicast RSVP/UDP/IPv6 (Specified Interface) */	if (FAILED(join_multicast_ipv6(fd6_pu,inf,g)))		status = SYS_ERROR;	if (!rawmode) {		if (FAILED(join_multicast_ipv6(fd6_pup,inf,g)))			status = SYS_ERROR;	}	return(status);}staticintdel_if_ipv6(net_if *inf,struct in6_addr *g)

⌨️ 快捷键说明

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