From ddd208f7addb378feb10e5148cdec2142d57d0c1 Mon Sep 17 00:00:00 2001 From: "Alexander V. Chernikov" Date: Sat, 7 Nov 2015 11:12:00 +0000 Subject: [PATCH] Unify setting lladdr for AF_INET[6]. --- sys/net/if_llatbl.c | 9 +++++++++ sys/net/if_llatbl.h | 2 ++ sys/netinet/if_ether.c | 17 ++--------------- sys/netinet/in.c | 4 ++-- sys/netinet6/in6.c | 4 ++-- sys/netinet6/nd6.c | 9 +++------ sys/netinet6/nd6_nbr.c | 6 ++---- 7 files changed, 22 insertions(+), 29 deletions(-) diff --git a/sys/net/if_llatbl.c b/sys/net/if_llatbl.c index dbb96539b4e5..1c16b2d629af 100644 --- a/sys/net/if_llatbl.c +++ b/sys/net/if_llatbl.c @@ -277,6 +277,15 @@ lltable_drop_entry_queue(struct llentry *lle) return (pkts_dropped); } +void +lltable_set_entry_addr(struct ifnet *ifp, struct llentry *lle, + const char *lladdr) +{ + + bcopy(lladdr, &lle->ll_addr, ifp->if_addrlen); + lle->la_flags |= LLE_VALID; +} + /* * * Performes generic cleanup routines and frees lle. diff --git a/sys/net/if_llatbl.h b/sys/net/if_llatbl.h index 1415ad440eda..2009a7a998d0 100644 --- a/sys/net/if_llatbl.h +++ b/sys/net/if_llatbl.h @@ -207,6 +207,8 @@ struct llentry *llentry_alloc(struct ifnet *, struct lltable *, /* helper functions */ size_t lltable_drop_entry_queue(struct llentry *); +void lltable_set_entry_addr(struct ifnet *ifp, struct llentry *lle, + const char *lladdr); struct llentry *lltable_alloc_entry(struct lltable *llt, u_int flags, const struct sockaddr *l4addr); diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c index aa616eb39d54..f9d3612b046a 100644 --- a/sys/netinet/if_ether.c +++ b/sys/netinet/if_ether.c @@ -141,8 +141,6 @@ static void in_arpinput(struct mbuf *); static void arp_check_update_lle(struct arphdr *ah, struct in_addr isaddr, struct ifnet *ifp, int bridged, struct llentry *la); -static void arp_update_lle(struct arphdr *ah, struct ifnet *ifp, - struct llentry *la); static void arp_mark_lle_reachable(struct llentry *la); @@ -820,7 +818,7 @@ match: la = lltable_alloc_entry(LLTABLE(ifp), 0, dst); if (la == NULL) goto drop; - arp_update_lle(ah, ifp, la); + lltable_set_entry_addr(ifp, la, ar_sha(ah)); IF_AFDATA_WLOCK(ifp); LLE_WLOCK(la); @@ -1038,7 +1036,7 @@ arp_check_update_lle(struct arphdr *ah, struct in_addr isaddr, struct ifnet *ifp } /* Update data */ - arp_update_lle(ah, ifp, la); + lltable_set_entry_addr(ifp, la, ar_sha(ah)); IF_AFDATA_WUNLOCK(ifp); LLE_REMREF(la); @@ -1070,17 +1068,6 @@ arp_check_update_lle(struct arphdr *ah, struct in_addr isaddr, struct ifnet *ifp LLE_WUNLOCK(la); } -/* - * Updates @la fields used by fast path code. - */ -static void -arp_update_lle(struct arphdr *ah, struct ifnet *ifp, struct llentry *la) -{ - - memcpy(&la->ll_addr, ar_sha(ah), ifp->if_addrlen); - la->la_flags |= LLE_VALID; -} - static void arp_mark_lle_reachable(struct llentry *la) { diff --git a/sys/netinet/in.c b/sys/netinet/in.c index 2607a1750ffd..ce80d9555b67 100644 --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -1258,8 +1258,8 @@ in_lltable_alloc(struct lltable *llt, u_int flags, const struct sockaddr *l3addr } lle->la_flags = flags; if ((flags & LLE_IFADDR) == LLE_IFADDR) { - bcopy(IF_LLADDR(ifp), &lle->ll_addr, ifp->if_addrlen); - lle->la_flags |= (LLE_VALID | LLE_STATIC); + lltable_set_entry_addr(ifp, lle, IF_LLADDR(ifp)); + lle->la_flags |= LLE_STATIC; } return (lle); diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index af62ed1d9f99..65e7ab0d7b20 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -2261,8 +2261,8 @@ in6_lltable_alloc(struct lltable *llt, u_int flags, } lle->la_flags = flags; if ((flags & LLE_IFADDR) == LLE_IFADDR) { - bcopy(IF_LLADDR(ifp), &lle->ll_addr, ifp->if_addrlen); - lle->la_flags |= (LLE_VALID | LLE_STATIC); + lltable_set_entry_addr(ifp, lle, IF_LLADDR(ifp)); + lle->la_flags |= LLE_STATIC; } if ((lle->la_flags & LLE_STATIC) != 0) diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c index 23e7a9bbe97f..46f09239b032 100644 --- a/sys/netinet6/nd6.c +++ b/sys/netinet6/nd6.c @@ -1738,10 +1738,8 @@ nd6_cache_lladdr(struct ifnet *ifp, struct in6_addr *from, char *lladdr, * Since we already know all the data for the new entry, * fill it before insertion. */ - if (lladdr != NULL) { - bcopy(lladdr, &ln->ll_addr, ifp->if_addrlen); - ln->la_flags |= LLE_VALID; - } + if (lladdr != NULL) + lltable_set_entry_addr(ifp, ln, lladdr); IF_AFDATA_WLOCK(ifp); LLE_WLOCK(ln); /* Prefer any existing lle over newly-created one */ @@ -1799,8 +1797,7 @@ nd6_cache_lladdr(struct ifnet *ifp, struct in6_addr *from, char *lladdr, * Record source link-layer address * XXX is it dependent to ifp->if_type? */ - bcopy(lladdr, &ln->ll_addr, ifp->if_addrlen); - ln->la_flags |= LLE_VALID; + lltable_set_entry_addr(ifp, ln, lladdr); nd6_llinfo_setstate(ln, ND6_LLINFO_STALE); EVENTHANDLER_INVOKE(lle_event, ln, LLENTRY_RESOLVED); diff --git a/sys/netinet6/nd6_nbr.c b/sys/netinet6/nd6_nbr.c index 199dbee9e88b..93d5b586894b 100644 --- a/sys/netinet6/nd6_nbr.c +++ b/sys/netinet6/nd6_nbr.c @@ -765,8 +765,7 @@ nd6_na_input(struct mbuf *m, int off, int icmp6len) /* * Record link-layer address, and update the state. */ - bcopy(lladdr, &ln->ll_addr, ifp->if_addrlen); - ln->la_flags |= LLE_VALID; + lltable_set_entry_addr(ifp, ln, lladdr); EVENTHANDLER_INVOKE(lle_event, ln, LLENTRY_RESOLVED); if (is_solicited) nd6_llinfo_setstate(ln, ND6_LLINFO_REACHABLE); @@ -832,8 +831,7 @@ nd6_na_input(struct mbuf *m, int off, int icmp6len) * Update link-local address, if any. */ if (lladdr != NULL) { - bcopy(lladdr, &ln->ll_addr, ifp->if_addrlen); - ln->la_flags |= LLE_VALID; + lltable_set_entry_addr(ifp, ln, lladdr); EVENTHANDLER_INVOKE(lle_event, ln, LLENTRY_RESOLVED); }