diff options
-rw-r--r-- | sys/netinet/sctp_asconf.c | 4 | ||||
-rw-r--r-- | sys/netinet/sctp_asconf.h | 2 | ||||
-rw-r--r-- | sys/netinet/sctp_bsd_addr.c | 13 | ||||
-rw-r--r-- | sys/netinet/sctp_bsd_addr.h | 2 | ||||
-rw-r--r-- | sys/netinet/sctp_cc_functions.h | 2 | ||||
-rw-r--r-- | sys/netinet/sctp_constants.h | 4 | ||||
-rw-r--r-- | sys/netinet/sctp_crc32.h | 2 | ||||
-rw-r--r-- | sys/netinet/sctp_indata.c | 4 | ||||
-rw-r--r-- | sys/netinet/sctp_indata.h | 2 | ||||
-rw-r--r-- | sys/netinet/sctp_input.c | 8 | ||||
-rw-r--r-- | sys/netinet/sctp_input.h | 2 | ||||
-rw-r--r-- | sys/netinet/sctp_os_bsd.h | 23 | ||||
-rw-r--r-- | sys/netinet/sctp_output.c | 30 | ||||
-rw-r--r-- | sys/netinet/sctp_output.h | 5 | ||||
-rw-r--r-- | sys/netinet/sctp_pcb.c | 28 | ||||
-rw-r--r-- | sys/netinet/sctp_pcb.h | 3 | ||||
-rw-r--r-- | sys/netinet/sctp_sysctl.h | 2 | ||||
-rw-r--r-- | sys/netinet/sctp_timer.c | 6 | ||||
-rw-r--r-- | sys/netinet/sctp_timer.h | 2 | ||||
-rw-r--r-- | sys/netinet/sctp_uio.h | 4 | ||||
-rw-r--r-- | sys/netinet/sctp_usrreq.c | 5 | ||||
-rw-r--r-- | sys/netinet/sctp_var.h | 2 | ||||
-rw-r--r-- | sys/netinet/sctputil.c | 36 | ||||
-rw-r--r-- | sys/netinet/sctputil.h | 2 | ||||
-rw-r--r-- | sys/netinet6/sctp6_usrreq.c | 8 | ||||
-rw-r--r-- | sys/netinet6/sctp6_var.h | 1 |
26 files changed, 126 insertions, 76 deletions
diff --git a/sys/netinet/sctp_asconf.c b/sys/netinet/sctp_asconf.c index 18e073d..d28e3bd 100644 --- a/sys/netinet/sctp_asconf.c +++ b/sys/netinet/sctp_asconf.c @@ -877,7 +877,9 @@ send_reply: */ /* we probably don't need these operations */ (void)sa6_recoverscope(from6); - sa6_embedscope(from6, ip6_use_defzone); + sa6_embedscope(from6, + MODULE_GLOBAL(MOD_INET6, ip6_use_defzone)); + break; } #endif diff --git a/sys/netinet/sctp_asconf.h b/sys/netinet/sctp_asconf.h index 12f1281..1a3f7ff 100644 --- a/sys/netinet/sctp_asconf.h +++ b/sys/netinet/sctp_asconf.h @@ -36,7 +36,7 @@ __FBSDID("$FreeBSD$"); #ifndef _NETINET_SCTP_ASCONF_H_ #define _NETINET_SCTP_ASCONF_H_ -#if defined(_KERNEL) +#if defined(_KERNEL) || defined(__Userspace__) /* * function prototypes diff --git a/sys/netinet/sctp_bsd_addr.c b/sys/netinet/sctp_bsd_addr.c index d1003fa..03de58e 100644 --- a/sys/netinet/sctp_bsd_addr.c +++ b/sys/netinet/sctp_bsd_addr.c @@ -79,7 +79,6 @@ MALLOC_DEFINE(SCTP_M_MVRF, "sctp_mvrf", "sctp mvrf pcb list"); MALLOC_DEFINE(SCTP_M_ITER, "sctp_iter", "sctp iterator control"); MALLOC_DEFINE(SCTP_M_SOCKOPT, "sctp_socko", "sctp socket option"); - #if defined(SCTP_USE_THREAD_BASED_ITERATOR) void sctp_wakeup_iterator(void) @@ -116,6 +115,7 @@ sctp_startup_iterator(void) #endif #ifdef INET6 + void sctp_gather_internal_ifa_flags(struct sctp_ifa *ifa) { @@ -123,7 +123,7 @@ sctp_gather_internal_ifa_flags(struct sctp_ifa *ifa) ifa6 = (struct in6_ifaddr *)ifa->ifa; ifa->flags = ifa6->ia6_flags; - if (!ip6_use_deprecated) { + if (!MODULE_GLOBAL(MOD_INET6, ip6_use_deprecated)) { if (ifa->flags & IN6_IFF_DEPRECATED) { ifa->localifa_flags |= SCTP_ADDR_IFA_UNUSEABLE; @@ -143,7 +143,7 @@ sctp_gather_internal_ifa_flags(struct sctp_ifa *ifa) } } -#endif +#endif /* INET6 */ static uint32_t @@ -189,6 +189,8 @@ sctp_is_desired_interface_type(struct ifaddr *ifa) static void sctp_init_ifns_for_vrf(int vrfid) { + + /* * Here we must apply ANY locks needed by the IFN we access and also * make sure we lock any IFA that exists as we float through the @@ -200,8 +202,9 @@ sctp_init_ifns_for_vrf(int vrfid) struct sctp_ifa *sctp_ifa; uint32_t ifa_flags; - TAILQ_FOREACH(ifn, &ifnet, if_list) { + TAILQ_FOREACH(ifn, &MODULE_GLOBAL(MOD_NET, ifnet), if_list) { TAILQ_FOREACH(ifa, &ifn->if_addrlist, ifa_list) { + if (ifa->ifa_addr == NULL) { continue; } @@ -329,7 +332,7 @@ void struct ifnet *ifn; struct ifaddr *ifa; - TAILQ_FOREACH(ifn, &ifnet, if_list) { + TAILQ_FOREACH(ifn, &MODULE_GLOBAL(MOD_NET, ifnet), if_list) { if (!(*pred) (ifn)) { continue; } diff --git a/sys/netinet/sctp_bsd_addr.h b/sys/netinet/sctp_bsd_addr.h index f8bf375..2260cf9 100644 --- a/sys/netinet/sctp_bsd_addr.h +++ b/sys/netinet/sctp_bsd_addr.h @@ -35,7 +35,7 @@ __FBSDID("$FreeBSD$"); #define __sctp_bsd_addr_h__ #include <netinet/sctp_pcb.h> -#if defined(_KERNEL) +#if defined(_KERNEL) || defined(__Userspace__) #if defined(SCTP_USE_THREAD_BASED_ITERATOR) void sctp_wakeup_iterator(void); diff --git a/sys/netinet/sctp_cc_functions.h b/sys/netinet/sctp_cc_functions.h index 5d27aef..1a681ad 100644 --- a/sys/netinet/sctp_cc_functions.h +++ b/sys/netinet/sctp_cc_functions.h @@ -33,7 +33,7 @@ __FBSDID("$FreeBSD$"); #ifndef __sctp_cc_functions_h__ #define __sctp_cc_functions_h__ -#if defined(_KERNEL) +#if defined(_KERNEL) || defined(__Userspace__) void sctp_set_initial_cc_param(struct sctp_tcb *stcb, diff --git a/sys/netinet/sctp_constants.h b/sys/netinet/sctp_constants.h index 9f628b8..75c9839 100644 --- a/sys/netinet/sctp_constants.h +++ b/sys/netinet/sctp_constants.h @@ -1070,6 +1070,7 @@ __FBSDID("$FreeBSD$"); #define SCTP_GETTIME_TIMEVAL(x) (getmicrouptime(x)) #define SCTP_GETPTIME_TIMEVAL(x) (microuptime(x)) +#endif /*#if defined(__FreeBSD__) || defined(__APPLE__)*/ /*#define SCTP_GETTIME_TIMEVAL(x) { \*/ /* (x)->tv_sec = ticks / 1000; \*/ @@ -1080,6 +1081,7 @@ __FBSDID("$FreeBSD$"); /*#define SCTP_GETTIME_TIMEVAL(x) (microtime(x))*/ /*#endif __FreeBSD__ */ +#if defined(_KERNEL) || defined(__Userspace__) #define sctp_sowwakeup(inp, so) \ do { \ if (inp->sctp_flags & SCTP_PCB_FLAGS_DONT_WAKE) { \ @@ -1118,5 +1120,5 @@ do { \ } \ } while (0) -#endif /* _KERNEL */ +#endif /* _KERNEL || __Userspace__ */ #endif diff --git a/sys/netinet/sctp_crc32.h b/sys/netinet/sctp_crc32.h index 3d118e5..88739ed 100644 --- a/sys/netinet/sctp_crc32.h +++ b/sys/netinet/sctp_crc32.h @@ -38,7 +38,7 @@ __FBSDID("$FreeBSD$"); #ifndef SCTP_USE_ADLER32 -#if defined(_KERNEL) +#if defined(_KERNEL) || defined(__Userspace__) uint32_t update_crc32(uint32_t, unsigned char *, unsigned int); uint32_t old_update_crc32(uint32_t, unsigned char *, unsigned int); diff --git a/sys/netinet/sctp_indata.c b/sys/netinet/sctp_indata.c index c71a684..8a1d057 100644 --- a/sys/netinet/sctp_indata.c +++ b/sys/netinet/sctp_indata.c @@ -3184,6 +3184,10 @@ sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc, if ((PR_SCTP_TTL_ENABLED(tp1->flags)) && tp1->sent < SCTP_DATAGRAM_ACKED) { /* Is it expired? */ if ( + /* + * TODO sctp_constants.h needs alternative + * time macros when _KERNEL is undefined. + */ (timevalcmp(&now, &tp1->rec.data.timetodrop, >)) ) { /* Yes so drop it */ diff --git a/sys/netinet/sctp_indata.h b/sys/netinet/sctp_indata.h index 9ab5ebf..81c1d72 100644 --- a/sys/netinet/sctp_indata.h +++ b/sys/netinet/sctp_indata.h @@ -36,7 +36,7 @@ __FBSDID("$FreeBSD$"); #ifndef __sctp_indata_h__ #define __sctp_indata_h__ -#if defined(_KERNEL) +#if defined(_KERNEL) || defined(__Userspace__) struct sctp_queued_to_read * sctp_build_readq_entry(struct sctp_tcb *stcb, diff --git a/sys/netinet/sctp_input.c b/sys/netinet/sctp_input.c index a6acb16..7a6377f 100644 --- a/sys/netinet/sctp_input.c +++ b/sys/netinet/sctp_input.c @@ -2299,6 +2299,10 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, /* Expire time is in Ticks, so we convert to seconds */ time_expires.tv_sec = cookie->time_entered.tv_sec + TICKS_TO_SEC(cookie->cookie_life); time_expires.tv_usec = cookie->time_entered.tv_usec; + /* + * TODO sctp_constants.h needs alternative time macros when _KERNEL + * is undefined. + */ if (timevalcmp(&now, &time_expires, >)) { /* cookie is stale! */ struct mbuf *op_err; @@ -5371,7 +5375,7 @@ sctp_skip_csum_4: goto bad; } /* validate mbuf chain length with IP payload length */ - if (mlen < (ip->ip_len - iphlen)) { + if (mlen < (SCTP_GET_IPV4_LENGTH(ip) - iphlen)) { SCTP_STAT_INCR(sctps_hdrops); goto bad; } @@ -5434,7 +5438,7 @@ sctp_skip_csum_4: * idea, so I will leave it in place. */ if (inp && ipsec4_in_reject(m, &inp->ip_inp.inp)) { - ipsec4stat.in_polvio++; + MODULE_GLOBAL(MOD_IPSEC, ipsec4stat).in_polvio++; SCTP_STAT_INCR(sctps_hdrops); goto bad; } diff --git a/sys/netinet/sctp_input.h b/sys/netinet/sctp_input.h index 2a28970..39f6420 100644 --- a/sys/netinet/sctp_input.h +++ b/sys/netinet/sctp_input.h @@ -36,7 +36,7 @@ __FBSDID("$FreeBSD$"); #ifndef __sctp_input_h__ #define __sctp_input_h__ -#if defined(_KERNEL) +#if defined(_KERNEL) || defined(__Userspace__) void sctp_common_input_processing(struct mbuf **, int, int, int, struct sctphdr *, struct sctp_chunkhdr *, struct sctp_inpcb *, diff --git a/sys/netinet/sctp_os_bsd.h b/sys/netinet/sctp_os_bsd.h index 8bf2954..a1795d2 100644 --- a/sys/netinet/sctp_os_bsd.h +++ b/sys/netinet/sctp_os_bsd.h @@ -60,6 +60,9 @@ __FBSDID("$FreeBSD$"); #include <sys/random.h> #include <sys/limits.h> #include <sys/queue.h> +#if defined(__FreeBSD__) && __FreeBSD_version > 800000 && defined(VIMAGE) +#include <sys/vimage.h> +#endif #include <machine/cpu.h> #include <net/if.h> @@ -139,6 +142,26 @@ MALLOC_DECLARE(SCTP_M_SOCKOPT); #define SCTP_BASE_VAR(__m) system_base_info.__m /* + * Macros to expand out globals defined by various modules + * to either a real global or a virtualized instance of one, + * depending on whether VIMAGE is defined in opt_vimage.h + * XXX opt_vimage.h not yet present, more framework to come. + * XXX so will always evaluate to the global for now (VIMAGE not defined) + */ +/* first define modules that supply us information */ +#define MOD_NET net +#define MOD_INET inet +#define MOD_INET6 inet6 +#define MOD_IPSEC ipsec + +/* then define the macro(s) that hook into the vimage macros */ +#if defined(__FreeBSD__) && __FreeBSD_version > 800000 && defined(VIMAGE) +#define VSYMNAME(__MODULE) vnet_ ## __MODULE +#define MODULE_GLOBAL(__MODULE, __SYMBOL) VSYM(VSYMNAME(__MODULE), __SYMBOL) +#else +#define MODULE_GLOBAL(__MODULE, __SYMBOL) (__SYMBOL) +#endif +/* * */ #define USER_ADDR_NULL (NULL) /* FIX ME: temp */ diff --git a/sys/netinet/sctp_output.c b/sys/netinet/sctp_output.c index a0b437d..19bbbac 100644 --- a/sys/netinet/sctp_output.c +++ b/sys/netinet/sctp_output.c @@ -3510,7 +3510,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, tos_value = inp->ip_inp.inp.inp_ip_tos; } if ((nofragment_flag) && (port == 0)) { -#if defined(WITH_CONVERT_IP_OFF) || defined(__FreeBSD__) || defined(__APPLE__) +#if defined(WITH_CONVERT_IP_OFF) || defined(__FreeBSD__) || defined(__APPLE__) || defined(__Userspace__) ip->ip_off = IP_DF; #else ip->ip_off = htons(IP_DF); @@ -3826,7 +3826,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, sin6 = &tmp; /* KAME hack: embed scopeid */ - if (sa6_embedscope(sin6, ip6_use_defzone) != 0) { + if (sa6_embedscope(sin6, MODULE_GLOBAL(MOD_INET6, ip6_use_defzone)) != 0) { SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); return (EINVAL); } @@ -3880,7 +3880,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, if (net->src_addr_selected == 0) { sin6 = (struct sockaddr_in6 *)&net->ro._l_addr; /* KAME hack: embed scopeid */ - if (sa6_embedscope(sin6, ip6_use_defzone) != 0) { + if (sa6_embedscope(sin6, MODULE_GLOBAL(MOD_INET6, ip6_use_defzone)) != 0) { SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); return (EINVAL); } @@ -3903,7 +3903,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, } else { sin6 = (struct sockaddr_in6 *)&ro->ro_dst; /* KAME hack: embed scopeid */ - if (sa6_embedscope(sin6, ip6_use_defzone) != 0) { + if (sa6_embedscope(sin6, MODULE_GLOBAL(MOD_INET6, ip6_use_defzone)) != 0) { SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); return (EINVAL); } @@ -5096,7 +5096,7 @@ do_a_abort: */ (void)sa6_recoverscope(sin6); stc.scope_id = sin6->sin6_scope_id; - sa6_embedscope(sin6, ip6_use_defzone); + sa6_embedscope(sin6, MODULE_GLOBAL(MOD_INET6, ip6_use_defzone)); stc.loopback_scope = 1; stc.local_scope = 0; stc.site_scope = 1; @@ -5132,7 +5132,7 @@ do_a_abort: */ (void)sa6_recoverscope(sin6); stc.scope_id = sin6->sin6_scope_id; - sa6_embedscope(sin6, ip6_use_defzone); + sa6_embedscope(sin6, MODULE_GLOBAL(MOD_INET6, ip6_use_defzone)); } else if (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr)) { /* * If the new destination is @@ -5761,6 +5761,10 @@ sctp_set_prsctp_policy(struct sctp_tcb *stcb, (void)SCTP_GETTIME_TIMEVAL(&sp->ts); tv.tv_sec = sp->timetolive / 1000; tv.tv_usec = (sp->timetolive * 1000) % 1000000; + /* + * TODO sctp_constants.h needs alternative + * time macros when _KERNEL is undefined. + */ timevaladd(&sp->ts, &tv); } break; @@ -10260,7 +10264,7 @@ sctp_send_shutdown_complete2(struct mbuf *m, int iphlen, struct sctphdr *sh, /* Fill in the IPv6 header for the ABORT */ ip6_out->ip6_flow = ip6->ip6_flow; - ip6_out->ip6_hlim = ip6_defhlim; + ip6_out->ip6_hlim = MODULE_GLOBAL(MOD_INET6, ip6_defhlim); if (port) { ip6_out->ip6_nxt = IPPROTO_UDP; } else { @@ -10277,7 +10281,7 @@ sctp_send_shutdown_complete2(struct mbuf *m, int iphlen, struct sctphdr *sh, comp_cp = (struct sctp_shutdown_complete_msg *)( (caddr_t)ip6_out + offset_out); break; -#endif +#endif /* INET6 */ default: /* Currently not supported. */ return; @@ -11225,7 +11229,7 @@ sctp_send_abort(struct mbuf *m, int iphlen, struct sctphdr *sh, uint32_t vtag, /* Fill in the IP6 header for the ABORT */ ip6_out->ip6_flow = ip6->ip6_flow; - ip6_out->ip6_hlim = ip6_defhlim; + ip6_out->ip6_hlim = MODULE_GLOBAL(MOD_INET6, ip6_defhlim); if (port) { ip6_out->ip6_nxt = IPPROTO_UDP; } else { @@ -11237,7 +11241,7 @@ sctp_send_abort(struct mbuf *m, int iphlen, struct sctphdr *sh, uint32_t vtag, iphlen_out = sizeof(*ip6_out); abm = (struct sctp_abort_msg *)((caddr_t)ip6_out + iphlen_out); break; -#endif +#endif /* INET6 */ default: /* Currently not supported */ if (err_cause) @@ -11517,7 +11521,7 @@ sctp_send_operr_to(struct mbuf *m, int iphlen, struct mbuf *scm, uint32_t vtag, in6 = mtod(m, struct ip6_hdr *); out6 = mtod(mout, struct ip6_hdr *); out6->ip6_flow = in6->ip6_flow; - out6->ip6_hlim = ip6_defhlim; + out6->ip6_hlim = MODULE_GLOBAL(MOD_INET6, ip6_defhlim); if (port) { out6->ip6_nxt = IPPROTO_UDP; } else { @@ -11568,7 +11572,7 @@ sctp_send_operr_to(struct mbuf *m, int iphlen, struct mbuf *scm, uint32_t vtag, RTFREE(ro.ro_rt); break; } -#endif +#endif /* INET6 */ default: /* TSNH */ break; @@ -13162,7 +13166,7 @@ sctp_v6src_match_nexthop(struct sockaddr_in6 *src6, sctp_route_t * ro) return (0); /* get prefix entry of address */ - LIST_FOREACH(pfx, &nd_prefix, ndpr_entry) { + LIST_FOREACH(pfx, &MODULE_GLOBAL(MOD_INET6, nd_prefix), ndpr_entry) { if (pfx->ndpr_stateflags & NDPRF_DETACHED) continue; if (IN6_ARE_MASKED_ADDR_EQUAL(&pfx->ndpr_prefix.sin6_addr, diff --git a/sys/netinet/sctp_output.h b/sys/netinet/sctp_output.h index f0961b8..ddbe7096 100644 --- a/sys/netinet/sctp_output.h +++ b/sys/netinet/sctp_output.h @@ -38,7 +38,7 @@ __FBSDID("$FreeBSD$"); #include <netinet/sctp_header.h> -#if defined(_KERNEL) +#if defined(_KERNEL) || defined(__Userspace__) struct mbuf * @@ -201,6 +201,9 @@ sctp_send_abort(struct mbuf *, int, struct sctphdr *, uint32_t, void sctp_send_operr_to(struct mbuf *, int, struct mbuf *, uint32_t, uint32_t, uint16_t); +#endif /* _KERNEL || __Userspace__ */ + +#if defined(_KERNEL) || defined (__Userspace__) int sctp_sosend(struct socket *so, struct sockaddr *addr, diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c index 5cdc812..17c1da0 100644 --- a/sys/netinet/sctp_pcb.c +++ b/sys/netinet/sctp_pcb.c @@ -59,11 +59,11 @@ SCTP6_ARE_ADDR_EQUAL(struct sockaddr_in6 *a, struct sockaddr_in6 *b) struct sockaddr_in6 tmp_a, tmp_b; memcpy(&tmp_a, a, sizeof(struct sockaddr_in6)); - if (sa6_embedscope(&tmp_a, ip6_use_defzone) != 0) { + if (sa6_embedscope(&tmp_a, MODULE_GLOBAL(MOD_INET6, MODULE_GLOBAL(MOD_INET6, ip6_use_defzone))) != 0) { return 0; } memcpy(&tmp_b, b, sizeof(struct sockaddr_in6)); - if (sa6_embedscope(&tmp_b, ip6_use_defzone) != 0) { + if (sa6_embedscope(&tmp_b, MODULE_GLOBAL(MOD_INET6, MODULE_GLOBAL(MOD_INET6, ip6_use_defzone))) != 0) { return 0; } return (IN6_ARE_ADDR_EQUAL(&tmp_a.sin6_addr, &tmp_b.sin6_addr)); @@ -1894,7 +1894,7 @@ sctp_findassociation_addr(struct mbuf *m, int iphlen, int offset, /* Get the scopes in properly to the sin6 addr's */ /* we probably don't need these operations */ (void)sa6_recoverscope(from6); - sa6_embedscope(from6, ip6_use_defzone); + sa6_embedscope(from6, MODULE_GLOBAL(MOD_INET6, MODULE_GLOBAL(MOD_INET6, ip6_use_defzone))); break; } #endif @@ -1941,7 +1941,7 @@ sctp_findassociation_addr(struct mbuf *m, int iphlen, int offset, /* Get the scopes in properly to the sin6 addr's */ /* we probably don't need these operations */ (void)sa6_recoverscope(to6); - sa6_embedscope(to6, ip6_use_defzone); + sa6_embedscope(to6, MODULE_GLOBAL(MOD_INET6, MODULE_GLOBAL(MOD_INET6, ip6_use_defzone))); break; } #endif @@ -2193,7 +2193,7 @@ sctp_inpcb_alloc(struct socket *so, uint32_t vrf_id) } #endif /* IPSEC */ SCTP_INCR_EP_COUNT(); - inp->ip_inp.inp.inp_ip_ttl = ip_defttl; + inp->ip_inp.inp.inp_ip_ttl = MODULE_GLOBAL(MOD_INET, ip_defttl); SCTP_INP_INFO_WUNLOCK(); so->so_pcb = (caddr_t)inp; @@ -2606,7 +2606,7 @@ sctp_inpcb_bind(struct socket *so, struct sockaddr *addr, if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { bindall = 0; /* KAME hack: embed scopeid */ - if (sa6_embedscope(sin6, ip6_use_defzone) != 0) { + if (sa6_embedscope(sin6, MODULE_GLOBAL(MOD_INET6, ip6_use_defzone)) != 0) { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); return (EINVAL); } @@ -2706,8 +2706,8 @@ sctp_inpcb_bind(struct socket *so, struct sockaddr *addr, int done; if (ip_inp->inp_flags & INP_HIGHPORT) { - first = ipport_hifirstauto; - last = ipport_hilastauto; + first = MODULE_GLOBAL(MOD_INET, ipport_hifirstauto); + last = MODULE_GLOBAL(MOD_INET, ipport_hilastauto); } else if (ip_inp->inp_flags & INP_LOWPORT) { if (p && (error = priv_check(p, PRIV_NETINET_RESERVEDPORT) @@ -2718,8 +2718,8 @@ sctp_inpcb_bind(struct socket *so, struct sockaddr *addr, SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); return (error); } - first = ipport_lowfirstauto; - last = ipport_lowlastauto; + first = MODULE_GLOBAL(MOD_INET, ipport_lowfirstauto); + last = MODULE_GLOBAL(MOD_INET, ipport_lowlastauto); } else { first = ipport_firstauto; last = ipport_lastauto; @@ -3635,7 +3635,7 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr, struct sockaddr_in6 *sin6; sin6 = (struct sockaddr_in6 *)&net->ro._l_addr; - (void)sa6_embedscope(sin6, ip6_use_defzone); + (void)sa6_embedscope(sin6, MODULE_GLOBAL(MOD_INET6, ip6_use_defzone)); sin6->sin6_scope_id = 0; } #endif @@ -5357,12 +5357,6 @@ sctp_pcb_finish(void) struct sctp_tagblock *twait_block, *prev_twait_block; int i; - /* FIXME MT */ - SCTP_BASE_INFO(threads_must_exit) = 1; -#if defined(SCTP_USE_THREAD_BASED_ITERATOR) - /* Wake the thread up so it will exit now */ - sctp_wakeup_iterator(); -#endif /* * free the vrf/ifn/ifa lists and hashes (be sure address monitor is * destroyed first). diff --git a/sys/netinet/sctp_pcb.h b/sys/netinet/sctp_pcb.h index ef0cdf9..7f63dcd 100644 --- a/sys/netinet/sctp_pcb.h +++ b/sys/netinet/sctp_pcb.h @@ -450,7 +450,8 @@ struct sctp_tcb { #include <netinet/sctp_lock_bsd.h> -#if defined(_KERNEL) +/* TODO where to put non-_KERNEL things for __Userspace__? */ +#if defined(_KERNEL) || defined(__Userspace__) /* Attention Julian, this is the extern that * goes with the base info. sctp_pcb.c has diff --git a/sys/netinet/sctp_sysctl.h b/sys/netinet/sctp_sysctl.h index 27c84a4..f739c96 100644 --- a/sys/netinet/sctp_sysctl.h +++ b/sys/netinet/sctp_sysctl.h @@ -483,7 +483,7 @@ struct sctp_sysctl { #endif -#if defined(_KERNEL) +#if defined(_KERNEL) || defined(__Userspace__) #if defined(SYSCTL_DECL) SYSCTL_DECL(_net_inet_sctp); #endif diff --git a/sys/netinet/sctp_timer.c b/sys/netinet/sctp_timer.c index 409ade3..c3cf1df 100644 --- a/sys/netinet/sctp_timer.c +++ b/sys/netinet/sctp_timer.c @@ -37,7 +37,6 @@ __FBSDID("$FreeBSD$"); #include <netinet/sctp_os.h> #include <netinet/sctp_pcb.h> #ifdef INET6 -#include <netinet6/sctp6_var.h> #endif #include <netinet/sctp_var.h> #include <netinet/sctp_sysctl.h> @@ -402,8 +401,7 @@ sctp_find_alternate_net(struct sctp_tcb *stcb, } if (this_random % 2 == 1) { max_cwnd_net = mnet; - max_cwnd = mnet->cwnd; - //Useless ? + max_cwnd = mnet->cwnd; /* Useless? */ } } } @@ -1711,7 +1709,7 @@ sctp_pathmtu_timer(struct sctp_inpcb *inp, struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&net->ro._l_addr; /* KAME hack: embed scopeid */ - (void)sa6_embedscope(sin6, ip6_use_defzone); + (void)sa6_embedscope(sin6, MODULE_GLOBAL(MOD_INET6, ip6_use_defzone)); } #endif diff --git a/sys/netinet/sctp_timer.h b/sys/netinet/sctp_timer.h index 216d0d4..c3b3188 100644 --- a/sys/netinet/sctp_timer.h +++ b/sys/netinet/sctp_timer.h @@ -35,7 +35,7 @@ __FBSDID("$FreeBSD$"); #ifndef __sctp_timer_h__ #define __sctp_timer_h__ -#if defined(_KERNEL) +#if defined(_KERNEL) || defined(__Userspace__) #define SCTP_RTT_SHIFT 3 #define SCTP_RTT_VAR_SHIFT 2 diff --git a/sys/netinet/sctp_uio.h b/sys/netinet/sctp_uio.h index 15cf54e..7714343 100644 --- a/sys/netinet/sctp_uio.h +++ b/sys/netinet/sctp_uio.h @@ -1037,7 +1037,7 @@ struct sctp_log { /* * Kernel defined for sctp_send */ -#if defined(_KERNEL) +#if defined(_KERNEL) || defined(__Userspace__) int sctp_lower_sosend(struct socket *so, struct sockaddr *addr, @@ -1065,7 +1065,7 @@ sctp_sorecvmsg(struct socket *so, /* * API system calls */ -#if !(defined(_KERNEL)) +#if !(defined(_KERNEL)) && !(defined(__Userspace__)) __BEGIN_DECLS int sctp_peeloff __P((int, sctp_assoc_t)); diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c index 7d92968..6c34d47 100644 --- a/sys/netinet/sctp_usrreq.c +++ b/sys/netinet/sctp_usrreq.c @@ -38,7 +38,6 @@ __FBSDID("$FreeBSD$"); #include <netinet/sctp_header.h> #include <netinet/sctp_var.h> #if defined(INET6) -#include <netinet6/sctp6_var.h> #endif #include <netinet/sctp_sysctl.h> #include <netinet/sctp_output.h> @@ -63,7 +62,6 @@ sctp_init(void) /* Initialize and modify the sysctled variables */ sctp_init_sysctls(); - if ((nmbclusters / 8) > SCTP_ASOC_MAX_CHUNKS_ON_QUEUE) SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue) = (nmbclusters / 8); /* @@ -532,7 +530,7 @@ sctp_attach(struct socket *so, int proto, struct thread *p) inp->sctp_flags &= ~SCTP_PCB_FLAGS_BOUND_V6; /* I'm not v6! */ ip_inp = &inp->ip_inp.inp; ip_inp->inp_vflag |= INP_IPV4; - ip_inp->inp_ip_ttl = ip_defttl; + ip_inp->inp_ip_ttl = MODULE_GLOBAL(MOD_INET, ip_defttl); #ifdef IPSEC error = ipsec_init_policy(so, &ip_inp->inp_sp); #ifdef SCTP_LOG_CLOSING @@ -3986,7 +3984,6 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, return (error); } - int sctp_ctloutput(struct socket *so, struct sockopt *sopt) { diff --git a/sys/netinet/sctp_var.h b/sys/netinet/sctp_var.h index e66d74c..3ef801c 100644 --- a/sys/netinet/sctp_var.h +++ b/sys/netinet/sctp_var.h @@ -38,7 +38,7 @@ __FBSDID("$FreeBSD$"); #include <netinet/sctp_uio.h> -#if defined(_KERNEL) +#if defined(_KERNEL) || defined(__Userspace__) extern struct pr_usrreqs sctp_usrreqs; diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c index 42903b1..0b33c49 100644 --- a/sys/netinet/sctputil.c +++ b/sys/netinet/sctputil.c @@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$"); #include <netinet/sctp_var.h> #include <netinet/sctp_sysctl.h> #ifdef INET6 -#include <netinet6/sctp6_var.h> #endif #include <netinet/sctp_header.h> #include <netinet/sctp_output.h> @@ -3098,7 +3097,7 @@ sctp_notify_send_failed(struct sctp_tcb *stcb, uint32_t error, #endif ) { - struct mbuf *m_notify; + struct mbuf *m_notify, *tt; struct sctp_send_failed *ssf; struct sctp_queued_to_read *control; int length; @@ -3107,11 +3106,12 @@ sctp_notify_send_failed(struct sctp_tcb *stcb, uint32_t error, /* event not enabled */ return; - length = sizeof(struct sctp_send_failed) + chk->send_size; m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_send_failed), 0, M_DONTWAIT, 1, MT_DATA); if (m_notify == NULL) /* no space left */ return; + length = sizeof(struct sctp_send_failed) + chk->send_size; + length -= sizeof(struct sctp_data_chunk); SCTP_BUF_LEN(m_notify) = 0; ssf = mtod(m_notify, struct sctp_send_failed *); ssf->ssf_type = SCTP_SEND_FAILED; @@ -3130,6 +3130,18 @@ sctp_notify_send_failed(struct sctp_tcb *stcb, uint32_t error, ssf->ssf_info.sinfo_context = chk->rec.data.context; ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb); ssf->ssf_assoc_id = sctp_get_associd(stcb); + + /* Take off the chunk header */ + m_adj(chk->data, sizeof(struct sctp_data_chunk)); + + /* trim out any 0 len mbufs */ + while (SCTP_BUF_LEN(chk->data) == 0) { + tt = chk->data; + chk->data = SCTP_BUF_NEXT(tt); + SCTP_BUF_NEXT(tt) = NULL; + sctp_m_freem(tt); + } + SCTP_BUF_NEXT(m_notify) = chk->data; SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_send_failed); @@ -3195,7 +3207,11 @@ sctp_notify_send_failed2(struct sctp_tcb *stcb, uint32_t error, bzero(&ssf->ssf_info, sizeof(ssf->ssf_info)); ssf->ssf_info.sinfo_stream = sp->stream; ssf->ssf_info.sinfo_ssn = sp->strseq; - ssf->ssf_info.sinfo_flags = sp->sinfo_flags; + if (sp->some_taken) { + ssf->ssf_info.sinfo_flags = SCTP_DATA_LAST_FRAG; + } else { + ssf->ssf_info.sinfo_flags = SCTP_DATA_NOT_FRAG; + } ssf->ssf_info.sinfo_ppid = sp->ppid; ssf->ssf_info.sinfo_context = sp->context; ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb); @@ -5467,10 +5483,10 @@ found_one: bzero(&sin6, sizeof(sin6)); sin6.sin6_family = AF_INET6; sin6.sin6_len = sizeof(struct sockaddr_in6); - sin6.sin6_addr.s6_addr32[2] = ntohl(0x0000ffff); + sin6.sin6_addr.s6_addr16[2] = 0xffff; bcopy(&sin->sin_addr, - &sin6.sin6_addr.s6_addr32[3], - sizeof(sin6.sin6_addr.s6_addr32[3])); + &sin6.sin6_addr.s6_addr16[3], + sizeof(sin6.sin6_addr.s6_addr16[3])); sin6.sin6_port = sin->sin_port; memcpy(from, (caddr_t)&sin6, sizeof(sin6)); } @@ -6000,8 +6016,6 @@ sctp_dynamic_set_primary(struct sockaddr *sa, uint32_t vrf_id) } - - int sctp_soreceive(struct socket *so, struct sockaddr **psa, @@ -6256,7 +6270,7 @@ sctp_bindx_add_address(struct socket *so, struct sctp_inpcb *inp, return; } addr_touse = sa; -#if defined(INET6) +#if defined(INET6) && !defined(__Userspace__) /* TODO port in6_sin6_2_sin */ if (sa->sa_family == AF_INET6) { struct sockaddr_in6 *sin6; @@ -6382,7 +6396,7 @@ sctp_bindx_delete_address(struct socket *so, struct sctp_inpcb *inp, return; } addr_touse = sa; -#if defined(INET6) +#if defined(INET6) && !defined(__Userspace__) /* TODO port in6_sin6_2_sin */ if (sa->sa_family == AF_INET6) { struct sockaddr_in6 *sin6; diff --git a/sys/netinet/sctputil.h b/sys/netinet/sctputil.h index 3fd384e..5be1df7 100644 --- a/sys/netinet/sctputil.h +++ b/sys/netinet/sctputil.h @@ -37,7 +37,7 @@ __FBSDID("$FreeBSD$"); #define __sctputil_h__ -#if defined(_KERNEL) +#if defined(_KERNEL) || defined(__Userspace__) #ifdef SCTP_ASOCLOG_OF_TSNS diff --git a/sys/netinet6/sctp6_usrreq.c b/sys/netinet6/sctp6_usrreq.c index 92e5a9e..d021dfc 100644 --- a/sys/netinet6/sctp6_usrreq.c +++ b/sys/netinet6/sctp6_usrreq.c @@ -210,7 +210,7 @@ sctp_skip_csum: */ if (in6p_ip && (ipsec6_in_reject(m, in6p_ip))) { /* XXX */ - ipsec6stat.in_polvio++; + MODULE_GLOBAL(MOD_IPSEC, ipsec6stat).in_polvio++; goto bad; } #endif /* IPSEC */ @@ -679,7 +679,7 @@ sctp6_attach(struct socket *so, int proto, struct thread *p) * socket as well, because the socket may be bound to an IPv6 * wildcard address, which may match an IPv4-mapped IPv6 address. */ - inp6->inp_ip_ttl = ip_defttl; + inp6->inp_ip_ttl = MODULE_GLOBAL(MOD_INET, ip_defttl); #endif /* * Hmm what about the IPSEC stuff that is missing here but in @@ -843,7 +843,7 @@ sctp6_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr, } } if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { - if (!ip6_v6only) { + if (!MODULE_GLOBAL(MOD_INET6, ip6_v6only)) { struct sockaddr_in sin; /* convert v4-mapped into v4 addr and send */ @@ -974,7 +974,7 @@ sctp6_connect(struct socket *so, struct sockaddr *addr, struct thread *p) } } if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { - if (!ip6_v6only) { + if (!MODULE_GLOBAL(MOD_INET6, ip6_v6only)) { /* convert v4-mapped into v4 addr */ in6_sin6_2_sin((struct sockaddr_in *)&ss, sin6); addr = (struct sockaddr *)&ss; diff --git a/sys/netinet6/sctp6_var.h b/sys/netinet6/sctp6_var.h index 6e8a95e..a05f6b0 100644 --- a/sys/netinet6/sctp6_var.h +++ b/sys/netinet6/sctp6_var.h @@ -35,6 +35,7 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +/* TODO __Userspace__ IPv6 stuff... */ #if defined(_KERNEL) SYSCTL_DECL(_net_inet6_sctp6); |