svn commit: r275587 - in projects/routing/sys: net netinet netinet6
Alexander V. Chernikov
melifaro at FreeBSD.org
Sun Dec 7 23:59:47 UTC 2014
Author: melifaro
Date: Sun Dec 7 23:59:44 2014
New Revision: 275587
URL: https://svnweb.freebsd.org/changeset/base/275587
Log:
Use llt_prepare_static_entry method to prepare valid per-af static entry.
Modified:
projects/routing/sys/net/if_llatbl.c
projects/routing/sys/net/if_llatbl.h
projects/routing/sys/netinet/if_ether.c
projects/routing/sys/netinet/if_ether.h
projects/routing/sys/netinet/in.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 Sun Dec 7 23:08:07 2014 (r275586)
+++ projects/routing/sys/net/if_llatbl.c Sun Dec 7 23:59:44 2014 (r275587)
@@ -440,7 +440,7 @@ lla_rt_output(struct rt_msghdr *rtm, str
struct sockaddr *dst = (struct sockaddr *)info->rti_info[RTAX_DST];
struct ifnet *ifp;
struct lltable *llt;
- struct llentry *lle;
+ struct llentry *lle, *lle_tmp;
u_int laflags = 0;
int error;
@@ -469,36 +469,37 @@ lla_rt_output(struct rt_msghdr *rtm, str
switch (rtm->rtm_type) {
case RTM_ADD:
/* Add static LLE */
- IF_AFDATA_CFG_WLOCK(ifp);
lle = llt->llt_create(llt, 0, dst);
- if (lle == NULL) {
- IF_AFDATA_CFG_WUNLOCK(ifp);
+ if (lle == NULL)
return (ENOMEM);
- }
-
- IF_AFDATA_RUN_WLOCK(ifp);
+ /* Save initial info to provide to _prepare hook */
bcopy(LLADDR(dl), &lle->ll_addr, ifp->if_addrlen);
if ((rtm->rtm_flags & RTF_ANNOUNCE))
lle->la_flags |= LLE_PUB;
- lle->la_flags |= LLE_VALID;
-#ifdef INET6
- /*
- * ND6
- */
- if (dst->sa_family == AF_INET6)
- lle->ln_state = ND6_LLINFO_REACHABLE;
-#endif
- /*
- * NB: arp and ndp always set (RTF_STATIC | RTF_HOST)
- */
-
- if (rtm->rtm_rmx.rmx_expire == 0) {
- lle->la_flags |= LLE_STATIC;
- lle->r_flags |= RLLE_VALID;
- lle->la_expire = 0;
- } else
- lle->la_expire = rtm->rtm_rmx.rmx_expire;
+ lle->la_expire = rtm->rtm_rmx.rmx_expire;
+
+ error = llt->llt_prepare_static_entry(llt, lle, info);
+
+ if (error != 0) {
+ LLE_FREE(lle);
+ return (error);
+ }
+
+ /* Let's try to link new lle to the list */
+ IF_AFDATA_CFG_WLOCK(ifp);
+ LLE_WLOCK(lle);
+ /* Check if we already have this lle */
+ /* XXX: Use LLE_UNLOCKED */
+ lle_tmp = llt->llt_lookup(llt, LLE_EXCLUSIVE, dst);
+ if (lle_tmp != NULL) {
+ IF_AFDATA_CFG_WUNLOCK(ifp);
+ LLE_WUNLOCK(lle_tmp);
+ LLE_FREE_LOCKED(lle);
+ return (EEXIST);
+ }
+
+ IF_AFDATA_RUN_WLOCK(ifp);
llentry_link(llt, lle);
IF_AFDATA_RUN_WUNLOCK(ifp);
laflags = lle->la_flags;
Modified: projects/routing/sys/net/if_llatbl.h
==============================================================================
--- projects/routing/sys/net/if_llatbl.h Sun Dec 7 23:08:07 2014 (r275586)
+++ projects/routing/sys/net/if_llatbl.h Sun Dec 7 23:59:44 2014 (r275587)
@@ -162,6 +162,8 @@ typedef void (llt_clear_entry_t)(struct
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 int (llt_foreach_cb_t)(struct lltable *, struct llentry *, void *);
typedef int (llt_foreach_entry_t)(struct lltable *, llt_foreach_cb_t *, void *);
@@ -183,6 +185,7 @@ struct lltable {
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_free_tbl_t *llt_free_tbl;
};
Modified: projects/routing/sys/netinet/if_ether.c
==============================================================================
--- projects/routing/sys/netinet/if_ether.c Sun Dec 7 23:08:07 2014 (r275586)
+++ projects/routing/sys/netinet/if_ether.c Sun Dec 7 23:59:44 2014 (r275587)
@@ -268,6 +268,20 @@ arptimer(void *arg)
CURVNET_RESTORE();
}
+int
+arp_lltable_prepare_static_entry(struct lltable *llt, struct llentry *lle,
+ struct rt_addrinfo *info)
+{
+
+ lle->la_flags |= LLE_VALID;
+ lle->r_flags |= RLLE_VALID;
+
+ if (lle->la_expire == 0)
+ lle->la_flags |= LLE_STATIC;
+
+ return (0);
+}
+
/*
* Calback for lltable.
*/
Modified: projects/routing/sys/netinet/if_ether.h
==============================================================================
--- projects/routing/sys/netinet/if_ether.h Sun Dec 7 23:08:07 2014 (r275586)
+++ projects/routing/sys/netinet/if_ether.h Sun Dec 7 23:59:44 2014 (r275587)
@@ -115,6 +115,7 @@ extern u_char ether_ipmulticast_max[ETHE
struct lltable;
struct llentry;
struct ifaddr;
+struct rt_addrinfo;
int arpresolve(struct ifnet *ifp, struct rtentry *rt, struct mbuf *m,
const struct sockaddr *dst, u_char *desten, struct llentry **lle);
@@ -126,6 +127,8 @@ void arp_ifinit(struct ifnet *, struct i
void arp_ifinit2(struct ifnet *, struct ifaddr *, u_char *);
void arp_ifscrub(struct ifnet *, uint32_t);
void arp_lltable_clear_entry(struct lltable *, struct llentry *);
+int arp_lltable_prepare_static_entry(struct lltable *, struct llentry *,
+ struct rt_addrinfo *);
#endif
#endif
Modified: projects/routing/sys/netinet/in.c
==============================================================================
--- projects/routing/sys/netinet/in.c Sun Dec 7 23:08:07 2014 (r275586)
+++ projects/routing/sys/netinet/in.c Sun Dec 7 23:59:44 2014 (r275587)
@@ -1314,6 +1314,7 @@ in_domifattach(struct ifnet *ifp)
llt->llt_hash = in_lltable_hash;
llt->llt_clear_entry = arp_lltable_clear_entry;
llt->llt_match_prefix = in_lltable_match_prefix;
+ llt->llt_prepare_static_entry = arp_lltable_prepare_static_entry;
lltable_link(llt);
ii = malloc(sizeof(struct in_ifinfo), M_IFADDR, M_WAITOK|M_ZERO);
Modified: projects/routing/sys/netinet6/in6.c
==============================================================================
--- projects/routing/sys/netinet6/in6.c Sun Dec 7 23:08:07 2014 (r275586)
+++ projects/routing/sys/netinet6/in6.c Sun Dec 7 23:59:44 2014 (r275587)
@@ -2379,6 +2379,7 @@ in6_domifattach(struct ifnet *ifp)
llt->llt_hash = in6_lltable_hash;
llt->llt_clear_entry = nd6_lltable_clear_entry;
llt->llt_match_prefix = in6_lltable_match_prefix;
+ llt->llt_prepare_static_entry = nd6_lltable_prepare_static_entry;
lltable_link(llt);
ext->lltable = llt;
Modified: projects/routing/sys/netinet6/nd6.c
==============================================================================
--- projects/routing/sys/netinet6/nd6.c Sun Dec 7 23:08:07 2014 (r275586)
+++ projects/routing/sys/netinet6/nd6.c Sun Dec 7 23:59:44 2014 (r275587)
@@ -1095,6 +1095,22 @@ nd6_free(struct llentry *ln, int gc)
llt->llt_clear_entry(ln->lle_tbl, ln);
}
+int
+nd6_lltable_prepare_static_entry(struct lltable *llt, struct llentry *lle,
+ struct rt_addrinfo *info)
+{
+
+ lle->la_flags |= LLE_VALID;
+ lle->r_flags |= RLLE_VALID;
+
+ lle->ln_state = ND6_LLINFO_REACHABLE;
+
+ if (lle->la_expire == 0)
+ lle->la_flags |= LLE_STATIC;
+
+ return (0);
+}
+
/*
* Calback for lltable.
*/
Modified: projects/routing/sys/netinet6/nd6.h
==============================================================================
--- projects/routing/sys/netinet6/nd6.h Sun Dec 7 23:08:07 2014 (r275586)
+++ projects/routing/sys/netinet6/nd6.h Sun Dec 7 23:59:44 2014 (r275587)
@@ -421,6 +421,8 @@ void nd6_rem_ifa_lle(struct in6_ifaddr *
int nd6_storelladdr(struct ifnet *, struct mbuf *,
const struct sockaddr *, u_char *, struct llentry **);
void nd6_lltable_clear_entry(struct lltable *, struct llentry *);
+int nd6_lltable_prepare_static_entry(struct lltable *, struct llentry *,
+ struct rt_addrinfo *);
/* nd6_nbr.c */
void nd6_na_input(struct mbuf *, int, int);
More information about the svn-src-projects
mailing list