diff options
Diffstat (limited to 'sys/net')
-rw-r--r-- | sys/net/ethernet.h | 1 | ||||
-rw-r--r-- | sys/net/if_debug.c | 2 | ||||
-rw-r--r-- | sys/net/route.c | 11 | ||||
-rw-r--r-- | sys/net/route.h | 23 | ||||
-rw-r--r-- | sys/net/route_var.h | 2 | ||||
-rw-r--r-- | sys/net/rtsock.c | 2 |
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; |