diff options
author | Michael Tuexen <tuexen@fh-muenster.de> | 2020-05-18 00:47:04 +0200 |
---|---|---|
committer | Michael Tuexen <tuexen@fh-muenster.de> | 2020-05-18 00:47:04 +0200 |
commit | a05154264872ec8e5d4143ac841a306f54ace231 (patch) | |
tree | d5017965d66d9865bfb6a5d461010a95f80d79d0 | |
parent | df49eb6e19b84905d0b20dd79edf81ec7a76f133 (diff) | |
download | usrsctp-a05154264872ec8e5d4143ac841a306f54ace231.tar.gz |
Sync with FreeBSD.
-rwxr-xr-x | usrsctplib/netinet/sctp_asconf.c | 29 | ||||
-rwxr-xr-x | usrsctplib/netinet/sctp_output.c | 95 | ||||
-rwxr-xr-x | usrsctplib/netinet/sctp_pcb.c | 51 | ||||
-rwxr-xr-x | usrsctplib/netinet/sctp_structs.h | 18 | ||||
-rwxr-xr-x | usrsctplib/netinet/sctp_timer.c | 16 | ||||
-rwxr-xr-x | usrsctplib/netinet/sctp_var.h | 9 |
6 files changed, 168 insertions, 50 deletions
diff --git a/usrsctplib/netinet/sctp_asconf.c b/usrsctplib/netinet/sctp_asconf.c index f5c93aac..cb1e53dd 100755 --- a/usrsctplib/netinet/sctp_asconf.c +++ b/usrsctplib/netinet/sctp_asconf.c @@ -34,7 +34,7 @@ #ifdef __FreeBSD__ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: head/sys/netinet/sctp_asconf.c 360878 2020-05-10 17:19:19Z tuexen $"); +__FBSDID("$FreeBSD: head/sys/netinet/sctp_asconf.c 361145 2020-05-17 22:31:38Z tuexen $"); #endif #include <netinet/sctp_os.h> @@ -996,8 +996,12 @@ sctp_asconf_nets_cleanup(struct sctp_tcb *stcb, struct sctp_ifn *ifn) ((ifn == NULL) || (SCTP_GET_IF_INDEX_FROM_ROUTE(&net->ro) != ifn->ifn_index))) { /* clear any cached route */ +#if defined(__FreeBSD__) + RO_NHFREE(&net->ro); +#else RTFREE(net->ro.ro_rt); net->ro.ro_rt = NULL; +#endif } /* clear any cached source address */ if (net->src_addr_selected) { @@ -1111,10 +1115,14 @@ sctp_path_check_and_react(struct sctp_tcb *stcb, struct sctp_ifa *newifa) if (addrnum == 1) { TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { /* clear any cached route and source address */ +#if defined(__FreeBSD__) + RO_NHFREE(&net->ro); +#else if (net->ro.ro_rt) { RTFREE(net->ro.ro_rt); net->ro.ro_rt = NULL; } +#endif if (net->src_addr_selected) { sctp_free_ifa(net->ro._s_addr); net->ro._s_addr = NULL; @@ -1133,10 +1141,14 @@ sctp_path_check_and_react(struct sctp_tcb *stcb, struct sctp_ifa *newifa) /* Multiple local addresses exsist in the association. */ TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { /* clear any cached route and source address */ +#if defined(__FreeBSD__) + RO_NHFREE(&net->ro); +#else if (net->ro.ro_rt) { RTFREE(net->ro.ro_rt); net->ro.ro_rt = NULL; } +#endif if (net->src_addr_selected) { sctp_free_ifa(net->ro._s_addr); net->ro._s_addr = NULL; @@ -1151,7 +1163,11 @@ sctp_path_check_and_react(struct sctp_tcb *stcb, struct sctp_ifa *newifa) SCTP_RTALLOC((sctp_route_t *)&net->ro, stcb->sctp_ep->def_vrf_id, stcb->sctp_ep->fibnum); +#if defined(__FreeBSD__) + if (net->ro.ro_nh == NULL) +#else if (net->ro.ro_rt == NULL) +#endif continue; changed = 0; @@ -2240,18 +2256,19 @@ sctp_asconf_iterator_stcb(struct sctp_inpcb *inp, struct sctp_tcb *stcb, } else if (type == SCTP_DEL_IP_ADDRESS) { struct sctp_nets *net; TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { - sctp_rtentry_t *rt; - /* delete this address if cached */ if (net->ro._s_addr == ifa) { sctp_free_ifa(net->ro._s_addr); net->ro._s_addr = NULL; net->src_addr_selected = 0; - rt = net->ro.ro_rt; - if (rt) { - RTFREE(rt); +#if defined(__FreeBSD__) + RO_NHFREE(&net->ro); +#else + if (net->ro.ro_rt) { + RTFREE(net->ro.ro_rt); net->ro.ro_rt = NULL; } +#endif /* * Now we deleted our src address, * should we not also now reset the diff --git a/usrsctplib/netinet/sctp_output.c b/usrsctplib/netinet/sctp_output.c index f9ec0068..839affb6 100755 --- a/usrsctplib/netinet/sctp_output.c +++ b/usrsctplib/netinet/sctp_output.c @@ -34,7 +34,7 @@ #ifdef __FreeBSD__ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: head/sys/netinet/sctp_output.c 360869 2020-05-10 10:03:10Z tuexen $"); +__FBSDID("$FreeBSD: head/sys/netinet/sctp_output.c 361145 2020-05-17 22:31:38Z tuexen $"); #endif #include <netinet/sctp_os.h> @@ -3474,13 +3474,21 @@ sctp_source_address_selection(struct sctp_inpcb *inp, * addresses. If the bound set is NOT assigned to the interface then * we must use rotation amongst the bound addresses.. */ +#if defined(__FreeBSD__) + if (ro->ro_nh == NULL) { +#else if (ro->ro_rt == NULL) { +#endif /* * Need a route to cache. */ SCTP_RTALLOC(ro, vrf_id, inp->fibnum); } +#if defined(__FreeBSD__) + if (ro->ro_nh == NULL) { +#else if (ro->ro_rt == NULL) { +#endif return (NULL); } #if defined(__Userspace_os_Windows) @@ -4305,10 +4313,14 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, sctp_free_ifa(net->ro._s_addr); net->ro._s_addr = NULL; net->src_addr_selected = 0; +#if defined(__FreeBSD__) + RO_NHFREE(ro); +#else if (ro->ro_rt) { RTFREE(ro->ro_rt); ro->ro_rt = NULL; } +#endif } if (net->src_addr_selected == 0) { /* Cache the source address */ @@ -4388,7 +4400,11 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, * that somewhere and abort the association right away * (assuming this is an INIT being sent). */ +#if defined(__FreeBSD__) + if (ro->ro_nh == NULL) { +#else if (ro->ro_rt == NULL) { +#endif /* * src addr selection failed to find a route (or * valid source addr), so we can't get there from @@ -4406,8 +4422,13 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, (uint32_t) (ntohl(ip->ip_src.s_addr))); SCTPDBG(SCTP_DEBUG_OUTPUT3, "Destination is %x\n", (uint32_t)(ntohl(ip->ip_dst.s_addr))); +#if defined(__FreeBSD__) + SCTPDBG(SCTP_DEBUG_OUTPUT3, "RTP route is %p through\n", + (void *)ro->ro_nh); +#else SCTPDBG(SCTP_DEBUG_OUTPUT3, "RTP route is %p through\n", (void *)ro->ro_rt); +#endif if (SCTP_GET_HEADER_FOR_OUTPUT(o_pak)) { /* failed to prepend data, give up */ @@ -4480,8 +4501,8 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, SCTPDBG(SCTP_DEBUG_OUTPUT3, "IP output returns %d\n", ret); if (net == NULL) { /* free tempy routes */ -#if defined(__FreeBSD__) && __FreeBSD_version > 901000 - RO_RTFREE(ro); +#if defined(__FreeBSD__) + RO_NHFREE(ro); #else if (ro->ro_rt) { RTFREE(ro->ro_rt); @@ -4489,11 +4510,19 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, } #endif } else { +#if defined(__FreeBSD__) + if ((ro->ro_nh != NULL) && (net->ro._s_addr) && +#else if ((ro->ro_rt != NULL) && (net->ro._s_addr) && +#endif ((net->dest_state & SCTP_ADDR_NO_PMTUD) == 0)) { uint32_t mtu; +#if defined(__FreeBSD__) + mtu = SCTP_GATHER_MTU_FROM_ROUTE(net->ro._s_addr, &net->ro._l_addr.sa, ro->ro_nh); +#else mtu = SCTP_GATHER_MTU_FROM_ROUTE(net->ro._s_addr, &net->ro._l_addr.sa, ro->ro_rt); +#endif if (mtu > 0) { if (net->port) { mtu -= sizeof(struct udphdr); @@ -4505,7 +4534,11 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, net->mtu = mtu; } } +#if defined(__FreeBSD__) + } else if (ro->ro_nh == NULL) { +#else } else if (ro->ro_rt == NULL) { +#endif /* route was freed */ if (net->ro._s_addr && net->src_addr_selected) { @@ -4667,10 +4700,14 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, sctp_free_ifa(net->ro._s_addr); net->ro._s_addr = NULL; net->src_addr_selected = 0; +#if defined(__FreeBSD__) + RO_NHFREE(ro); +#else if (ro->ro_rt) { RTFREE(ro->ro_rt); ro->ro_rt = NULL; } +#endif } if (net->src_addr_selected == 0) { #ifdef SCTP_EMBEDDED_V6_SCOPE @@ -4768,7 +4805,11 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, } lsa6->sin6_port = inp->sctp_lport; +#if defined(__FreeBSD__) + if (ro->ro_nh == NULL) { +#else if (ro->ro_rt == NULL) { +#endif /* * src addr selection failed to find a route (or * valid source addr), so we can't get there from @@ -4945,8 +4986,8 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, } if (net == NULL) { /* Now if we had a temp route free it */ -#if defined(__FreeBSD__) && __FreeBSD_version > 901000 - RO_RTFREE(ro); +#if defined(__FreeBSD__) + RO_NHFREE(ro); #else if (ro->ro_rt) { RTFREE(ro->ro_rt); @@ -4955,7 +4996,11 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, #endif } else { /* PMTU check versus smallest asoc MTU goes here */ +#if defined(__FreeBSD__) + if (ro->ro_nh == NULL) { +#else if (ro->ro_rt == NULL) { +#endif /* Route was freed */ if (net->ro._s_addr && net->src_addr_selected) { @@ -4964,11 +5009,19 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, } net->src_addr_selected = 0; } +#if defined(__FreeBSD__) + if ((ro->ro_nh != NULL) && (net->ro._s_addr) && +#else if ((ro->ro_rt != NULL) && (net->ro._s_addr) && +#endif ((net->dest_state & SCTP_ADDR_NO_PMTUD) == 0)) { uint32_t mtu; +#if defined(__FreeBSD__) + mtu = SCTP_GATHER_MTU_FROM_ROUTE(net->ro._s_addr, &net->ro._l_addr.sa, ro->ro_nh); +#else mtu = SCTP_GATHER_MTU_FROM_ROUTE(net->ro._s_addr, &net->ro._l_addr.sa, ro->ro_rt); +#endif if (mtu > 0) { if (net->port) { mtu -= sizeof(struct udphdr); @@ -6693,10 +6746,10 @@ sctp_prune_prsctp(struct sctp_tcb *stcb, if (chk->rec.data.timetodrop.tv_sec > (long)srcv->sinfo_timetolive) { /* * Lower numbers equates to higher - * priority so if the one we are - * looking at has a larger - * priority we want to drop the data - * and NOT retransmit it. + * priority. So if the one we are + * looking at has a larger priority, + * we want to drop the data and NOT + * retransmit it. */ if (chk->data) { /* @@ -15021,7 +15074,11 @@ sctp_v6src_match_nexthop(struct sockaddr_in6 *src6, sctp_route_t *ro) struct nd_pfxrouter *pfxrtr = NULL; struct sockaddr_in6 gw6; +#if defined(__FreeBSD__) + if (ro == NULL || ro->ro_nh == NULL || src6->sin6_family != AF_INET6) +#else if (ro == NULL || ro->ro_rt == NULL || src6->sin6_family != AF_INET6) +#endif return (0); /* get prefix entry of address */ @@ -15060,10 +15117,16 @@ sctp_v6src_match_nexthop(struct sockaddr_in6 *src6, sctp_route_t *ro) SCTPDBG(SCTP_DEBUG_OUTPUT2, "prefix router is "); SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, (struct sockaddr *)&gw6); SCTPDBG(SCTP_DEBUG_OUTPUT2, "installed router is "); +#if defined(__FreeBSD__) + SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, &ro->ro_nh->gw_sa); +#else SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, ro->ro_rt->rt_gateway); - if (sctp_cmpaddr((struct sockaddr *)&gw6, ro->ro_rt->rt_gateway)) { +#endif #if defined(__FreeBSD__) + if (sctp_cmpaddr((struct sockaddr *)&gw6, &ro->ro_nh->gw_sa)) { ND6_RUNLOCK(); +#else + if (sctp_cmpaddr((struct sockaddr *)&gw6, ro->ro_rt->rt_gateway)) { #endif SCTPDBG(SCTP_DEBUG_OUTPUT2, "pfxrouter is installed\n"); return (1); @@ -15085,7 +15148,11 @@ sctp_v4src_match_nexthop(struct sctp_ifa *sifa, sctp_route_t *ro) struct ifaddr *ifa; struct in_addr srcnetaddr, gwnetaddr; +#if defined(__FreeBSD__) + if (ro == NULL || ro->ro_nh == NULL || +#else if (ro == NULL || ro->ro_rt == NULL || +#endif sifa->address.sa.sa_family != AF_INET) { return (0); } @@ -15097,10 +15164,18 @@ sctp_v4src_match_nexthop(struct sctp_ifa *sifa, sctp_route_t *ro) SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, &sifa->address.sa); SCTPDBG(SCTP_DEBUG_OUTPUT1, "network address is %x\n", srcnetaddr.s_addr); +#if defined(__FreeBSD__) + sin = &ro->ro_nh->gw4_sa; +#else sin = (struct sockaddr_in *)ro->ro_rt->rt_gateway; +#endif gwnetaddr.s_addr = (sin->sin_addr.s_addr & mask->sin_addr.s_addr); SCTPDBG(SCTP_DEBUG_OUTPUT1, "match_nexthop4: nexthop is "); +#if defined(__FreeBSD__) + SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, &ro->ro_nh->gw_sa); +#else SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, ro->ro_rt->rt_gateway); +#endif SCTPDBG(SCTP_DEBUG_OUTPUT1, "network address is %x\n", gwnetaddr.s_addr); if (srcnetaddr.s_addr == gwnetaddr.s_addr) { return (1); diff --git a/usrsctplib/netinet/sctp_pcb.c b/usrsctplib/netinet/sctp_pcb.c index d9dec63a..431765f2 100755 --- a/usrsctplib/netinet/sctp_pcb.c +++ b/usrsctplib/netinet/sctp_pcb.c @@ -34,7 +34,7 @@ #ifdef __FreeBSD__ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: head/sys/netinet/sctp_pcb.c 359405 2020-03-28 20:25:45Z tuexen $"); +__FBSDID("$FreeBSD: head/sys/netinet/sctp_pcb.c 361145 2020-05-17 22:31:38Z tuexen $"); #endif #include <netinet/sctp_os.h> @@ -4670,18 +4670,22 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr, } else { imtu = 0; } - rmtu = SCTP_GATHER_MTU_FROM_ROUTE(net->ro._s_addr, &net->ro._l_addr.sa, net->ro.ro_rt); #if defined(__FreeBSD__) + rmtu = SCTP_GATHER_MTU_FROM_ROUTE(net->ro._s_addr, &net->ro._l_addr.sa, net->ro.ro_nh); hcmtu = sctp_hc_get_mtu(&net->ro._l_addr, stcb->sctp_ep->fibnum); #else + rmtu = SCTP_GATHER_MTU_FROM_ROUTE(net->ro._s_addr, &net->ro._l_addr.sa, net->ro.ro_rt); hcmtu = 0; #endif net->mtu = sctp_min_mtu(hcmtu, rmtu, imtu); +#if defined(__FreeBSD__) +#else if (rmtu == 0) { /* Start things off to match mtu of interface please. */ SCTP_SET_MTU_OF_ROUTE(&net->ro._l_addr.sa, net->ro.ro_rt, net->mtu); } +#endif } } #endif @@ -4781,26 +4785,36 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr, *netp = net; } netfirst = TAILQ_FIRST(&stcb->asoc.nets); +#if defined(__FreeBSD__) + if (net->ro.ro_nh == NULL) { +#else if (net->ro.ro_rt == NULL) { +#endif /* Since we have no route put it at the back */ TAILQ_INSERT_TAIL(&stcb->asoc.nets, net, sctp_next); } else if (netfirst == NULL) { /* We are the first one in the pool. */ TAILQ_INSERT_HEAD(&stcb->asoc.nets, net, sctp_next); +#if defined(__FreeBSD__) + } else if (netfirst->ro.ro_nh == NULL) { +#else } else if (netfirst->ro.ro_rt == NULL) { +#endif /* * First one has NO route. Place this one ahead of the first * one. */ TAILQ_INSERT_HEAD(&stcb->asoc.nets, net, sctp_next); -#ifndef __Panda__ +#if defined(__FreeBSD__) + } else if (net->ro.ro_nh->nh_ifp != netfirst->ro.ro_nh->nh_ifp) { +#else } else if (net->ro.ro_rt->rt_ifp != netfirst->ro.ro_rt->rt_ifp) { +#endif /* * This one has a different interface than the one at the * top of the list. Place it ahead. */ TAILQ_INSERT_HEAD(&stcb->asoc.nets, net, sctp_next); -#endif } else { /* * Ok we have the same interface as the first one. Move @@ -4816,34 +4830,39 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr, /* End of the list */ TAILQ_INSERT_TAIL(&stcb->asoc.nets, net, sctp_next); break; +#if defined(__FreeBSD__) + } else if (netlook->ro.ro_nh == NULL) { +#else } else if (netlook->ro.ro_rt == NULL) { +#endif /* next one has NO route */ TAILQ_INSERT_BEFORE(netfirst, net, sctp_next); break; - } -#ifndef __Panda__ - else if (netlook->ro.ro_rt->rt_ifp != net->ro.ro_rt->rt_ifp) +#if defined(__FreeBSD__) + } else if (netlook->ro.ro_nh->nh_ifp != net->ro.ro_nh->nh_ifp) { #else - else + } else if (netlook->ro.ro_rt->rt_ifp != net->ro.ro_rt->rt_ifp) { #endif - { TAILQ_INSERT_AFTER(&stcb->asoc.nets, netlook, - net, sctp_next); + net, sctp_next); break; } -#ifndef __Panda__ /* Shift forward */ netfirst = netlook; -#endif } while (netlook != NULL); } /* got to have a primary set */ if (stcb->asoc.primary_destination == 0) { stcb->asoc.primary_destination = net; +#if defined(__FreeBSD__) + } else if ((stcb->asoc.primary_destination->ro.ro_nh == NULL) && + (net->ro.ro_nh) && +#else } else if ((stcb->asoc.primary_destination->ro.ro_rt == NULL) && - (net->ro.ro_rt) && - ((net->dest_state & SCTP_ADDR_UNCONFIRMED) == 0)) { + (net->ro.ro_rt) && +#endif + ((net->dest_state & SCTP_ADDR_UNCONFIRMED) == 0)) { /* No route to current primary adopt new primary */ stcb->asoc.primary_destination = net; } @@ -6273,6 +6292,9 @@ sctp_del_local_addr_ep(struct sctp_inpcb *inp, struct sctp_ifa *ifa) TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { if (net->ro._s_addr == laddr->ifa) { /* Yep, purge src address selected */ +#if defined(__FreeBSD__) + RO_NHFREE(&net->ro); +#else sctp_rtentry_t *rt; /* delete this address if cached */ @@ -6281,6 +6303,7 @@ sctp_del_local_addr_ep(struct sctp_inpcb *inp, struct sctp_ifa *ifa) RTFREE(rt); net->ro.ro_rt = NULL; } +#endif sctp_free_ifa(net->ro._s_addr); net->ro._s_addr = NULL; net->src_addr_selected = 0; diff --git a/usrsctplib/netinet/sctp_structs.h b/usrsctplib/netinet/sctp_structs.h index a2ff34fd..4d6d5789 100755 --- a/usrsctplib/netinet/sctp_structs.h +++ b/usrsctplib/netinet/sctp_structs.h @@ -34,7 +34,7 @@ #ifdef __FreeBSD__ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: head/sys/netinet/sctp_structs.h 359379 2020-03-27 21:48:52Z tuexen $"); +__FBSDID("$FreeBSD: head/sys/netinet/sctp_structs.h 360292 2020-04-25 09:06:11Z melifaro $"); #endif #ifndef _NETINET_SCTP_STRUCTS_H_ @@ -228,26 +228,16 @@ struct iterator_control { #define SCTP_ITERATOR_STOP_CUR_INP 0x00000008 struct sctp_net_route { - sctp_rtentry_t *ro_rt; #if defined(__FreeBSD__) -#if __FreeBSD_version < 1100093 -#if __FreeBSD_version >= 800000 - void *ro_lle; -#endif -#if __FreeBSD_version >= 900000 - void *ro_ia; - int ro_flags; -#endif -#else -#if __FreeBSD_version >= 1100116 + struct nhop_object *ro_nh; struct llentry *ro_lle; -#endif char *ro_prepend; uint16_t ro_plen; uint16_t ro_flags; uint16_t ro_mtu; uint16_t spare; -#endif +#else + sctp_rtentry_t *ro_rt; #endif #if defined(__APPLE__) #if !defined(APPLE_LEOPARD) && !defined(APPLE_SNOWLEOPARD) && !defined(APPLE_LION) && !defined(APPLE_MOUNTAINLION) && !defined(APPLE_ELCAPITAN) diff --git a/usrsctplib/netinet/sctp_timer.c b/usrsctplib/netinet/sctp_timer.c index da7417b1..9761c686 100755 --- a/usrsctplib/netinet/sctp_timer.c +++ b/usrsctplib/netinet/sctp_timer.c @@ -348,7 +348,11 @@ sctp_find_alternate_net(struct sctp_tcb *stcb, return (NULL); } } +#if defined(__FreeBSD__) + if (alt->ro.ro_nh == NULL) { +#else if (alt->ro.ro_rt == NULL) { +#endif if (alt->ro._s_addr) { sctp_free_ifa(alt->ro._s_addr); alt->ro._s_addr = NULL; @@ -356,7 +360,11 @@ sctp_find_alternate_net(struct sctp_tcb *stcb, alt->src_addr_selected = 0; } if (((alt->dest_state & SCTP_ADDR_REACHABLE) == SCTP_ADDR_REACHABLE) && +#if defined(__FreeBSD__) + (alt->ro.ro_nh != NULL) && +#else (alt->ro.ro_rt != NULL) && +#endif (!(alt->dest_state & SCTP_ADDR_UNCONFIRMED))) { /* Found a reachable address */ break; @@ -942,10 +950,14 @@ sctp_t3rxt_timer(struct sctp_inpcb *inp, net->src_addr_selected = 0; /* Force a route allocation too */ +#if defined(__FreeBSD__) + RO_NHFREE(&net->ro); +#else if (net->ro.ro_rt) { RTFREE(net->ro.ro_rt); net->ro.ro_rt = NULL; } +#endif /* Was it our primary? */ if ((stcb->asoc.primary_destination == net) && (alt != net)) { @@ -1526,7 +1538,11 @@ sctp_pathmtu_timer(struct sctp_inpcb *inp, net->src_addr_selected = 1; } if (net->ro._s_addr) { +#if defined(__FreeBSD__) + mtu = SCTP_GATHER_MTU_FROM_ROUTE(net->ro._s_addr, &net->ro._s_addr.sa, net->ro.ro_nh); +#else mtu = SCTP_GATHER_MTU_FROM_ROUTE(net->ro._s_addr, &net->ro._s_addr.sa, net->ro.ro_rt); +#endif #if defined(INET) || defined(INET6) if (net->port) { mtu -= sizeof(struct udphdr); diff --git a/usrsctplib/netinet/sctp_var.h b/usrsctplib/netinet/sctp_var.h index 51ca42aa..4140adbd 100755 --- a/usrsctplib/netinet/sctp_var.h +++ b/usrsctplib/netinet/sctp_var.h @@ -34,7 +34,7 @@ #ifdef __FreeBSD__ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: head/sys/netinet/sctp_var.h 357708 2020-02-09 22:40:05Z tuexen $"); +__FBSDID("$FreeBSD: head/sys/netinet/sctp_var.h 360292 2020-04-25 09:06:11Z melifaro $"); #endif #ifndef _NETINET_SCTP_VAR_H_ @@ -186,16 +186,13 @@ extern struct pr_usrreqs sctp_usrreqs; } \ } -#if defined(__FreeBSD__) && __FreeBSD_version > 500000 +#if defined(__FreeBSD__) #define sctp_free_remote_addr(__net) { \ if ((__net)) { \ if (SCTP_DECREMENT_AND_CHECK_REFCOUNT(&(__net)->ref_count)) { \ (void)SCTP_OS_TIMER_STOP(&(__net)->rxt_timer.timer); \ - if ((__net)->ro.ro_rt) { \ - RTFREE((__net)->ro.ro_rt); \ - (__net)->ro.ro_rt = NULL; \ - } \ + RO_NHFREE(&(__net)->ro); \ if ((__net)->src_addr_selected) { \ sctp_free_ifa((__net)->ro._s_addr); \ (__net)->ro._s_addr = NULL; \ |