aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@fh-muenster.de>2020-05-18 00:47:04 +0200
committerMichael Tuexen <tuexen@fh-muenster.de>2020-05-18 00:47:04 +0200
commita05154264872ec8e5d4143ac841a306f54ace231 (patch)
treed5017965d66d9865bfb6a5d461010a95f80d79d0
parentdf49eb6e19b84905d0b20dd79edf81ec7a76f133 (diff)
downloadusrsctp-a05154264872ec8e5d4143ac841a306f54ace231.tar.gz
Sync with FreeBSD.
-rwxr-xr-xusrsctplib/netinet/sctp_asconf.c29
-rwxr-xr-xusrsctplib/netinet/sctp_output.c95
-rwxr-xr-xusrsctplib/netinet/sctp_pcb.c51
-rwxr-xr-xusrsctplib/netinet/sctp_structs.h18
-rwxr-xr-xusrsctplib/netinet/sctp_timer.c16
-rwxr-xr-xusrsctplib/netinet/sctp_var.h9
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; \