svn commit: r234387 - user/np/toe_iwarp/sys/netinet
Navdeep Parhar
np at FreeBSD.org
Tue Apr 17 16:57:52 UTC 2012
Author: np
Date: Tue Apr 17 16:57:51 2012
New Revision: 234387
URL: http://svn.freebsd.org/changeset/base/234387
Log:
Replacement for the old arp_update_event. This one allows you to track
state changes of an llentry.
Modified:
user/np/toe_iwarp/sys/netinet/if_ether.c
user/np/toe_iwarp/sys/netinet/if_ether.h
user/np/toe_iwarp/sys/netinet/in.c
Modified: user/np/toe_iwarp/sys/netinet/if_ether.c
==============================================================================
--- user/np/toe_iwarp/sys/netinet/if_ether.c Tue Apr 17 16:28:22 2012 (r234386)
+++ user/np/toe_iwarp/sys/netinet/if_ether.c Tue Apr 17 16:57:51 2012 (r234387)
@@ -180,6 +180,17 @@ arptimer(void *arg)
callout_active(&lle->la_timer)) {
callout_stop(&lle->la_timer);
LLE_REMREF(lle);
+
+ if (lle->la_flags != LLE_DELETED) {
+ int evt;
+
+ if (lle->la_flags & LLE_VALID)
+ evt = LLENTRY_EXPIRED;
+ else
+ evt = LLENTRY_TIMEDOUT;
+ EVENTHANDLER_INVOKE(lle_event, lle, evt);
+ }
+
pkts_dropped = llentry_free(lle);
ARPSTAT_ADD(dropped, pkts_dropped);
ARPSTAT_INC(timeouts);
@@ -312,7 +323,7 @@ arpresolve(struct ifnet *ifp, struct rte
}
retry:
IF_AFDATA_RLOCK(ifp);
- la = lla_lookup(LLTABLE(ifp), flags, dst);
+ la = *lle = lla_lookup(LLTABLE(ifp), flags, dst);
IF_AFDATA_RUNLOCK(ifp);
if ((la == NULL) && ((flags & LLE_EXCLUSIVE) == 0)
&& ((ifp->if_flags & (IFF_NOARP | IFF_STATICARP)) == 0)) {
@@ -344,7 +355,6 @@ retry:
la->la_preempt--;
}
- *lle = la;
error = 0;
goto done;
}
@@ -727,6 +737,7 @@ match:
la->la_flags |= LLE_VALID;
EVENTHANDLER_INVOKE(arp_update_event, la);
+ EVENTHANDLER_INVOKE(lle_event, la, LLENTRY_RESOLVED);
if (!(la->la_flags & LLE_STATIC)) {
int canceled;
Modified: user/np/toe_iwarp/sys/netinet/if_ether.h
==============================================================================
--- user/np/toe_iwarp/sys/netinet/if_ether.h Tue Apr 17 16:28:22 2012 (r234386)
+++ user/np/toe_iwarp/sys/netinet/if_ether.h Tue Apr 17 16:57:51 2012 (r234387)
@@ -122,9 +122,19 @@ void arp_ifinit2(struct ifnet *, struct
void arp_ifscrub(struct ifnet *, uint32_t);
#include <sys/eventhandler.h>
+/* XXX: can be retired once OFED code is updated to use lle_event */
typedef void (*llevent_arp_update_fn)(void *, struct llentry *);
EVENTHANDLER_DECLARE(arp_update_event, llevent_arp_update_fn);
+enum {
+ LLENTRY_RESOLVED,
+ LLENTRY_TIMEDOUT,
+ LLENTRY_DELETED,
+ LLENTRY_EXPIRED,
+};
+typedef void (*lle_event_fn)(void *, struct llentry *, int);
+EVENTHANDLER_DECLARE(lle_event, lle_event_fn);
+
#endif
#endif
Modified: user/np/toe_iwarp/sys/netinet/in.c
==============================================================================
--- user/np/toe_iwarp/sys/netinet/in.c Tue Apr 17 16:28:22 2012 (r234386)
+++ user/np/toe_iwarp/sys/netinet/in.c Tue Apr 17 16:57:51 2012 (r234387)
@@ -1470,6 +1470,7 @@ in_lltable_lookup(struct lltable *llt, u
LLE_WLOCK(lle);
lle->la_flags = LLE_DELETED;
EVENTHANDLER_INVOKE(arp_update_event, lle);
+ EVENTHANDLER_INVOKE(lle_event, lle, LLENTRY_DELETED);
LLE_WUNLOCK(lle);
#ifdef DIAGNOSTIC
log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle);
More information about the svn-src-user
mailing list