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

📄 rsvp_netio.c

📁 radius协议源码÷The Radius Stack will connect to a Radius Server. This stack implementation is built upo
💻 C
📖 第 1 页 / 共 3 页
字号:
	packet.pkt_data = (common_header *) msg;	packet.pkt_offset = 0;	packet.pkt_map = (packet_map *) &map;	packet.pkt_flags = PKTFLG_USE_UDP;	packet.pkt_ttl = packet.pkt_data->rsvp_snd_TTL;	if (Test_mode) {		int i;		net_addr *addr;		addr = net_addr_ip(from);		for (i= 0; i <if_num; i++) {			if (IsNumAPI(i))				continue;			if (IF_DOWN(i))				continue;			if (net_addr_equal(addr,&tsttun_vec[i]))				break;		}		if (i == if_num) {			fprintf(stderr,"Other Src: %s\n",				net_addr_print(addr));			return(SYS_NOERROR);		}		NET_SET_IF_PHY(inf,tsttun_vec[i],0);	}#ifdef	WORKAROUNDS	if (map_if_addr(from) != -1)		return(SYS_NOERROR);#endif	/* WORKAROUNDS */	/*	 *  Call common routine to do initial processing of RSVP packet.	 */	return(consume_input(&packet, from, inf));}staticintconsume_input(struct packet *packet,net_addr *from,net_if *inf){	int rc,vif;	switch(NET_GET_TYPE(inf)) {		case NET_IF_PHY:			vif = map_if_id(NET_GET_IF_PHY_ID(inf));			break;		case NET_IF_VIF:			vif = map_if_vif(NET_GET_IF_VIF_ID(inf));			break;		default:			vif = -1;	}	if (l_debug >= LOG_HEXD) {		log(LOG_DEBUG, 0, "Raw input from %s on vif %d\n",				net_addr_print(from),vif);		hexf(stderr, (char *)packet->pkt_data, packet->pkt_len);	}	rc = rsvp_pkt_process(packet, from, vif);	if (rc < 0) {		log(LOG_WARNING, 0, "\n%s Parse error %d in raw pkt from %s\n",			rsvp_timestamp(), rc, net_addr_print(from));		hexf(stdout, (char *)packet->pkt_data, packet->pkt_len);	}	return(rc);}/* * rsvp_pkt_process(): Primary RSVP protocol processing routine for input. *			Called with either a new packet received from the *			network, or a stored packet from the API. */intrsvp_pkt_process(	struct packet *pkt,		/* packet struct. Flags => UDP|raw */	net_addr *fromp,		/* Addr(src IP addr) or NULL (API) */	int inp_if)			/* Incoming interface (-1 => mcast) */	{	int		rerrno = PKT_OK;	packet_map	*mapp = pkt->pkt_map;	int		Not_from_API =  (fromp)?1:0;	rerrno = rsvp_pkt_map(pkt);	if (IsDebug(DEBUG_ALL)) {		char temp[32];		int  evtype;		if (Not_from_API) {			if (inp_if < 0)				sprintf(temp, "< %.16s",						net_addr_host(fromp));			else				sprintf(temp, "%s<=%d < %.16s",						IF_NAME(inp_if), inp_if,						net_addr_host(fromp));			evtype = (pkt->pkt_flags&PKTFLG_USE_UDP)? 					LOGEV_Recv_UDP:LOGEV_Recv_Raw;		}		else {			sprintf(temp, "<API ttl=");			evtype = LOGEV_Recv_API;		}		if (mapp->rsvp_session) {			log_event(evtype,			Type_name[mapp->rsvp_msgtype],                                 mapp->rsvp_session, "%s/%d\n",temp, pkt->pkt_ttl);		        if (IsDebug(DEBUG_IO)) {			        print_rsvp(pkt);		        }                }	}	if (rerrno > 0) {		/*	Packet contains object with unknown class,		 *	and high-order bits of class number indicate		 *	that packet should be rejected and error		 *	message sent.		 */		if (!(mapp->rsvp_hop)||!(mapp->rsvp_session))			/* No HOP or no SESSION... can't send err message. */			return(rerrno);		switch (mapp->rsvp_msgtype) {	           case RSVP_PATH:			rsvp_path_err(inp_if, Get_Errcode(rerrno),					Get_Errval(rerrno), pkt);			break;		    case RSVP_RESV:			rsvp_resv_err(Get_Errcode(rerrno), Get_Errval(rerrno), 					0, (FiltSpecStar *) -1, pkt);			break;		    default:			/*	Spec says don't send error for Teardown msg */			/*	Spec says don't send error for error msg */			break;		}	}	if (rerrno == PKT_OK)		rerrno = rsvp_pkt_process_1(pkt, fromp, inp_if);	return(rerrno);}	/*	Inner routine for rsvp_pkt_process() */staticintrsvp_pkt_process_1(	struct packet *pkt,		/* packet struct. Flags => UDP|raw */	net_addr *fromp,		/* Addr(src IP addr) or NULL (API) */	int inp_if)			/* Incoming interface (-1 => mcast) */	{	packet_map	*mapp = pkt->pkt_map;	int		Not_from_API =  (fromp)?1:0;	int		i, rc;	int rv;	bitmap bmp;	bmp_rst(&bmp);	/*	If there is a hop address and it's not from API, hop address	 *	must be non-zero.	 */	if ((Not_from_API) && (pkt->pkt_map->rsvp_hop) && 				IsHopAPI(pkt->rsvp_phop))		return PKT_ERR_HOPZERO;	/*	 *	For each msg type, do format checking and various other	 *	checks, then call appropriate handling routine.	 */	rc = 0;	switch (mapp->rsvp_msgtype) {#ifdef RSVP_DIAGS                case (RSVP_DREQ):/*      If this was an incoming DREQ from the client, it will have the UDP flag set. *      we disable it */                        pkt->pkt_flags &= ~(PKTFLG_USE_UDP);                        rc = accept_diag_request(inp_if, pkt, fromp);                        break;                        case (RSVP_DREP):                        rc = accept_diag_reply(inp_if, pkt);                            break;#endif  /* defined RSVP_DIAGS */		case (RSVP_PATH):			/* If number of sender descriptors is zero, 			 * ignore the message.  This case is a (deliberate) 			 * wierdness of the Version 1 RSVP spec. 			 *	XXX Should we log or count these anomalies ?			 */			if (pkt->rsvp_nflwd == 0)				return PKT_OK;  /* Wierdness */			if (!(mapp->rsvp_hop)||!(mapp->rsvp_timev))				return PKT_ERR_MISSOBJ;			if (!(mapp->rsvp_list[0].Sender_list.rsvp_stempl) ||			    !(mapp->rsvp_list[0].Sender_list.rsvp_stspec) )				return PKT_ERR_MISSOBJ;			if (pkt->pkt_ttl == 0)				return PKT_ERR_TTLZERO;			/*			 *	If the DstPort in the SESSION object is zero			 *	but SrcPort in SENDER_TEMPLATE is non-zero, 			 *	return "Bad Src Ports" (neighbor) error.			 */			if (session_get_port(pkt->rsvp_sess) == 0 &&			    filterspec_port(STempl_of(SenderDesc_of(pkt))) != 0)				return PKT_ERR_BADSPORT;	/*	Multihomed host without mrouted: cannot tell the incoming	 *	interface on which a multicast Path message really arrived	 *	under SunOS (or probably any system derived from 4.3 BSD).	 *	It would assume default (if# 0); then when send Resv msg,	 *	may attach wrong NHOP address.  First try mapping destination	 *	address into one of our interfaces.  If that fails, use kludge:	 *	do unicast route lookup and use resulting interface addr.	 *	THIS ASSUMES UNICAST ROUTING IN THE OTHER DIRECTION MATCHES	 *	MULTICAST ROUTING, and that vif's are a subset of if's.	 */#define TYPE_V4(x) ((x == ctype_SESSION_ipv4) || (x == ctype_SESSION_ipv4GPI))#ifdef  USE_IPV6#define TYPE_V6(x) ((x == ctype_SESSION_ipv6) || (x == ctype_SESSION_ipv6GPI))#endif  /* USE_IPV6 */			if (inp_if < 0 && if_num > 2)  { 			    inp_if = session_if(pkt->rsvp_sess);			    if (inp_if < 0) {					/* inp_if = unicast_route(hop_addr(pkt->rsvp_phop)); */					rv = rsrr_route_query((void *)0, (void *)0, (net_addr *)0,						  hop_addr(pkt->rsvp_phop), 0, (int *)0, &bmp);					if (rv == -1) {						/* log(LOG_ERR,errno,"Unicast route lookup failure"); */						if (TYPE_V4(Obj_CType(pkt->rsvp_sess))) {							inp_if = local_v4;						}#ifdef	USE_IPV6						else if (TYPE_V6(Obj_CType(pkt->rsvp_sess))) {							inp_if = local_v6;						}#endif	/* USE_IPV6 */					}					else						inp_if = bmptoif(&bmp);					if (inp_if < 0) {						log(LOG_WARNING, 0, "No inc iface\n");						return(PKT_OK);  /* XXX Not OK */					}			    }			}			if ((inp_if >=0 && inp_if < api_num) 				&& session_multicast(pkt->rsvp_sess)				&& !NoV4Mroute				&& TYPE_V4(Obj_CType(pkt->rsvp_sess))) {				inp_if += shift;			}			rc = accept_path(inp_if, pkt);			break;		case (RSVP_RESV):			/* If number of flow descriptors is zero, 			 * ignore the message.  This case is a (deliberate) 			 * wierdness of the Version 1 RSVP spec. 			 *	XXX Should we log or count these anomalies ?			 */			if (pkt->rsvp_nflwd == 0)				return PKT_OK;  /* Wierdness */#ifdef DEBUG			/* Nhop address should be normally be identical			 * to IP src addr, but non-RSVP clouds can do			 * funny things...	 		 */			if ((Not_from_API) &&					!net_addr_equal(net_addr_ip(fromp),					hop_addr(pkt->rsvp_nhop)))				log(LOG_WARNING, 0,					"Nhop != IP src in Resv\n");#endif /* DEBUG */			if (!(mapp->rsvp_style) ||			    !(mapp->rsvp_hop)||!(mapp->rsvp_timev))				return PKT_ERR_MISSOBJ;			/*			 *	If the DstPort in the SESSION object is zero			 *	but SrcPort in a FILTER_SPEC is non-zero, 			 *	return "Bad Src Ports" (neighbor) error.			 */			if (session_get_port(pkt->rsvp_sess) == 0){				for (i =0; i < pkt->rsvp_nflwd ; i++) {					FILTER_SPEC *filtp =						filter_of(FlowDesc_of(pkt,i));					if (filtp && filterspec_port(filtp) != 0)						return PKT_ERR_BADSPORT;				}			}			/*			 *	Check reasonableness of the LIH			 */			if (!IsHopAPI(pkt->rsvp_nhop) &&				    hop_lih(pkt->rsvp_nhop) > if_num)				return PKT_ERR_BADLIH;			rc = accept_resv(inp_if, pkt);			break;		case (RSVP_PATH_TEAR):			if (pkt->rsvp_nflwd == 0)				return PKT_OK;  /* Wierdness */			if (!(mapp->rsvp_hop))				return PKT_ERR_MISSOBJ;			mapp->rsvp_timev = NULL;  /* ignore TIMEV */			if ((inp_if >=0 && inp_if < api_num) 				&& session_multicast(pkt->rsvp_sess)				&& !NoV4Mroute				&& TYPE_V4(Obj_CType(pkt->rsvp_sess))) {				inp_if += shift;			}			rc = accept_path_tear(inp_if, pkt);			break;		case (RSVP_PATH_ERR):			if (pkt->rsvp_nflwd == 0)				return PKT_OK;  /* Wierdness */			if (!(mapp->rsvp_errspec) )				return PKT_ERR_MISSOBJ;			mapp->rsvp_timev = NULL;  /* ignore TIMEV */			if ((inp_if >=0 && inp_if < api_num) 				&& session_multicast(pkt->rsvp_sess)				&& !NoV4Mroute				&& TYPE_V4(Obj_CType(pkt->rsvp_sess))) {				inp_if += shift;			}			rc = accept_path_err(inp_if, pkt);			break;		case (RSVP_RESV_TEAR):			/* Note that a ResvTear can legitimately have no			 * flow descriptor, for WF style.			 */			if (!(mapp->rsvp_style) ||			    !(mapp->rsvp_hop) )				return PKT_ERR_MISSOBJ;			/*			 *	Check reasonableness of the LIH			 */			if (!IsHopAPI(pkt->rsvp_nhop) &&			    hop_lih(pkt->rsvp_nhop) > if_num)				return PKT_ERR_BADLIH;			mapp->rsvp_timev = NULL;  /* ignore TIMEV */ 			rc = accept_resv_tear(inp_if, pkt);			break;		case (RSVP_RESV_ERR):			if (pkt->rsvp_nflwd == 0)				return PKT_OK;  /* Wierdness */			if (!(mapp->rsvp_style) ||			    !(mapp->rsvp_errspec) ||			    !(mapp->rsvp_hop) )				return PKT_ERR_MISSOBJ;			mapp->rsvp_timev = NULL;  /* ignore TIMEV */			rc = accept_resv_err(inp_if, pkt);			break;		case (RSVP_CONFIRM):			if (!(mapp->rsvp_style) ||			    !(mapp->rsvp_errspec) ||			    !(mapp->rsvp_confirm))				return PKT_ERR_MISSOBJ;						mapp->rsvp_timev = NULL;  /* ignore TIMEV */			rc = accept_resv_conf(inp_if, pkt);			break;		default:			return PKT_ERR_MSGTYPE;	}	if (rc < -1)		return rc;	return PKT_OK;}

⌨️ 快捷键说明

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