PERFORCE change 130580 for review
Kip Macy
kmacy at FreeBSD.org
Sun Dec 9 19:46:58 PST 2007
http://perforce.freebsd.org/chv.cgi?CH=130580
Change 130580 by kmacy at 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)
More information about the p4-projects
mailing list