The patch looks reasonable to me, but there are some things that I didn't understand how they fit in. For example, how do the changes bsd/sys/netinet/tcp_reass.cc related to some function for iterating link-level sockets?
-- Nadav Har'El [email protected] On Tue, Aug 7, 2018 at 5:49 AM, Charles Myers <[email protected]> wrote: > lltable_foreach(), lltable_foreach_lle() added to support NETLINK sockets > > Signed-off-by: Charles Myers <[email protected]> > --- > bsd/sys/net/if_ethersubr.cc | 5 ++--- > bsd/sys/net/if_llatbl.cc | 47 ++++++++++++++++++++++++++++++ > ++++++++--- > bsd/sys/net/if_llatbl.h | 13 ++++++++++++ > bsd/sys/netinet/tcp_lro.cc | 4 ++-- > bsd/sys/netinet/tcp_lro.h | 15 +++++++------ > bsd/sys/netinet/tcp_reass.cc | 4 ++-- > bsd/sys/netinet/tcp_subr.cc | 6 ++++-- > bsd/sys/netinet/tcp_syncache.cc | 3 +-- > bsd/sys/netinet/udp_usrreq.cc | 2 +- > 9 files changed, 78 insertions(+), 21 deletions(-) > > diff --git a/bsd/sys/net/if_ethersubr.cc b/bsd/sys/net/if_ethersubr.cc > index 0443c83..d2c4fe9 100644 > --- a/bsd/sys/net/if_ethersubr.cc > +++ b/bsd/sys/net/if_ethersubr.cc > @@ -1140,8 +1140,7 @@ ether_resolvemulti(struct ifnet *ifp, struct > bsd_sockaddr **llsa, > } > if (!IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) > return EADDRNOTAVAIL; > - sdl = malloc(sizeof *sdl, M_IFMADDR, > - M_NOWAIT|M_ZERO); > + sdl = (struct bsd_sockaddr_dl *) calloc(1, sizeof *sdl); > if (sdl == NULL) > return (ENOMEM); > sdl->sdl_len = sizeof *sdl; > @@ -1149,7 +1148,7 @@ ether_resolvemulti(struct ifnet *ifp, struct > bsd_sockaddr **llsa, > sdl->sdl_index = ifp->if_index; > sdl->sdl_type = IFT_ETHER; > sdl->sdl_alen = ETHER_ADDR_LEN; > - e_addr = LLADDR(sdl); > + e_addr = (u_char*)LLADDR(sdl); > ETHER_MAP_IPV6_MULTICAST(&sin6->sin6_addr, e_addr); > *llsa = (struct bsd_sockaddr *)sdl; > return 0; > diff --git a/bsd/sys/net/if_llatbl.cc b/bsd/sys/net/if_llatbl.cc > index 869c552..1bc7ca2 100644 > --- a/bsd/sys/net/if_llatbl.cc > +++ b/bsd/sys/net/if_llatbl.cc > @@ -40,9 +40,9 @@ > #include <bsd/sys/net/route.h> > #include <bsd/sys/net/vnet.h> > #include <bsd/sys/netinet/if_ether.h> > -#if 0 > -#include <netinet6/in6_var.h> > -#include <netinet6/nd6.h> > +#ifdef INET6 > +#include <bsd/sys/netinet6/in6_var.h> > +#include <bsd/sys/netinet6/nd6.h> > #endif > > MALLOC_DEFINE(M_LLTABLE, "lltable", "link level address tables"); > @@ -497,3 +497,44 @@ DB_SHOW_ALL_COMMAND(lltables, db_show_all_lltables) > } > } > #endif > + > +/* > + * Iterate over all lltables > + */ > +int lltable_foreach(int (*func)(struct lltable *llt, void *cbdata), void > *cbdata) > +{ > + struct lltable *llt; > + int error = 0; > + > + LLTABLE_RLOCK(); > + SLIST_FOREACH(llt, &V_lltables, llt_link) { > + if ((error = func(llt, cbdata)) != 0) > + break; > + } > + LLTABLE_RUNLOCK(); > + > + return error; > +} > + > +/* > + * Iterate over all llentries in the lltable > + */ > +int lltable_foreach_lle(struct lltable *llt, int (*func)(struct lltable > *llt, struct llentry *lle, void *cbdata), void *cbdata) > +{ > + struct llentry *lle; > + int i; > + int error = 0; > + > + for (i = 0; i < LLTBL_HASHTBL_SIZE; i++) { > + LIST_FOREACH(lle, &llt->lle_head[i], lle_next) { > + /* skip deleted entries */ > + if ((lle->la_flags & LLE_DELETED) == LLE_DELETED) > + continue; > + if ((error = func(llt, lle, cbdata)) != 0) > + break; > + } > + } > + > + return error; > +} > + > diff --git a/bsd/sys/net/if_llatbl.h b/bsd/sys/net/if_llatbl.h > index 1cac880..6e0985e 100644 > --- a/bsd/sys/net/if_llatbl.h > +++ b/bsd/sys/net/if_llatbl.h > @@ -197,6 +197,17 @@ int lltable_sysctl_dumparp(int, struct > sysctl_req *); > size_t llentry_free(struct llentry *); > struct llentry *llentry_alloc(struct ifnet *, struct lltable *, > struct bsd_sockaddr_storage *); > + > +/* > + * Iterate over all lltables > + */ > +int lltable_foreach(int (*func)(struct lltable *llt, void *cbdata), void > *cbdata); > + > +/* > + * Iterate over all llentries in the lltable > + */ > +int lltable_foreach_lle(struct lltable *llt, int (*func)(struct lltable > *llt, struct llentry *lle, void *cbdata), void *cbdata); > + > __END_DECLS > > /* > @@ -216,4 +227,6 @@ lla_lookup_fast(struct lltable *llt, u_int flags, > const struct bsd_sockaddr *l3a > } > > int lla_rt_output(struct rt_msghdr *, struct rt_addrinfo *); > + > + > #endif /* _NET_IF_LLATBL_H_ */ > diff --git a/bsd/sys/netinet/tcp_lro.cc b/bsd/sys/netinet/tcp_lro.cc > index da966f5..e4b83ad 100644 > --- a/bsd/sys/netinet/tcp_lro.cc > +++ b/bsd/sys/netinet/tcp_lro.cc > @@ -44,7 +44,7 @@ > > #include <bsd/sys/netinet/in_systm.h> > #include <bsd/sys/netinet/in.h> > -#if 0 > +#ifdef INET6 > #include <bsd/sys/netinet/ip6.h> > #endif > > @@ -53,7 +53,7 @@ > #include <bsd/sys/netinet/tcp.h> > #include <bsd/sys/netinet/tcp_lro.h> > > -#if 0 > +#ifdef INET6 > #include <netinet6/ip6_var.h> > #endif > > diff --git a/bsd/sys/netinet/tcp_lro.h b/bsd/sys/netinet/tcp_lro.h > index ca81237..63379d5 100644 > --- a/bsd/sys/netinet/tcp_lro.h > +++ b/bsd/sys/netinet/tcp_lro.h > @@ -39,18 +39,21 @@ struct lro_entry > struct mbuf *m_tail; > union { > struct ip *ip4; > - /* FIXME: OSv - uncomment when we have IPv6 */ > - /* struct ip6_hdr *ip6; */ > +#ifdef INET6 > + struct ip6_hdr *ip6; > +#endif > } leip; > union { > in_addr_t s_ip4; > - /* FIXME: OSv - uncomment when we have IPv6 */ > - /* struct in6_addr s_ip6; */ > +#ifdef INET6 > + struct in6_addr s_ip6; > +#endif > } lesource; > union { > in_addr_t d_ip4; > - /* FIXME: OSv - uncomment when we have IPv6 */ > - /* struct in6_addr d_ip6; */ > +#ifdef INET6 > + struct in6_addr d_ip6; > +#endif > } ledest; > uint16_t source_port; > uint16_t dest_port; > diff --git a/bsd/sys/netinet/tcp_reass.cc b/bsd/sys/netinet/tcp_reass.cc > index d083cd1..eb25d34 100644 > --- a/bsd/sys/netinet/tcp_reass.cc > +++ b/bsd/sys/netinet/tcp_reass.cc > @@ -52,7 +52,7 @@ > #include <bsd/sys/netinet/ip_var.h> > #include <bsd/sys/netinet/ip_options.h> > > -#if 0 > +#ifdef INET6 > #include <bsd/sys/netinet/ip6.h> > #include <bsd/sys/netinet6/in6_pcb.h> > #include <bsd/sys/netinet6/ip6_var.h> > @@ -64,7 +64,7 @@ > #include <bsd/sys/netinet/tcp_seq.h> > #include <bsd/sys/netinet/tcp_timer.h> > #include <bsd/sys/netinet/tcp_var.h> > -#if 0 > +#ifdef INET6 > #include <bsd/sys/netinet6/tcp6_var.h> > #endif > > diff --git a/bsd/sys/netinet/tcp_subr.cc b/bsd/sys/netinet/tcp_subr.cc > index 42ed83d..5343af4 100644 > --- a/bsd/sys/netinet/tcp_subr.cc > +++ b/bsd/sys/netinet/tcp_subr.cc > @@ -122,6 +122,7 @@ SYSCTL_VNET_PROC(_net_inet_tcp, TCPCTL_MSSDFLT, > mssdflt, > "Default TCP Maximum Segment Size"); > #endif > > +#if 0 > #ifdef INET6 > static int > sysctl_net_inet_tcp_mss_v6_check(SYSCTL_HANDLER_ARGS) > @@ -144,6 +145,7 @@ SYSCTL_VNET_PROC(_net_inet_tcp, TCPCTL_V6MSSDFLT, > v6mssdflt, > &sysctl_net_inet_tcp_mss_v6_check, "I", > "Default TCP Maximum Segment Size for IPv6"); > #endif /* INET6 */ > +#endif > > /* > * Minimum MSS we accept and use. This prevents DoS attacks where > @@ -466,7 +468,7 @@ tcp_respond(struct tcpcb *tp, void *ipgen, struct > tcphdr *th, struct mbuf *m, > > #ifdef INET6 > isipv6 = ((struct ip *)ipgen)->ip_v == (IPV6_VERSION >> 4); > - ip6 = ipgen; > + ip6 = (struct ip6_hdr *)ipgen; > #endif /* INET6 */ > ip = (struct ip *)ipgen; > > @@ -1733,7 +1735,7 @@ tcp_maxmtu6(struct in_conninfo *inc, int *flags) > if (sro6.ro_rt->rt_rmx.rmx_mtu == 0) > maxmtu = IN6_LINKMTU(sro6.ro_rt->rt_ifp); > else > - maxmtu = min(sro6.ro_rt->rt_rmx.rmx_mtu, > + maxmtu = bsd_min(sro6.ro_rt->rt_rmx.rmx_mtu, > IN6_LINKMTU(sro6.ro_rt->rt_ifp)); > > /* Report additional interface capabilities. */ > diff --git a/bsd/sys/netinet/tcp_syncache.cc b/bsd/sys/netinet/tcp_ > syncache.cc > index b1fb17c..e2773d4 100644 > --- a/bsd/sys/netinet/tcp_syncache.cc > +++ b/bsd/sys/netinet/tcp_syncache.cc > @@ -692,8 +692,7 @@ syncache_socket(struct syncache *sc, struct socket > *lso, struct mbuf *m) > laddr6 = inp->in6p_laddr; > if (IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_laddr)) > inp->in6p_laddr = sc->sc_inc.inc6_laddr; > - if ((error = in6_pcbconnect_mbuf(inp, (struct bsd_sockaddr > *)&sin6, > - thread0.td_ucred, m)) != 0) { > + if ((error = in6_pcbconnect_mbuf(inp, (struct bsd_sockaddr > *)&sin6, 0, m)) != 0) { > inp->in6p_laddr = laddr6; > if ((s = tcp_log_addrs(&sc->sc_inc, NULL, NULL, > NULL))) { > bsd_log(LOG_DEBUG, "%s; %s: in6_pcbconnect > failed " > diff --git a/bsd/sys/netinet/udp_usrreq.cc b/bsd/sys/netinet/udp_usrreq.cc > index 441a065..2cce860 100644 > --- a/bsd/sys/netinet/udp_usrreq.cc > +++ b/bsd/sys/netinet/udp_usrreq.cc > @@ -58,7 +58,7 @@ > #include <bsd/sys/netinet/in_var.h> > #include <bsd/sys/netinet/ip.h> > #ifdef INET6 > -#include <netinet/ip6.h> > +#include <bsd/sys/netinet/ip6.h> > #endif > #include <bsd/sys/netinet/ip_icmp.h> > #include <bsd/sys/netinet/icmp_var.h> > -- > 2.7.4 > > -- > You received this message because you are subscribed to the Google Groups > "OSv Development" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
