* 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
This commit is contained in:
parent
787cea14a5
commit
20dd899505
@ -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>
|
||||
@ -432,6 +433,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.
|
||||
*/
|
||||
|
@ -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_ */
|
||||
|
123
sys/net/if_llatbl_var.h
Normal file
123
sys/net/if_llatbl_var.h
Normal file
@ -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
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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 llentry *lle, int evt)
|
||||
|
||||
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 */
|
||||
|
@ -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>
|
||||
|
@ -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.
|
||||
|
@ -403,7 +403,9 @@ _check_in6_addr_typecast(const struct in6_addr *paddr)
|
||||
#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
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user