summaryrefslogtreecommitdiffstats
path: root/sys/net
diff options
context:
space:
mode:
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/ethernet.h1
-rw-r--r--sys/net/if_debug.c2
-rw-r--r--sys/net/route.c11
-rw-r--r--sys/net/route.h23
-rw-r--r--sys/net/route_var.h2
-rw-r--r--sys/net/rtsock.c2
6 files changed, 38 insertions, 3 deletions
diff --git a/sys/net/ethernet.h b/sys/net/ethernet.h
index 438028d..52d8f61 100644
--- a/sys/net/ethernet.h
+++ b/sys/net/ethernet.h
@@ -333,6 +333,7 @@ struct ether_vlan_header {
#define ETHERTYPE_SLOW 0x8809 /* 802.3ad link aggregation (LACP) */
#define ETHERTYPE_PPP 0x880B /* PPP (obsolete by PPPoE) */
#define ETHERTYPE_HITACHI 0x8820 /* Hitachi Cable (Optoelectronic Systems Laboratory) */
+#define ETHERTYPE_TEST 0x8822 /* Network Conformance Testing */
#define ETHERTYPE_MPLS 0x8847 /* MPLS Unicast */
#define ETHERTYPE_MPLS_MCAST 0x8848 /* MPLS Multicast */
#define ETHERTYPE_AXIS 0x8856 /* Axis Communications AB proprietary bootstrap/config */
diff --git a/sys/net/if_debug.c b/sys/net/if_debug.c
index 1d198eb..fbcc2b0 100644
--- a/sys/net/if_debug.c
+++ b/sys/net/if_debug.c
@@ -67,6 +67,8 @@ if_show_ifnet(struct ifnet *ifp)
IF_DB_PRINTF("%p", if_l2com);
IF_DB_PRINTF("%p", if_vnet);
IF_DB_PRINTF("%p", if_home_vnet);
+ IF_DB_PRINTF("%p", if_vlantrunk);
+ IF_DB_PRINTF("%p", if_bpf);
IF_DB_PRINTF("%p", if_addr);
IF_DB_PRINTF("%p", if_llsoftc);
IF_DB_PRINTF("%p", if_label);
diff --git a/sys/net/route.c b/sys/net/route.c
index 45f479c..4b191d0 100644
--- a/sys/net/route.c
+++ b/sys/net/route.c
@@ -201,6 +201,16 @@ rt_tables_get_rnh(int table, int fam)
return (*rt_tables_get_rnh_ptr(table, fam));
}
+u_int
+rt_tables_get_gen(int table, int fam)
+{
+ struct rib_head *rnh;
+
+ rnh = *rt_tables_get_rnh_ptr(table, fam);
+ return (rnh->rnh_gen);
+}
+
+
/*
* route initialization must occur before ip6_init2(), which happenas at
* SI_ORDER_MIDDLE.
@@ -1754,6 +1764,7 @@ rtrequest1_fib(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt,
*ret_nrt = rt;
RT_ADDREF(rt);
}
+ rnh->rnh_gen++; /* Routing table updated */
RT_UNLOCK(rt);
break;
case RTM_CHANGE:
diff --git a/sys/net/route.h b/sys/net/route.h
index 6cc1e1c..e0ff6b4 100644
--- a/sys/net/route.h
+++ b/sys/net/route.h
@@ -98,6 +98,14 @@ struct rt_metrics {
/* lle state is exported in rmx_state rt_metrics field */
#define rmx_state rmx_weight
+/*
+ * Keep a generation count of routing table, incremented on route addition,
+ * so we can invalidate caches. This is accessed without a lock, as precision
+ * is not required.
+ */
+typedef volatile u_int rt_gen_t; /* tree generation (for adds) */
+#define RT_GEN(fibnum, af) rt_tables_get_gen(fibnum, af)
+
#define RT_DEFAULT_FIB 0 /* Explicitly mark fib=0 restricted cases */
#define RT_ALL_FIBS -1 /* Announce event for every fib */
#ifdef _KERNEL
@@ -398,6 +406,20 @@ struct rt_addrinfo {
} \
} while (0)
+/*
+ * Validate a cached route based on a supplied cookie. If there is an
+ * out-of-date cache, simply free it. Update the generation number
+ * for the new allocation
+ */
+#define RT_VALIDATE(ro, cookiep, fibnum) do { \
+ rt_gen_t cookie = RT_GEN(fibnum, (ro)->ro_dst.sa_family); \
+ if (*(cookiep) != cookie && (ro)->ro_rt != NULL) { \
+ RTFREE((ro)->ro_rt); \
+ (ro)->ro_rt = NULL; \
+ *(cookiep) = cookie; \
+ } \
+} while (0)
+
struct ifmultiaddr;
struct rib_head;
@@ -415,6 +437,7 @@ int rt_setgate(struct rtentry *, struct sockaddr *, struct sockaddr *);
void rt_maskedcopy(struct sockaddr *, struct sockaddr *, struct sockaddr *);
struct rib_head *rt_table_init(int);
void rt_table_destroy(struct rib_head *);
+u_int rt_tables_get_gen(int table, int fam);
int rtsock_addrmsg(int, struct ifaddr *, int);
int rtsock_routemsg(int, struct ifnet *ifp, int, struct rtentry *, int);
diff --git a/sys/net/route_var.h b/sys/net/route_var.h
index 86fc8a9..a8ef56a 100644
--- a/sys/net/route_var.h
+++ b/sys/net/route_var.h
@@ -41,7 +41,7 @@ struct rib_head {
rn_walktree_t *rnh_walktree; /* traverse tree */
rn_walktree_from_t *rnh_walktree_from; /* traverse tree below a */
rn_close_t *rnh_close; /*do something when the last ref drops*/
- u_int rnh_gen; /* generation counter */
+ rt_gen_t rnh_gen; /* generation counter */
int rnh_multipath; /* multipath capable ? */
struct radix_node rnh_nodes[3]; /* empty tree for common case */
struct rwlock rib_lock; /* config/data path lock */
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index d59ef70..810da1b 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -275,8 +275,6 @@ rts_attach(struct socket *so, int proto, struct thread *td)
/* XXX */
rp = malloc(sizeof *rp, M_PCB, M_WAITOK | M_ZERO);
- if (rp == NULL)
- return ENOBUFS;
so->so_pcb = (caddr_t)rp;
so->so_fibnum = td->td_proc->p_fibnum;
OpenPOWER on IntegriCloud