Date: Sat, 3 Jan 2015 16:04:29 +0000 (UTC) From: "Alexander V. Chernikov" <melifaro@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r276624 - in projects/routing/sys: net netinet netinet6 Message-ID: <201501031604.t03G4TRa022748@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: melifaro Date: Sat Jan 3 16:04:28 2015 New Revision: 276624 URL: https://svnweb.freebsd.org/changeset/base/276624 Log: * Hide lltable implementation details in if_llatbl_var.h * Make most of lltable_* methods 'normal' functions instead of inline * Add lltable_get_<af|ifp>() functions to access given lltable fields * Temporarily resurrect nd6_lookup() function Added: projects/routing/sys/net/if_llatbl_var.h (contents, props changed) Modified: projects/routing/sys/net/if_llatbl.c projects/routing/sys/net/if_llatbl.h projects/routing/sys/net/rt_nhops.c projects/routing/sys/netinet/if_ether.c projects/routing/sys/netinet/in.c projects/routing/sys/netinet/toecore.c projects/routing/sys/netinet6/in6.c projects/routing/sys/netinet6/nd6.c projects/routing/sys/netinet6/nd6.h Modified: projects/routing/sys/net/if_llatbl.c ============================================================================== --- projects/routing/sys/net/if_llatbl.c Sat Jan 3 15:39:04 2015 (r276623) +++ projects/routing/sys/net/if_llatbl.c Sat Jan 3 16:04:28 2015 (r276624) @@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$"); #include <netinet/in.h> #include <net/if_llatbl.h> +#include <net/if_llatbl_var.h> #include <net/if.h> #include <net/if_dl.h> #include <net/if_var.h> @@ -433,6 +434,64 @@ lltable_unlink(struct lltable *llt) } /* + * External methods used by lltable consumers + */ + +struct llentry * +lltable_create_lle(struct lltable *llt, u_int flags, + const void *paddr) +{ + + return (llt->llt_create(llt, flags, paddr)); +} + +int +lltable_delete_addr(struct lltable *llt, u_int flags, + const struct sockaddr *l3addr) +{ + + return llt->llt_delete_addr(llt, flags, l3addr); +} + +void +lltable_link_entry(struct lltable *llt, struct llentry *lle) +{ + + llt->llt_link_entry(llt, lle); +} + +void +lltable_unlink_entry(struct lltable *llt, struct llentry *lle) +{ + + llt->llt_unlink_entry(lle); +} + +void +lltable_fill_sa_entry(const struct llentry *lle, struct sockaddr *sa) +{ + struct lltable *llt; + + llt = lle->lle_tbl; + + llt->llt_fill_sa_entry(lle, sa); +} + +struct ifnet * +lltable_get_ifp(const struct lltable *llt) +{ + + return (llt->llt_ifp); +} + +int +lltable_get_af(const struct lltable *llt) +{ + + return (llt->llt_af); +} + +/* * Called in route_output when rtm_flags contains RTF_LLDATA. */ int Modified: projects/routing/sys/net/if_llatbl.h ============================================================================== --- projects/routing/sys/net/if_llatbl.h Sat Jan 3 15:39:04 2015 (r276623) +++ projects/routing/sys/net/if_llatbl.h Sat Jan 3 16:04:28 2015 (r276624) @@ -24,7 +24,6 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ -#include <sys/cdefs.h> __FBSDID("$FreeBSD$"); #ifndef _NET_IF_LLATBL_H_ @@ -34,20 +33,9 @@ __FBSDID("$FreeBSD$"); #include <netinet/in.h> struct ifnet; -struct sysctl_req; -struct rt_msghdr; -struct rt_addrinfo; - struct llentry; LIST_HEAD(llentries, llentry); -extern struct rwlock lltable_rwlock; -#define LLTABLE_RLOCK() rw_rlock(&lltable_rwlock) -#define LLTABLE_RUNLOCK() rw_runlock(&lltable_rwlock) -#define LLTABLE_WLOCK() rw_wlock(&lltable_rwlock) -#define LLTABLE_WUNLOCK() rw_wunlock(&lltable_rwlock) -#define LLTABLE_LOCK_ASSERT() rw_assert(&lltable_rwlock, RA_LOCKED) - struct llentry { /* FIELDS PROTECTED BY IFDATA LOCK */ LIST_ENTRY(llentry) lle_next; @@ -88,7 +76,6 @@ struct llentry { struct callout ln_timer_ch; struct callout la_timer; } lle_timer; - /* NB: struct sockaddr must immediately follow */ }; #define LLE_WLOCK(lle) rw_wlock(&(lle)->lle_lock) @@ -135,62 +122,6 @@ struct llentry { #define ln_timer_ch lle_timer.ln_timer_ch #define la_timer lle_timer.la_timer -#ifndef LLTBL_HASHTBL_SIZE -#define LLTBL_HASHTBL_SIZE 32 /* default 32 ? */ -#endif - -#ifndef LLTBL_HASHMASK -#define LLTBL_HASHMASK (LLTBL_HASHTBL_SIZE - 1) -#endif - -typedef struct llentry *(llt_lookup_t)(struct lltable *, u_int flags, - const void *paddr); -typedef struct llentry *(llt_create_t)(struct lltable *, u_int flags, - const void *paddr); -typedef int (llt_delete_addr_t)(struct lltable *, u_int flags, - const struct sockaddr *l3addr); -typedef int (llt_dump_entry_t)(struct lltable *, struct llentry *, - struct sysctl_req *); -typedef uint32_t (llt_hash_t)(const struct llentry *); -typedef int (llt_match_prefix_t)(const struct sockaddr *, - const struct sockaddr *, u_int, struct llentry *); -typedef void (llt_clear_entry_t)(struct lltable *, struct llentry *); -typedef void (llt_free_tbl_t)(struct lltable *); -typedef void (llt_link_entry_t)(struct lltable *, struct llentry *); -typedef void (llt_unlink_entry_t)(struct llentry *); -typedef int (llt_prepare_sentry_t)(struct lltable *, struct llentry *, - struct rt_addrinfo *); -typedef const void *(llt_get_sa_addr_t)(const struct sockaddr *l3addr); -typedef void (llt_fill_sa_entry_t)(const struct llentry *, struct sockaddr *); - -typedef int (llt_foreach_cb_t)(struct lltable *, struct llentry *, void *); -typedef int (llt_foreach_entry_t)(struct lltable *, llt_foreach_cb_t *, void *); - - -struct lltable { - SLIST_ENTRY(lltable) llt_link; - struct llentries lle_head[LLTBL_HASHTBL_SIZE]; - int llt_af; - struct ifnet *llt_ifp; - - llt_lookup_t *llt_lookup; - llt_create_t *llt_create; - llt_delete_addr_t *llt_delete_addr; - llt_dump_entry_t *llt_dump_entry; - llt_hash_t *llt_hash; - llt_match_prefix_t *llt_match_prefix; - llt_clear_entry_t *llt_clear_entry; - llt_foreach_entry_t *llt_foreach_entry; - llt_link_entry_t *llt_link_entry; - llt_unlink_entry_t *llt_unlink_entry; - llt_prepare_sentry_t *llt_prepare_static_entry; - llt_get_sa_addr_t *llt_get_sa_addr; - llt_fill_sa_entry_t *llt_fill_sa_entry; - llt_free_tbl_t *llt_free_tbl; -}; - -MALLOC_DECLARE(M_LLTABLE); - /* * LLE flags used by fast path code */ @@ -210,77 +141,6 @@ MALLOC_DECLARE(M_LLTABLE); #define LLE_UNLOCKED 0x0100 /* return lle unlocked */ #define LLE_EXCLUSIVE 0x0200 /* return lle wlocked */ -#define LLATBL_HASH(key, mask) \ - (((((((key >> 8) ^ key) >> 8) ^ key) >> 8) ^ key) & mask) - -void lltable_link(struct lltable *); -void lltable_free(struct lltable *); -void lltable_prefix_free(int, struct sockaddr *, - struct sockaddr *, u_int); -#if 0 -void lltable_drain(int); -#endif -int lltable_sysctl_dumparp(int, struct sysctl_req *); - -struct llentry *llentry_alloc(struct ifnet *, struct lltable *, - struct sockaddr_storage *); - -/* helper functions */ -size_t lltable_drop_entry_queue(struct llentry *); - -/* - * Generic link layer address lookup function. - */ -static __inline struct llentry * -lltable_lookup_lle(struct lltable *llt, u_int flags, - const void *paddr) -{ - - return (llt->llt_lookup(llt, flags, paddr)); -} - -static __inline struct llentry * -lltable_create_lle(struct lltable *llt, u_int flags, - const void *paddr) -{ - - return (llt->llt_create(llt, flags, paddr)); -} - -static __inline int -lltable_delete_addr(struct lltable *llt, u_int flags, - const struct sockaddr *l3addr) -{ - - return llt->llt_delete_addr(llt, flags, l3addr); -} - -static __inline void -lltable_link_entry(struct lltable *llt, struct llentry *lle) -{ - - llt->llt_link_entry(llt, lle); -} - -static __inline void -lltable_unlink_entry(struct lltable *llt, struct llentry *lle) -{ - - llt->llt_unlink_entry(lle); -} - -static __inline void -lltable_fill_sa_entry(const struct llentry *lle, struct sockaddr *sa) -{ - struct lltable *llt; - - llt = lle->lle_tbl; - - llt->llt_fill_sa_entry(lle, sa); -} - -int lla_rt_output(struct rt_msghdr *, struct rt_addrinfo *); - #include <sys/eventhandler.h> enum { LLENTRY_RESOLVED, @@ -290,4 +150,21 @@ enum { }; typedef void (*lle_event_fn)(void *, struct llentry *, int); EVENTHANDLER_DECLARE(lle_event, lle_event_fn); + +struct sysctl_req; +struct rt_msghdr; +struct rt_addrinfo; +int lltable_sysctl_dumparp(int af, struct sysctl_req *wr); +int lla_rt_output(struct rt_msghdr *, struct rt_addrinfo *); + +void lltable_fill_sa_entry(const struct llentry *lle, struct sockaddr *sa); +void lltable_prefix_free(int af, struct sockaddr *prefix, struct sockaddr *mask, + u_int flags); +struct ifnet *lltable_get_ifp(const struct lltable *llt); +int lltable_get_af(const struct lltable *llt); + +/* XXX: Remove after converting flowtable */ +struct llentry *llentry_alloc(struct ifnet *ifp, struct lltable *lt, + struct sockaddr_storage *dst); + #endif /* _NET_IF_LLATBL_H_ */ Added: projects/routing/sys/net/if_llatbl_var.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/routing/sys/net/if_llatbl_var.h Sat Jan 3 16:04:28 2015 (r276624) @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2014 Alexander V. Chernikov. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +__FBSDID("$FreeBSD$"); + +#ifndef _NET_IF_LLATBL_VAR_H_ +#define _NET_IF_LLATBL_VAR_H_ + + +extern struct rwlock lltable_rwlock; +#define LLTABLE_RLOCK() rw_rlock(&lltable_rwlock) +#define LLTABLE_RUNLOCK() rw_runlock(&lltable_rwlock) +#define LLTABLE_WLOCK() rw_wlock(&lltable_rwlock) +#define LLTABLE_WUNLOCK() rw_wunlock(&lltable_rwlock) +#define LLTABLE_LOCK_ASSERT() rw_assert(&lltable_rwlock, RA_LOCKED) + +#ifndef LLTBL_HASHTBL_SIZE +#define LLTBL_HASHTBL_SIZE 32 /* default 32 ? */ +#endif + +#ifndef LLTBL_HASHMASK +#define LLTBL_HASHMASK (LLTBL_HASHTBL_SIZE - 1) +#endif + +#define LLATBL_HASH(key, mask) \ + (((((((key >> 8) ^ key) >> 8) ^ key) >> 8) ^ key) & mask) + +typedef struct llentry *(llt_lookup_t)(struct lltable *, u_int flags, + const void *paddr); +typedef struct llentry *(llt_create_t)(struct lltable *, u_int flags, + const void *paddr); +typedef int (llt_delete_addr_t)(struct lltable *, u_int flags, + const struct sockaddr *l3addr); +typedef int (llt_dump_entry_t)(struct lltable *, struct llentry *, + struct sysctl_req *); +typedef uint32_t (llt_hash_t)(const struct llentry *); +typedef int (llt_match_prefix_t)(const struct sockaddr *, + const struct sockaddr *, u_int, struct llentry *); +typedef void (llt_clear_entry_t)(struct lltable *, struct llentry *); +typedef void (llt_free_tbl_t)(struct lltable *); +typedef void (llt_link_entry_t)(struct lltable *, struct llentry *); +typedef void (llt_unlink_entry_t)(struct llentry *); +typedef int (llt_prepare_sentry_t)(struct lltable *, struct llentry *, + struct rt_addrinfo *); +typedef const void *(llt_get_sa_addr_t)(const struct sockaddr *l3addr); +typedef void (llt_fill_sa_entry_t)(const struct llentry *, struct sockaddr *); + +typedef int (llt_foreach_cb_t)(struct lltable *, struct llentry *, void *); +typedef int (llt_foreach_entry_t)(struct lltable *, llt_foreach_cb_t *, void *); + + +struct lltable { + SLIST_ENTRY(lltable) llt_link; + struct llentries lle_head[LLTBL_HASHTBL_SIZE]; + int llt_af; + struct ifnet *llt_ifp; + + llt_lookup_t *llt_lookup; + llt_create_t *llt_create; + llt_delete_addr_t *llt_delete_addr; + llt_dump_entry_t *llt_dump_entry; + llt_hash_t *llt_hash; + llt_match_prefix_t *llt_match_prefix; + llt_clear_entry_t *llt_clear_entry; + llt_foreach_entry_t *llt_foreach_entry; + llt_link_entry_t *llt_link_entry; + llt_unlink_entry_t *llt_unlink_entry; + llt_prepare_sentry_t *llt_prepare_static_entry; + llt_get_sa_addr_t *llt_get_sa_addr; + llt_fill_sa_entry_t *llt_fill_sa_entry; + llt_free_tbl_t *llt_free_tbl; +}; + +MALLOC_DECLARE(M_LLTABLE); + +void lltable_link(struct lltable *llt); +void lltable_free(struct lltable *llt); + +/* helper functions */ +size_t lltable_drop_entry_queue(struct llentry *); + +/* + * Generic link layer table methods. + */ + +static __inline struct llentry * +lltable_lookup_lle(struct lltable *llt, u_int flags, + const void *paddr) +{ + + return (llt->llt_lookup(llt, flags, paddr)); +} + +struct llentry *lltable_create_lle(struct lltable *llt, u_int flags, + const void *paddr); +int lltable_delete_addr(struct lltable *llt, u_int flags, + const struct sockaddr *l3addr); +void lltable_link_entry(struct lltable *llt, struct llentry *lle); +void lltable_unlink_entry(struct lltable *llt, struct llentry *lle); + + +#endif Modified: projects/routing/sys/net/rt_nhops.c ============================================================================== --- projects/routing/sys/net/rt_nhops.c Sat Jan 3 15:39:04 2015 (r276623) +++ projects/routing/sys/net/rt_nhops.c Sat Jan 3 16:04:28 2015 (r276624) @@ -74,6 +74,7 @@ #include <netinet6/scope6_var.h> #include <net/if_llatbl.h> +#include <net/if_llatbl_var.h> #include <net/if_types.h> #include <netinet/if_ether.h> Modified: projects/routing/sys/netinet/if_ether.c ============================================================================== --- projects/routing/sys/netinet/if_ether.c Sat Jan 3 15:39:04 2015 (r276623) +++ projects/routing/sys/netinet/if_ether.c Sat Jan 3 16:04:28 2015 (r276624) @@ -66,6 +66,7 @@ __FBSDID("$FreeBSD$"); #include <netinet/in.h> #include <netinet/in_var.h> #include <net/if_llatbl.h> +#include <net/if_llatbl_var.h> #include <netinet/if_ether.h> #ifdef INET #include <netinet/ip_carp.h> Modified: projects/routing/sys/netinet/in.c ============================================================================== --- projects/routing/sys/netinet/in.c Sat Jan 3 15:39:04 2015 (r276623) +++ projects/routing/sys/netinet/in.c Sat Jan 3 16:04:28 2015 (r276624) @@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$"); #include <net/if_arp.h> #include <net/if_dl.h> #include <net/if_llatbl.h> +#include <net/if_llatbl_var.h> #include <net/if_types.h> #include <net/route.h> #include <net/vnet.h> Modified: projects/routing/sys/netinet/toecore.c ============================================================================== --- projects/routing/sys/netinet/toecore.c Sat Jan 3 15:39:04 2015 (r276623) +++ projects/routing/sys/netinet/toecore.c Sat Jan 3 16:04:28 2015 (r276624) @@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$"); #include <net/if_types.h> #include <net/if_vlan_var.h> #include <net/if_llatbl.h> +#include <net/if_llatbl_var.h> #include <net/route.h> #include <netinet/if_ether.h> @@ -397,8 +398,8 @@ toe_lle_event(void *arg __unused, struct LLE_WLOCK_ASSERT(lle); - ifp = lle->lle_tbl->llt_ifp; - sa_family = lle->lle_tbl->llt_af; + ifp = lltable_get_ifp(lle->lle_tbl); + sa_family = lltable_get_af(lle->lle_tbl); #if 0 /* XXX: Do not panic, ignore event instead */ Modified: projects/routing/sys/netinet6/in6.c ============================================================================== --- projects/routing/sys/netinet6/in6.c Sat Jan 3 15:39:04 2015 (r276623) +++ projects/routing/sys/netinet6/in6.c Sat Jan 3 16:04:28 2015 (r276624) @@ -95,6 +95,7 @@ __FBSDID("$FreeBSD$"); #include <netinet/in.h> #include <netinet/in_var.h> #include <net/if_llatbl.h> +#include <net/if_llatbl_var.h> #include <netinet/if_ether.h> #include <netinet/in_systm.h> #include <netinet/ip.h> Modified: projects/routing/sys/netinet6/nd6.c ============================================================================== --- projects/routing/sys/netinet6/nd6.c Sat Jan 3 15:39:04 2015 (r276623) +++ projects/routing/sys/netinet6/nd6.c Sat Jan 3 16:04:28 2015 (r276624) @@ -68,6 +68,7 @@ __FBSDID("$FreeBSD$"); #include <netinet/in.h> #include <netinet/in_kdtrace.h> #include <net/if_llatbl.h> +#include <net/if_llatbl_var.h> #include <netinet/if_ether.h> #include <netinet6/in6_var.h> #include <netinet/ip6.h> @@ -815,6 +816,15 @@ regen_tmpaddr(struct in6_ifaddr *ia6) return (-1); } + +struct llentry * +nd6_lookup(struct in6_addr *addr, u_int flags, struct ifnet *ifp) +{ + + return (lltable_lookup_lle(LLTABLE6(ifp), flags, addr)); +} + + /* * Nuke neighbor cache/prefix/default router management table, right before * ifp goes away. Modified: projects/routing/sys/netinet6/nd6.h ============================================================================== --- projects/routing/sys/netinet6/nd6.h Sat Jan 3 15:39:04 2015 (r276623) +++ projects/routing/sys/netinet6/nd6.h Sat Jan 3 16:04:28 2015 (r276624) @@ -403,7 +403,9 @@ _check_in6_addr_typecast(const struct in #define lltable_create_lle6(i, f, a) \ lltable_create_lle(LLTABLE6(i), (f), _check_in6_addr_typecast(a)) -#define nd6_lookup(a, f, i) lltable_lookup_lle6((i), (f), (a)) +struct llentry *nd6_lookup(struct in6_addr *addr, u_int flags, + struct ifnet *ifp); + #define ND6_EXCLUSIVE LLE_EXCLUSIVE
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201501031604.t03G4TRa022748>