📄 rsvp_objs.c
字号:
/* * @(#) $Id: rsvp_objs.c,v 1.1.1.1 2000/05/08 22:51:24 wenqing Exp $ *//************************ rsvp_objs.c ******************************** * * * Protocol Independent RSVP Object Manipulation * * * *********************************************************************//**************************************************************************** RSVPD -- ReSerVation Protocol Daemon USC Information Sciences Institute Marina del Rey, California Original Version: Shai Herzog, Nov. 1993. Current Version: Bob Lindell, July 1997. Copyright (c) 1997 by the University of Southern California All rights reserved. Permission to use, copy, modify, and distribute this software and its documentation in source and binary forms for any purpose and without fee is hereby granted, provided that both the above copyright notice and this permission notice appear in all copies, and that any documentation, advertising materials, and other materials related to such distribution and use acknowledge that the software was developed in part by the University of Southern California, Information Sciences Institute. The name of the University may not be used to endorse or promote products derived from this software without specific prior written permission. THE UNIVERSITY OF SOUTHERN CALIFORNIA makes no representations about the suitability of this software for any purpose. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Other copyrights might apply to parts of this software and are so noted when applicable.********************************************************************/#include "rsvp_daemon.h"#include "rsvp_api.h"inthop_if_create(RSVP_HOP *hop,net_if *inf,int lih){ net_addr *addr; switch(NET_GET_TYPE(inf)) { case NET_IF_PHY: addr = &NET_GET_IF_PHY_ADDR(inf); break; case NET_IF_VIF: addr = &NET_GET_IF_VIF_ADDR(inf); break; default: return(FALSE); } switch (NET_GET_TYPE(addr)) { case NET_ADDR_IPv4: Init_Object(hop,RSVP_HOP,RSVP_HOP_ipv4); hop->hop4_addr = NET_GET_ADDR_IPv4(addr); hop->hop4_LIH = lih; return(TRUE);#ifdef USE_IPV6 case NET_ADDR_IPv6: Init_Object(hop,RSVP_HOP,RSVP_HOP_ipv6); hop->hop6_addr = NET_GET_ADDR_IPv6(addr); hop->hop6_LIH = lih; return(TRUE);#endif /* USE_IPV6 */ default: return(FALSE); }}inthop_if_assign(RSVP_HOP *hop,net_if *inf,int lih){ net_addr *addr; if (Obj_Class(hop) != class_RSVP_HOP) return(FALSE); switch(NET_GET_TYPE(inf)) { case NET_IF_PHY: addr = &NET_GET_IF_PHY_ADDR(inf); break; case NET_IF_VIF: addr = &NET_GET_IF_VIF_ADDR(inf); break; default: return(FALSE); } switch(NET_GET_TYPE(addr)) { case NET_ADDR_IPv4: Init_Object(hop,RSVP_HOP,RSVP_HOP_ipv4); hop->hop4_addr = NET_GET_ADDR_IPv4(addr); hop->hop4_LIH = lih; return(TRUE);#ifdef USE_IPV6 case NET_ADDR_IPv6: Init_Object(hop,RSVP_HOP,RSVP_HOP_ipv6); hop->hop6_addr = NET_GET_ADDR_IPv6(addr); hop->hop6_LIH = lih; return(TRUE);#endif /* USE_IPV6 */ default: return(FALSE); }}inthop_confirm_assign(RSVP_HOP *hop,CONFIRM *confirm){ if (Obj_Class(hop) != class_RSVP_HOP) return(FALSE); if (Obj_Class(confirm) != class_CONFIRM) return(FALSE); switch(Obj_CType(confirm)) { case ctype_CONFIRM_ipv4: Init_Object(hop,RSVP_HOP,RSVP_HOP_ipv4); hop->hop4_addr = confirm->conf4_addr; return(TRUE);#ifdef USE_IPV6 case ctype_CONFIRM_ipv6: Init_Object(hop,RSVP_HOP,RSVP_HOP_ipv6); hop->hop6_addr = confirm->conf6_addr; return(TRUE);#endif /* USE_IPV6 */ default: return(FALSE); }}inthop_lih(RSVP_HOP *hop){ if (Obj_Class(hop) != class_RSVP_HOP) return(-1); switch(Obj_CType(hop)) { case ctype_RSVP_HOP_ipv4: return(hop->hop4_LIH);#ifdef USE_IPV6 case ctype_RSVP_HOP_ipv6: return(hop->hop6_LIH);#endif /* USE_IPV6 */ default: return(-1); }}net_addr *hop_addr(RSVP_HOP *hop){ static net_addr addr; if (Obj_Class(hop) != class_RSVP_HOP) return(NULL); switch(Obj_CType(hop)) { case ctype_RSVP_HOP_ipv4: NET_SET_ADDR_IPv4(&addr,hop->hop4_addr); return(&addr);#ifdef USE_IPV6 case ctype_RSVP_HOP_ipv6: NET_SET_ADDR_IPv6(&addr,hop->hop6_addr); return(&addr);#endif /* USE_IPV6 */ default: return(NULL); }}inthop_eq(RSVP_HOP *hop1,RSVP_HOP *hop2){ if (Obj_Class(hop1) != class_RSVP_HOP) return(FALSE); if (Obj_Class(hop1) != Obj_Class(hop2)) return(FALSE); if (Obj_CType(hop1) != Obj_CType(hop2)) return(FALSE); switch(Obj_CType(hop1)) { case ctype_RSVP_HOP_ipv4: return(memcmp((char *) &hop1->hop_u.hop_ipv4, (char *) &hop2->hop_u.hop_ipv4, sizeof(hop1->hop_u.hop_ipv4)) == 0);#ifdef USE_IPV6 case ctype_RSVP_HOP_ipv6: return(memcmp((char *) &hop1->hop_u.hop_ipv6, (char *) &hop2->hop_u.hop_ipv6, sizeof(hop1->hop_u.hop_ipv6)) == 0);#endif /* USE_IPV6 */ default: return(FALSE); }}inthop_addr_lt(RSVP_HOP *hop1,RSVP_HOP *hop2){ if (Obj_Class(hop1) != class_RSVP_HOP) return(FALSE); if (Obj_Class(hop1) != Obj_Class(hop2)) return(FALSE); if (Obj_CType(hop1) != Obj_CType(hop2)) return(FALSE); switch(Obj_CType(hop1)) { case ctype_RSVP_HOP_ipv4: return(memcmp((char *) &hop1->hop4_addr, (char *) &hop2->hop4_addr, sizeof(hop1->hop4_addr)) < 0);#ifdef USE_IPV6 case ctype_RSVP_HOP_ipv6: return(memcmp((char *) &hop1->hop6_addr, (char *) &hop2->hop6_addr, sizeof(hop1->hop6_addr)) < 0);#endif /* USE_IPV6 */ default: return(FALSE); }}inthop_addr_eq(RSVP_HOP *hop1,RSVP_HOP *hop2){ if (Obj_Class(hop1) != class_RSVP_HOP) return(FALSE); if (Obj_Class(hop1) != Obj_Class(hop2)) return(FALSE); if (Obj_CType(hop1) != Obj_CType(hop2)) return(FALSE); switch(Obj_CType(hop1)) { case ctype_RSVP_HOP_ipv4: return(IN_ARE_ADDR_EQUAL(&hop1->hop4_addr, &hop2->hop4_addr));#ifdef USE_IPV6 case ctype_RSVP_HOP_ipv6: return(IN6_ARE_ADDR_EQUAL(&hop1->hop6_addr, &hop2->hop6_addr));#endif /* USE_IPV6 */ default: return(FALSE); }}inthop_in_scope(RSVP_HOP *hop,SCOPE *scope){ char *cp,*end,*addr; int size; if (Obj_Class(hop) != class_RSVP_HOP) return(FALSE); if (Obj_Class(scope) != class_SCOPE) return(FALSE); switch(Obj_CType(hop)) { case ctype_RSVP_HOP_ipv4: if (Obj_CType(scope) != ctype_SCOPE_list_ipv4) return(FALSE); size = sizeof(SCOPE_list_ipv4); addr = (char *) &hop->hop4_addr; break;#ifdef USE_IPV6 case ctype_RSVP_HOP_ipv6: if (Obj_CType(scope) != ctype_SCOPE_list_ipv6) return(FALSE); size = sizeof(SCOPE_list_ipv6); addr = (char *) &hop->hop6_addr; break;#endif /* USE_IPV6 */ default: return(FALSE); } end = (char *) Next_Object(scope); for (cp = (char *) Obj_data(scope);cp < end; cp += size) if (memcmp(cp,addr,size) == 0) return(TRUE); return(FALSE);}char *hop_print(RSVP_HOP *hop){ static char buffer[MAX_HOSTPORTSTRLEN + sizeof(" LIH=XXXXXXXXXX")]; if (Obj_Class(hop) != class_RSVP_HOP) return(NULL); switch(Obj_CType(hop)) { case ctype_RSVP_HOP_ipv4: sprintf(buffer,"%s LIH=%d",IsHopAPI(hop) ? "(API)" : net_inaddr_host((char *) &hop->hop4_addr, AF_INET),hop->hop4_LIH); return(buffer);#ifdef USE_IPV6 case ctype_RSVP_HOP_ipv6: sprintf(buffer,"%s LIH=%d",IsHopAPI(hop) ? "(API)" : net_inaddr_host((char *) &hop->hop6_addr, AF_INET6),hop->hop6_LIH); return(buffer);#endif /* USE_IPV6 */ default: return(NULL); }}intsession_if_eq(SESSION *session,net_if *inf){ net_addr *addr; if (Obj_Class(session) != class_SESSION) return(FALSE); switch(NET_GET_TYPE(inf)) { case NET_IF_PHY: addr = &NET_GET_IF_PHY_ADDR(inf); break; case NET_IF_VIF: addr = &NET_GET_IF_VIF_ADDR(inf); break; default: return(FALSE); } switch(NET_GET_TYPE(addr)) { case NET_ADDR_IPv4: if ((Obj_CType(session) != ctype_SESSION_ipv4) && (Obj_CType(session) != ctype_SESSION_ipv4GPI)) return(FALSE); return(IN_ARE_ADDR_EQUAL(&session->sess4_addr, &NET_GET_ADDR_IPv4(addr)));#ifdef USE_IPV6 case NET_ADDR_IPv6: if ((Obj_CType(session) != ctype_SESSION_ipv6) && (Obj_CType(session) != ctype_SESSION_ipv6GPI)) return(FALSE); return(IN6_ARE_ADDR_EQUAL(&session->sess6_addr, &NET_GET_ADDR_IPv6(addr)));#endif /* USE_IPV6 */ default: return(FALSE); }}net_addr *session_addr(SESSION *session){ static net_addr addr; if (Obj_Class(session) != class_SESSION) return(NULL); switch(Obj_CType(session)) { case ctype_SESSION_ipv4: case ctype_SESSION_ipv4GPI: NET_SET_ADDR_IPv4(&addr,session->sess4_addr); return(&addr);#ifdef USE_IPV6 case ctype_SESSION_ipv6: case ctype_SESSION_ipv6GPI: NET_SET_ADDR_IPv6(&addr,session->sess6_addr); return(&addr);#endif /* USE_IPV6 */ default: return(NULL); }}intsession_eq(SESSION *session1,SESSION *session2){ if (Obj_Class(session1) != class_SESSION) return(FALSE); if (Obj_Class(session1) != Obj_Class(session2)) return(FALSE); if (Obj_CType(session1) != Obj_CType(session2)) return(FALSE); switch(Obj_CType(session1)) { case ctype_SESSION_ipv4: case ctype_SESSION_ipv4GPI: return(memcmp((char *) &session1->sess_u.sess_ipv4, (char *) &session2->sess_u.sess_ipv4, sizeof(session1->sess_u.sess_ipv4)) == 0);#ifdef USE_IPV6 case ctype_SESSION_ipv6: case ctype_SESSION_ipv6GPI: return(memcmp((char *) &session1->sess_u.sess_ipv6, (char *) &session2->sess_u.sess_ipv6, sizeof(session1->sess_u.sess_ipv6)) == 0);#endif /* USE_IPV6 */ default: return(FALSE); }}intsession_eq_except_flags(SESSION *session1,SESSION *session2){ if (Obj_Class(session1) != class_SESSION) return(FALSE); if (Obj_Class(session1) != Obj_Class(session2)) return(FALSE); if (Obj_CType(session1) != Obj_CType(session2)) return(FALSE); switch(Obj_CType(session1)) { case ctype_SESSION_ipv4: case ctype_SESSION_ipv4GPI: if (!IN_ARE_ADDR_EQUAL(&session1->sess4_addr, &session2->sess4_addr)) return(FALSE); if (session1->sess4_prot != session2->sess4_prot) return(FALSE); if (session1->sess4_port == session2->sess4_port) return(TRUE); return(FALSE);#ifdef USE_IPV6 case ctype_SESSION_ipv6: case ctype_SESSION_ipv6GPI: if (!IN6_ARE_ADDR_EQUAL(&session1->sess6_addr, &session2->sess6_addr)) return(FALSE); if (session1->sess6_prot != session2->sess6_prot) return(FALSE); if (session1->sess6_port == session2->sess6_port) return(TRUE); return(FALSE);#endif /* USE_IPV6 */ default: return(FALSE); }}intsession_eq_except_port(SESSION *session1,SESSION *session2){ if (Obj_Class(session1) != class_SESSION) return(FALSE); if (Obj_Class(session1) != Obj_Class(session2)) return(FALSE); if (Obj_CType(session1) != Obj_CType(session2)) return(FALSE); switch(Obj_CType(session1)) { case ctype_SESSION_ipv4: case ctype_SESSION_ipv4GPI: if (!IN_ARE_ADDR_EQUAL(&session1->sess4_addr, &session2->sess4_addr)) return(FALSE); if (session1->sess4_prot != session2->sess4_prot) return(FALSE); if (session1->sess4_port == 0) return(TRUE); if (session2->sess4_port == 0) return(TRUE); return(FALSE);#ifdef USE_IPV6 case ctype_SESSION_ipv6: case ctype_SESSION_ipv6GPI: if (!IN6_ARE_ADDR_EQUAL(&session1->sess6_addr, &session2->sess6_addr)) return(FALSE); if (session1->sess6_prot != session2->sess6_prot) return(FALSE); if (session1->sess6_port == 0) return(TRUE); if (session2->sess6_port == 0) return(TRUE); return(FALSE);#endif /* USE_IPV6 */ default: return(FALSE); }}char *session_print(SESSION *session){ static char buffer[MAX_HOSTPORTSTRLEN + sizeof("[XXX]")]; if (Obj_Class(session) != class_SESSION) return(NULL); switch(Obj_CType(session)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -