📄 rsvp_netio.c
字号:
packet.pkt_data = (common_header *) msg; packet.pkt_offset = 0; packet.pkt_map = (packet_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 + -