From owner-p4-projects@FreeBSD.ORG Mon Dec 10 03:46:58 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5C71E16A468; Mon, 10 Dec 2007 03:46:58 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 084C016A41B for ; Mon, 10 Dec 2007 03:46:58 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id EA17813C442 for ; Mon, 10 Dec 2007 03:46:57 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id lBA3kv14098279 for ; Mon, 10 Dec 2007 03:46:57 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id lBA3kvN4098276 for perforce@freebsd.org; Mon, 10 Dec 2007 03:46:57 GMT (envelope-from kmacy@freebsd.org) Date: Mon, 10 Dec 2007 03:46:57 GMT Message-Id: <200712100346.lBA3kvN4098276@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to kmacy@freebsd.org using -f From: Kip Macy To: Perforce Change Reviews Cc: Subject: PERFORCE change 130580 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 10 Dec 2007 03:46:58 -0000 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 #include #include +#include #include #include @@ -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)