summaryrefslogtreecommitdiffstats
path: root/sys/dev/cxgb/cxgb_offload.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/cxgb/cxgb_offload.c')
-rw-r--r--sys/dev/cxgb/cxgb_offload.c72
1 files changed, 38 insertions, 34 deletions
diff --git a/sys/dev/cxgb/cxgb_offload.c b/sys/dev/cxgb/cxgb_offload.c
index d0b9b32..3ce1a11 100644
--- a/sys/dev/cxgb/cxgb_offload.c
+++ b/sys/dev/cxgb/cxgb_offload.c
@@ -108,9 +108,12 @@ cxgb_register_client(struct cxgb_client *client)
printf("client->add set\n");
TAILQ_FOREACH(tdev, &ofld_dev_list, entry) {
- if (offload_activated(tdev))
+ if (offload_activated(tdev)) {
+ printf("calling add=%p on %p\n",
+ client->add, tdev);
+
client->add(tdev);
- else
+ } else
printf("%p not activated\n", tdev);
}
@@ -477,7 +480,8 @@ rx_offload_blackhole(struct t3cdev *dev, struct mbuf **m, int n)
}
static void
-dummy_neigh_update(struct t3cdev *dev, struct rtentry *neigh, struct sockaddr *sa)
+dummy_neigh_update(struct t3cdev *dev, struct rtentry *neigh, uint8_t *enaddr,
+ struct sockaddr *sa)
{
}
@@ -895,17 +899,32 @@ do_term(struct t3cdev *dev, struct mbuf *m)
}
static void
-cxgb_route_event(void *unused, int event, struct rtentry *rt0,
+cxgb_arp_update_event(void *unused, struct rtentry *rt0,
+ uint8_t *enaddr, struct sockaddr *sa)
+{
+
+ if (TOEDEV(rt0->rt_ifp) == NULL)
+ return;
+
+ RT_ADDREF(rt0);
+ RT_UNLOCK(rt0);
+ cxgb_neigh_update(rt0, enaddr, sa);
+ RT_LOCK(rt0);
+ RT_REMREF(rt0);
+}
+
+
+static void
+cxgb_redirect_event(void *unused, int event, struct rtentry *rt0,
struct rtentry *rt1, struct sockaddr *sa)
{
- struct toedev *tdev0, *tdev1 = NULL;
+ struct toedev *tdev0, *tdev1;
/*
* ignore events on non-offloaded interfaces
*/
tdev0 = TOEDEV(rt0->rt_ifp);
- if (rt1)
- tdev1 = TOEDEV(rt1->rt_ifp);
+ tdev1 = TOEDEV(rt1->rt_ifp);
if (tdev0 == NULL && tdev1 == NULL)
return;
/*
@@ -914,34 +933,16 @@ cxgb_route_event(void *unused, int event, struct rtentry *rt0,
*/
RT_ADDREF(rt0);
RT_UNLOCK(rt0);
- if (rt1) {
- RT_ADDREF(rt1);
- RT_UNLOCK(rt1);
- }
-
- switch (event) {
- case RTEVENT_ARP_UPDATE: {
- cxgb_neigh_update(rt0, sa);
- break;
- }
- case RTEVENT_REDIRECT_UPDATE: {
- cxgb_redirect(rt0, rt1, sa);
- cxgb_neigh_update(rt1, sa);
+ RT_ADDREF(rt1);
+ RT_UNLOCK(rt1);
- break;
- }
- case RTEVENT_PMTU_UPDATE:
- default:
- break;
- }
+ cxgb_redirect(rt0, rt1, sa);
+ cxgb_neigh_update(rt1, NULL, sa);
RT_LOCK(rt0);
RT_REMREF(rt0);
- if (rt1) {
- RT_LOCK(rt1);
- RT_REMREF(rt1);
- }
-
+ RT_LOCK(rt1);
+ RT_REMREF(rt1);
}
/*
@@ -1048,14 +1049,14 @@ cxgb_ofld_recv(struct t3cdev *dev, struct mbuf **m, int n)
}
void
-cxgb_neigh_update(struct rtentry *rt, struct sockaddr *sa)
+cxgb_neigh_update(struct rtentry *rt, uint8_t *enaddr, struct sockaddr *sa)
{
if (is_offloading(rt->rt_ifp)) {
struct t3cdev *tdev = T3CDEV(rt->rt_ifp);
PANIC_IF(!tdev);
- t3_l2t_update(tdev, rt, sa);
+ t3_l2t_update(tdev, rt, enaddr, sa);
}
}
@@ -1425,7 +1426,10 @@ cxgb_offload_init(void)
t3_register_cpl_handler(CPL_RX_DDP_COMPLETE, do_hwtid_rpl);
t3_register_cpl_handler(CPL_ISCSI_HDR, do_hwtid_rpl);
- EVENTHANDLER_REGISTER(route_event, cxgb_route_event, NULL, EVENTHANDLER_PRI_ANY);
+ EVENTHANDLER_REGISTER(route_arp_update_event, cxgb_arp_update_event,
+ NULL, EVENTHANDLER_PRI_ANY);
+ EVENTHANDLER_REGISTER(route_redirect_event, cxgb_redirect_event,
+ NULL, EVENTHANDLER_PRI_ANY);
#if 0
if (offload_proc_init())
OpenPOWER on IntegriCloud