PERFORCE change 132891 for review
Steve Wise
swise at FreeBSD.org
Wed Jan 9 07:24:59 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=132891
Change 132891 by swise at swise:vic10:iwarp on 2008/01/09 15:24:37
krping works from client side
- address resolution rtalloc issues
- address resolution tailq bug
- cxgb_offload.c arp event fixes
- send_mpa_req() fixes
Affected files ...
.. //depot/projects/iwarp/sys/contrib/rdma/rdma_addr.c#6 edit
.. //depot/projects/iwarp/sys/dev/cxgb/cxgb_l2t.c#5 edit
.. //depot/projects/iwarp/sys/dev/cxgb/cxgb_offload.c#10 edit
.. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cm.c#7 edit
Differences ...
==== //depot/projects/iwarp/sys/contrib/rdma/rdma_addr.c#6 (text+ko) ====
@@ -148,27 +148,31 @@
return (EADDRNOTAVAIL);
ret = rdma_copy_addr(dev_addr, iproute.ro_rt->rt_ifp, NULL);
- rtfree(iproute.ro_rt);
+ RTFREE(iproute.ro_rt);
return ret;
}
EXPORT_SYMBOL(rdma_translate_ip);
static void queue_req(struct addr_req *req)
{
- struct addr_req *tmp_req;
+ struct addr_req *tmp_req = NULL;
mtx_lock(&lock);
TAILQ_FOREACH_REVERSE(tmp_req, &req_list, addr_req_list, entry)
if (time_after_eq(req->timeout, tmp_req->timeout))
break;
- TAILQ_INSERT_AFTER(&req_list, tmp_req, req, entry);
+ if (tmp_req)
+ TAILQ_INSERT_AFTER(&req_list, tmp_req, req, entry);
+ else
+ TAILQ_INSERT_TAIL(&req_list, req, entry);
if (TAILQ_FIRST(&req_list) == req)
callout_reset(&addr_ch, req->timeout - ticks, addr_timeout, NULL);
mtx_unlock(&lock);
}
+#ifdef needed
static void addr_send_arp(struct sockaddr_in *dst_in)
{
struct route iproute;
@@ -185,8 +189,9 @@
arpresolve(iproute.ro_rt->rt_ifp, iproute.ro_rt, NULL,
rt_key(iproute.ro_rt), dmac);
- rtfree(iproute.ro_rt);
+ RTFREE(iproute.ro_rt);
}
+#endif
static int addr_resolve_remote(struct sockaddr_in *src_in,
struct sockaddr_in *dst_in,
@@ -201,8 +206,10 @@
*dst = *dst_in;
rtalloc(&iproute);
- if (iproute.ro_rt == NULL);
+ if (iproute.ro_rt == NULL) {
+ ret = EHOSTUNREACH;
goto out;
+ }
/* If the device does ARP internally, return 'done' */
if (iproute.ro_rt->rt_ifp->if_flags & IFF_NOARP) {
@@ -223,7 +230,7 @@
ret = rdma_copy_addr(addr, iproute.ro_rt->rt_ifp, dmac);
put:
- rtfree(iproute.ro_rt);
+ RTFREE(iproute.ro_rt);
out:
return ret;
}
@@ -308,7 +315,9 @@
case EWOULDBLOCK:
req->timeout = msecs_to_ticks(timeout_ms) + ticks;
queue_req(req);
+#ifdef needed
addr_send_arp(dst_in);
+#endif
break;
default:
ret = req->status;
==== //depot/projects/iwarp/sys/dev/cxgb/cxgb_l2t.c#5 (text+ko) ====
@@ -170,6 +170,7 @@
{
struct rtentry *rt = e->neigh;
struct sockaddr_in sin;
+ int err;
bzero(&sin, sizeof(struct sockaddr_in));
sin.sin_family = AF_INET;
@@ -209,7 +210,8 @@
* entries when there's no memory.
*/
printf("doing arpresolve2 on 0x%x \n", e->addr);
- if (arpresolve2(rt->rt_ifp, rt, (struct sockaddr *)&sin, e->dmac) == 0) {
+ err = arpresolve2(rt->rt_ifp, rt, (struct sockaddr *)&sin, e->dmac);
+ if (!err) {
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]);
@@ -223,7 +225,7 @@
m_freem(m);
mtx_unlock(&e->lock);
} else
- printf("arpresolve2 returned non-zero\n");
+ printf("arpresolve2 returned %d\n", err);
}
return 0;
}
==== //depot/projects/iwarp/sys/dev/cxgb/cxgb_offload.c#10 (text+ko) ====
@@ -911,7 +911,7 @@
uint8_t *enaddr, struct sockaddr *sa)
{
- if (TOEDEV(rt0->rt_ifp) == NULL)
+ if (!is_offloading(rt0->rt_ifp))
return;
RT_ADDREF(rt0);
@@ -926,15 +926,22 @@
cxgb_redirect_event(void *unused, int event, struct rtentry *rt0,
struct rtentry *rt1, struct sockaddr *sa)
{
- struct toedev *tdev0, *tdev1;
/*
* ignore events on non-offloaded interfaces
*/
- tdev0 = TOEDEV(rt0->rt_ifp);
- tdev1 = TOEDEV(rt1->rt_ifp);
- if (tdev0 == NULL && tdev1 == NULL)
+ if (!is_offloading(rt0->rt_ifp))
+ return;
+
+ /*
+ * Cannot redirect to non-offload device.
+ */
+ if (!is_offloading(rt1->rt_ifp)) {
+ log(LOG_WARNING, "%s: Redirect to non-offload"
+ "device ignored.\n", __FUNCTION__);
return;
+ }
+
/*
* avoid LORs by dropping the route lock but keeping a reference
*
@@ -1059,13 +1066,9 @@
void
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, enaddr, sa);
- }
+ struct t3cdev *tdev = T3CDEV(rt->rt_ifp);
+ PANIC_IF(!tdev);
+ t3_l2t_update(tdev, rt, enaddr, sa);
}
static void
@@ -1107,13 +1110,6 @@
olddev = old->rt_ifp;
newdev = new->rt_ifp;
- if (!is_offloading(olddev))
- return;
- if (!is_offloading(newdev)) {
- log(LOG_WARNING, "%s: Redirect to non-offload"
- "device ignored.\n", __FUNCTION__);
- return;
- }
tdev = T3CDEV(olddev);
PANIC_IF(!tdev);
if (tdev != T3CDEV(newdev)) {
==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cm.c#7 (text+ko) ====
@@ -356,22 +356,28 @@
}
}
+static void
+reset_mbuf(struct mbuf *m)
+{
+ m_set_sgl(m, NULL);
+ m_set_sgllen(m, 0);
+ m->m_len = 0;
+ m->m_pkthdr.len = 0;
+}
+
/*
* Try and reuse mbufs already allocated...
*/
static struct mbuf *
get_mbuf(struct mbuf *m, int len, int flags)
{
- if (m && ((m->m_flags & M_EXT) == 0)) {
- m->m_len = 0;
- } else {
+ if (!m || (m->m_flags & M_EXT)) {
/*
* Assume len is less than MINCLBYTES :-/
*/
m = m_gethdr(MT_DATA, M_DONTWAIT);
}
- m_set_sgl(m, NULL);
- m_set_sgllen(m, 0);
+ reset_mbuf(m);
return (m);
}
@@ -530,7 +536,6 @@
int mpalen;
struct tx_data_wr *req;
struct mpa_message *mpa;
- int len;
PDBG("%s ep %p pd_len %d\n", __FUNCTION__, ep, ep->plen);
@@ -547,10 +552,10 @@
return;
}
}
+ reset_mbuf(m);
m_set_priority(m, CPL_PRIORITY_DATA);
req = (struct tx_data_wr *)mbuf_put(m, sizeof(*req));
- len = m->m_len;
- mpa = (struct mpa_message *) mbuf_put(m, mpalen);
+ mpa = (struct mpa_message *)mbuf_put(m, mpalen);
memset(mpa, 0, sizeof(*mpa));
memcpy(mpa->key, MPA_KEY_REQ, sizeof(mpa->key));
mpa->flags = (crc_enabled ? MPA_CRC : 0) |
@@ -569,7 +574,7 @@
set_arp_failure_handler(m, arp_failure_discard);
req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_TX_DATA));
req->wr_lo = htonl(V_WR_TID(ep->hwtid));
- req->len = htonl(len);
+ req->len = htonl(mpalen);
req->param = htonl(V_TX_PORT(ep->l2t->smt_idx) |
V_TX_SNDBUF(snd_win>>15));
req->flags = htonl(F_TX_INIT);
More information about the p4-projects
mailing list