Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Dec 2007 03:46:57 GMT
From:      Kip Macy <kmacy@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 130580 for review
Message-ID:  <200712100346.lBA3kvN4098276@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=130580

Change 130580 by kmacy@kmacy:storage:toestack on 2007/12/10 03:46:32

	the rtentry doesn't necessarily contain the ip address that we
	need to resolve the L2 address for - extend the interface to pass
	the address in directly

Affected files ...

.. //depot/projects/toestack/sys/dev/cxgb/cxgb_l2t.c#12 edit
.. //depot/projects/toestack/sys/dev/cxgb/cxgb_l2t.h#11 edit
.. //depot/projects/toestack/sys/dev/cxgb/cxgb_offload.c#21 edit
.. //depot/projects/toestack/sys/dev/cxgb/cxgb_offload.h#7 edit
.. //depot/projects/toestack/sys/dev/cxgb/t3cdev.h#5 edit
.. //depot/projects/toestack/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cm.c#2 edit
.. //depot/projects/toestack/sys/net/route.c#9 edit
.. //depot/projects/toestack/sys/net/route.h#7 edit
.. //depot/projects/toestack/sys/netinet/if_ether.c#14 edit
.. //depot/projects/toestack/sys/netinet/ip_icmp.c#8 edit

Differences ...

==== //depot/projects/toestack/sys/dev/cxgb/cxgb_l2t.c#12 (text+ko) ====

@@ -166,18 +166,20 @@
 }
 
 int
-t3_l2t_send_slow(struct t3cdev *dev, struct mbuf *m,
-		     struct l2t_entry *e)
+t3_l2t_send_slow(struct t3cdev *dev, struct mbuf *m, struct l2t_entry *e)
 {
-	struct rtentry *rt;
+	struct rtentry *rt =  e->neigh;
+	struct sockaddr_in sin;
+	sin.sin_family = AF_INET;
+	sin.sin_len = sizeof(struct sockaddr_in);
+	sin.sin_addr.s_addr = htonl(e->addr);
 	
-	rt = e->neigh;
-	printf("send slow on rt=%p\n", rt);
+	printf("send slow on rt=%p eaddr=0x%08x\n", rt, e->addr);
 	
 again:
 	switch (e->state) {
 	case L2T_STATE_STALE:     /* entry is stale, kick off revalidation */
-		arpresolve(rt->rt_ifp, rt, NULL, rt_key(rt), e->dmac);
+		arpresolve(rt->rt_ifp, rt, NULL, (struct sockaddr *)&sin, e->dmac);
 		mtx_lock(&e->lock);
 		if (e->state == L2T_STATE_STALE)
 			e->state = L2T_STATE_VALID;
@@ -202,8 +204,11 @@
 		 * A better way would be to use a work request to retry L2T
 		 * entries when there's no memory.
 		 */
-		printf("doing arpresolve\n");
-		if (arpresolve(rt->rt_ifp, rt, NULL, rt_key(rt), e->dmac) == 0) {
+		printf("doing arpresolve on 0x%x \n", e->addr);
+		if (arpresolve(rt->rt_ifp, rt, NULL, (struct sockaddr *)&sin, e->dmac) == 0) {
+			printf("mac=%x:%x:%x:%x:%x:%x\n",
+			    e->dmac[0], e->dmac[1], e->dmac[2], e->dmac[3], e->dmac[4], e->dmac[5]);
+			
 			if ((m = m_gethdr(M_NOWAIT, MT_DATA)) == NULL)
 				return (ENOMEM);
 
@@ -224,6 +229,10 @@
 {
 	struct rtentry *rt;
 	struct mbuf *m0;
+	struct sockaddr_in sin;
+	sin.sin_family = AF_INET;
+	sin.sin_len = sizeof(struct sockaddr_in);
+	sin.sin_addr.s_addr = htonl(e->addr);
 	
 	if ((m0 = m_gethdr(M_NOWAIT, MT_DATA)) == NULL)
 		return;
@@ -232,7 +241,7 @@
 again:
 	switch (e->state) {
 	case L2T_STATE_STALE:     /* entry is stale, kick off revalidation */
-		arpresolve(rt->rt_ifp, rt, m0, rt_key(rt), e->dmac);
+		arpresolve(rt->rt_ifp, rt, m0, (struct sockaddr *)&sin, e->dmac);
 		mtx_lock(&e->lock);
 		if (e->state == L2T_STATE_STALE) {
 			e->state = L2T_STATE_VALID;
@@ -259,7 +268,7 @@
 		 * A better way would be to use a work request to retry L2T
 		 * entries when there's no memory.
 		 */
-		arpresolve(rt->rt_ifp, rt, m0, rt_key(rt), e->dmac);
+		arpresolve(rt->rt_ifp, rt, m0, (struct sockaddr *)&sin, e->dmac);
 
 	}
 	return;
@@ -358,11 +367,12 @@
 }
 
 struct l2t_entry *
-t3_l2t_get(struct t3cdev *dev, struct rtentry *neigh, struct ifnet *ifp)
+t3_l2t_get(struct t3cdev *dev, struct rtentry *neigh, struct ifnet *ifp,
+	struct sockaddr *sa)
 {
 	struct l2t_entry *e;
 	struct l2t_data *d = L2DATA(dev);
-	u32 addr = *(u32 *) rt_key(neigh);
+	u32 addr = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
 	int ifidx = neigh->rt_ifp->if_index;
 	int hash = arp_hash(addr, ifidx, d);
 	unsigned int smt_idx = ((struct port_info *)ifp->if_softc)->port_id;
@@ -394,6 +404,7 @@
 		atomic_store_rel_int(&e->refcnt, 1);
 		e->neigh = NULL;
 		
+		
 		neigh_replace(e, neigh);
 #ifdef notyet
 		/* 
@@ -444,19 +455,19 @@
 }
 
 void
-t3_l2t_update(struct t3cdev *dev, struct rtentry *neigh)
+t3_l2t_update(struct t3cdev *dev, struct rtentry *neigh, struct sockaddr *sa)
 {
 	struct l2t_entry *e;
 	struct mbuf *arpq = NULL;
 	struct l2t_data *d = L2DATA(dev);
-	u32 addr = *(u32 *) rt_key(neigh);
+	u32 addr = *(u32 *) &((struct sockaddr_in *)sa)->sin_addr;
 	int ifidx = neigh->rt_ifp->if_index;
 	int hash = arp_hash(addr, ifidx, d);
 	struct llinfo_arp *la;
 	u_char edst[ETHER_ADDR_LEN];
-	
+
 
-	arpresolve(neigh->rt_ifp, neigh, NULL, rt_key(neigh), edst);
+	printf("t3_l2t_update called with arp info\n");
 	
 	rw_rlock(&d->lock);
 	for (e = d->l2tab[hash].first; e; e = e->next)
@@ -465,9 +476,13 @@
 			goto found;
 		}
 	rw_runlock(&d->lock);
+	printf("addr=0x%08x not found\n", addr);
 	return;
 
 found:
+	printf("found 0x%08x\n", addr);
+	arpresolve(neigh->rt_ifp, neigh, NULL, sa, edst);
+
 	rw_runlock(&d->lock);
 	memcpy(e->dmac, edst, ETHER_ADDR_LEN);
 	

==== //depot/projects/toestack/sys/dev/cxgb/cxgb_l2t.h#11 (text+ko) ====

@@ -118,9 +118,9 @@
 #define L2DATA(dev) ((dev)->l2opt)
 
 void t3_l2e_free(struct l2t_data *d, struct l2t_entry *e);
-void t3_l2t_update(struct t3cdev *dev, struct rtentry *ifp);
+void t3_l2t_update(struct t3cdev *dev, struct rtentry *rt, struct sockaddr *sa);
 struct l2t_entry *t3_l2t_get(struct t3cdev *dev, struct rtentry *neigh,
-			     struct ifnet *ifp);
+    struct ifnet *ifp, struct sockaddr *sa);
 int t3_l2t_send_slow(struct t3cdev *dev, struct mbuf *m,
 		     struct l2t_entry *e);
 void t3_l2t_send_event(struct t3cdev *dev, struct l2t_entry *e);

==== //depot/projects/toestack/sys/dev/cxgb/cxgb_offload.c#21 (text+ko) ====

@@ -477,7 +477,7 @@
 }
 
 static void
-dummy_neigh_update(struct t3cdev *dev, struct rtentry *neigh)
+dummy_neigh_update(struct t3cdev *dev, struct rtentry *neigh, struct sockaddr *sa)
 {
 }
 
@@ -613,6 +613,8 @@
 		m = m_get(M_NOWAIT, MT_DATA);
 		if (__predict_true(m != NULL)) {
 			mk_tid_release(m, tid);
+			printf("sending tid release\n");
+			
 			cxgb_ofld_send(tdev, m);
 			t->tid_tab[tid].ctx = NULL;
 		} else
@@ -881,14 +883,14 @@
 }
 
 static void
-cxgb_route_event(void *unused, int event, struct rtentry *rt0, struct rtentry *rt1)
+cxgb_route_event(void *unused, int event, struct rtentry *rt0,
+    struct rtentry *rt1, struct sockaddr *sa)
 {
 	struct toedev *tdev0, *tdev1 = NULL;
 
 	/* 
 	 * ignore events on non-offloaded interfaces
 	 */
-	
 	tdev0 = TOEDEV(rt0->rt_ifp);
 	if (rt1)
 		tdev1 = TOEDEV(rt1->rt_ifp);
@@ -907,12 +909,12 @@
 
 	switch (event) {
 		case RTEVENT_ARP_UPDATE: {
-			cxgb_neigh_update(rt0);
+			cxgb_neigh_update(rt0, sa);
 			break;
 		}
 		case RTEVENT_REDIRECT_UPDATE: {
-			cxgb_redirect(rt0, rt1);
-			cxgb_neigh_update(rt1);
+			cxgb_redirect(rt0, rt1, sa);
+			cxgb_neigh_update(rt1, sa);
 	
 			break;
 		}
@@ -1034,14 +1036,14 @@
 }
 
 void
-cxgb_neigh_update(struct rtentry *rt)
+cxgb_neigh_update(struct rtentry *rt, struct sockaddr *sa)
 {
 
 	if (is_offloading(rt->rt_ifp)) {
 		struct t3cdev *tdev = T3CDEV(rt->rt_ifp);
 
 		BUG_ON(!tdev);
-		t3_l2t_update(tdev, rt);
+		t3_l2t_update(tdev, rt, sa);
 	}
 }
 
@@ -1072,7 +1074,7 @@
 }
 
 void
-cxgb_redirect(struct rtentry *old, struct rtentry *new)
+cxgb_redirect(struct rtentry *old, struct rtentry *new, struct sockaddr *sa)
 {
 	struct ifnet *olddev, *newdev;
 	struct tid_info *ti;
@@ -1100,7 +1102,7 @@
 	}
 
 	/* Add new L2T entry */
-	e = t3_l2t_get(tdev, new, new->rt_ifp);
+	e = t3_l2t_get(tdev, new, new->rt_ifp, sa);
 	if (!e) {
 		log(LOG_ERR, "%s: couldn't allocate new l2t entry!\n",
 		       __FUNCTION__);

==== //depot/projects/toestack/sys/dev/cxgb/cxgb_offload.h#7 (text+ko) ====

@@ -252,8 +252,8 @@
 
 void *cxgb_alloc_mem(unsigned long size);
 void cxgb_free_mem(void *addr);
-void cxgb_neigh_update(struct rtentry *rt);
-void cxgb_redirect(struct rtentry *old, struct rtentry *new);
+void cxgb_neigh_update(struct rtentry *rt, struct sockaddr *sa);
+void cxgb_redirect(struct rtentry *old, struct rtentry *new, struct sockaddr *sa);
 int process_rx(struct t3cdev *dev, struct mbuf **m, int n);
 int attach_t3cdev(struct t3cdev *dev);
 void detach_t3cdev(struct t3cdev *dev);

==== //depot/projects/toestack/sys/dev/cxgb/t3cdev.h#5 (text+ko) ====

@@ -22,7 +22,7 @@
 	int (*send)(struct t3cdev *dev, struct mbuf *m);
 	int (*recv)(struct t3cdev *dev, struct mbuf **m, int n);
 	int (*ctl)(struct t3cdev *dev, unsigned int req, void *data);
-	void (*arp_update)(struct t3cdev *dev, struct rtentry *neigh);
+	void (*arp_update)(struct t3cdev *dev, struct rtentry *neigh, struct sockaddr *sa);
 	void *priv;                         /* driver private data */
 	void *l2opt;                        /* optional layer 2 data */
 	void *l3opt;                        /* optional layer 3 data */

==== //depot/projects/toestack/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cm.c#2 (text+ko) ====

@@ -1365,7 +1365,11 @@
 	struct rtentry *dst;
 	struct l2t_entry *l2t;
 	struct iff_mac tim;
+	struct sockaddr_in sin;
 
+	sin.sin_len = sizeof(struct sockaddr_in);
+	sin.sin_family = AF_INET;
+	
 	PDBG("%s parent ep %p tid %u\n", __FUNCTION__, parent_ep, hwtid);
 
 	if (state_read(&parent_ep->com) != LISTEN) {
@@ -1402,7 +1406,8 @@
 		printf("%s - failed to find route !\n",  __FUNCTION__);
 		goto reject;
 	}
-	l2t = t3_l2t_get(tdev, dst, dst->rt_ifp);
+	sin.sin_addr.s_addr = req->peer_ip;
+	l2t = t3_l2t_get(tdev, dst, dst->rt_ifp, (struct sockaddr *)&sin);
 	if (l2t == NULL) {
 		printf("%s - failed to allocate l2t entry!\n", __FUNCTION__);
 		RTFREE(dst);
@@ -1877,6 +1882,10 @@
 	struct iwch_dev *h = to_iwch_dev(cm_id->device);
 	struct iwch_ep *ep;
 	struct rtentry *rt;
+	struct sockaddr_in sin;
+
+	sin.sin_len = sizeof(struct sockaddr_in);
+	sin.sin_family = AF_INET;
 
 	ep = alloc_ep(sizeof(*ep), M_NOWAIT);
 	if (!ep) {
@@ -1924,8 +1933,9 @@
 	ep->dst = rt;
 
 	/* get a l2t entry */
+	sin.sin_addr.s_addr = cm_id->remote_addr.sin_addr.s_addr;
 	ep->l2t = t3_l2t_get(ep->com.tdev, ep->dst,
-			     ep->dst->rt_ifp);
+	    ep->dst->rt_ifp, (struct sockaddr *)&sin);
 	if (!ep->l2t) {
 		printf("%s - cannot alloc l2e.\n", __FUNCTION__);
 		err = ENOMEM;

==== //depot/projects/toestack/sys/net/route.c#9 (text+ko) ====

@@ -499,7 +499,7 @@
 			error = rtrequest1(RTM_ADD, &info, &rt);
 			if (rt != NULL) {
 				RT_LOCK(rt);
-				EVENTHANDLER_INVOKE(route_event, RTEVENT_REDIRECT_UPDATE, rt0, rt);
+				EVENTHANDLER_INVOKE(route_event, RTEVENT_REDIRECT_UPDATE, rt0, rt, dst);
 				flags = rt->rt_flags;
 			}
 			if (rt0)
@@ -521,7 +521,7 @@
 			 */
 			rt_setgate(rt, rt_key(rt), gateway);
 			gwrt = rtalloc1(gateway, 1, 0);
-			EVENTHANDLER_INVOKE(route_event, RTEVENT_REDIRECT_UPDATE, rt, gwrt);
+			EVENTHANDLER_INVOKE(route_event, RTEVENT_REDIRECT_UPDATE, rt, gwrt, dst);
 			RTFREE_LOCKED(gwrt);
 		}
 	} else

==== //depot/projects/toestack/sys/net/route.h#7 (text+ko) ====

@@ -370,7 +370,7 @@
 #define RTEVENT_ARP_UPDATE        1
 #define RTEVENT_PMTU_UPDATE       2
 #define RTEVENT_REDIRECT_UPDATE   3
-typedef void (*rtevent_fn)(void *, int, struct rtentry *, struct rtentry *);
+typedef void (*rtevent_fn)(void *, int, struct rtentry *, struct rtentry *, struct sockaddr *);
 EVENTHANDLER_DECLARE(route_event, rtevent_fn);
 
 

==== //depot/projects/toestack/sys/netinet/if_ether.c#14 (text+ko) ====

@@ -51,6 +51,7 @@
 #include <sys/malloc.h>
 #include <sys/socket.h>
 #include <sys/syslog.h>
+#include <sys/endian.h>
 
 #include <net/if.h>
 #include <net/if_dl.h>
@@ -582,7 +583,10 @@
 #ifdef DEV_CARP
 	int carp_match = 0;
 #endif
-
+	struct sockaddr_in sin;
+	sin.sin_len = sizeof(struct sockaddr_in);
+	sin.sin_family = AF_INET;
+	
 	if (ifp->if_bridge)
 		bridged = 1;
 
@@ -777,7 +781,9 @@
 	la->la_preempt = arp_maxtries;
 	hold = la->la_hold;
 	la->la_hold = NULL;
-	EVENTHANDLER_INVOKE(route_event, RTEVENT_ARP_UPDATE, rt, NULL);	
+
+	sin.sin_addr.s_addr = be32toh(itaddr.s_addr);
+	EVENTHANDLER_INVOKE(route_event, RTEVENT_ARP_UPDATE, rt, NULL, (struct sockaddr *)&sin);
 	RT_UNLOCK(rt);
 	if (hold != NULL)
 		(*ifp->if_output)(ifp, hold, rt_key(rt), rt);

==== //depot/projects/toestack/sys/netinet/ip_icmp.c#8 (text+ko) ====

@@ -154,7 +154,7 @@
 #endif		
 		if (mtu >= 296 && rt->rt_rmx.rmx_mtu > mtu) {
 			rt->rt_rmx.rmx_mtu = mtu;
-			EVENTHANDLER_INVOKE(route_event, RTEVENT_PMTU_UPDATE, rt, NULL);
+			EVENTHANDLER_INVOKE(route_event, RTEVENT_PMTU_UPDATE, rt, NULL, icmpsrc);
 		}
 	}
 	if (rt)	



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200712100346.lBA3kvN4098276>