PERFORCE change 134940 for review
Steve Wise
swise at FreeBSD.org
Wed Feb 6 16:10:49 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=134940
Change 134940 by swise at swise:vic10:iwarp on 2008/02/07 00:09:47
sorecieve() needs uio.
Affected files ...
.. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cm.c#14 edit
Differences ...
==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cm.c#14 (text+ko) ====
@@ -54,6 +54,7 @@
#include <sys/queue.h>
#include <sys/taskqueue.h>
#include <sys/proc.h>
+#include <sys/uio.h>
#include <net/route.h>
#include <netinet/in_systm.h>
@@ -194,10 +195,13 @@
sopt.sopt_name = TCP_INFO;
sopt.sopt_val = (caddr_t)&ti;
sopt.sopt_valsize = sizeof ti;
+ sopt.sopt_td = NULL;
err = sogetopt(ep->com.so, &sopt);
- if (err)
+ if (err) {
+ printf("%s can't get tcpinfo\n", __FUNCTION__);
return -err;
+ }
if (!(ti.tcpi_options & TCPI_OPT_TOE)) {
printf("%s connection NOT OFFLOADED!\n", __FUNCTION__);
return -EINVAL;
@@ -351,6 +355,7 @@
sopt.sopt_name = SO_LINGER;
sopt.sopt_val = (caddr_t)&linger_time;
sopt.sopt_valsize = sizeof linger_time;
+ sopt.sopt_td = NULL;
err = sosetopt(ep->com.so, &sopt);
if (err)
printf("%s can't set linger to 0, no RST!\n", __FUNCTION__);
@@ -436,7 +441,7 @@
struct mpa_message *mpa;
struct mbuf *m;
- PDBG("%s ep %p plen %d\n", __FUNCTION__, ep, plen);
+ PDBG("%s ep %p so %p plen %d\n", __FUNCTION__, ep, ep->com.so, plen);
mpalen = sizeof(*mpa) + plen;
@@ -595,6 +600,8 @@
int err;
struct mbuf *top, *m;
int flags = MSG_DONTWAIT;
+ struct uio uio;
+ int len;
PDBG("%s ep %p\n", __FUNCTION__, ep);
@@ -607,9 +614,14 @@
if (state_read(&ep->com) != MPA_REQ_SENT)
return;
- err = soreceive(ep->com.so, NULL, NULL, &top, NULL, &flags);
-
+ uio.uio_resid = len = 1000000;
+ uio.uio_td = ep->com.thread;
+ err = soreceive(ep->com.so, NULL, &uio, &top, NULL, &flags);
if (err) {
+ if (err == EWOULDBLOCK) {
+ start_ep_timer(ep);
+ return;
+ }
err = -err;
goto err;
}
@@ -741,8 +753,10 @@
int flags = MSG_DONTWAIT;
struct mbuf *top, *m;
int err;
+ struct uio uio;
+ int len;
- PDBG("%s ep %p\n", __FUNCTION__, ep);
+ PDBG("%s ep %p so %p\n", __FUNCTION__, ep, ep->com.so);
/*
* Stop mpa timer. If it expired, then the state has
@@ -753,13 +767,15 @@
if (state_read(&ep->com) != MPA_REQ_WAIT)
return;
- err = soreceive(ep->com.so, NULL, NULL, &top, NULL, &flags);
-
+ uio.uio_resid = len = 1000000;
+ uio.uio_td = ep->com.thread;
+ err = soreceive(ep->com.so, NULL, &uio, &top, NULL, &flags);
if (err) {
if (err == EWOULDBLOCK) {
start_ep_timer(ep);
return;
}
+ err = -err;
goto err;
}
@@ -1164,7 +1180,7 @@
struct iwch_dev *h = to_iwch_dev(cm_id->device);
struct iwch_qp *qp = get_qhp(h, conn_param->qpn);
- PDBG("%s ep %p tid %u\n", __FUNCTION__, ep, ep->hwtid);
+ PDBG("%s ep %p so %p\n", __FUNCTION__, ep, ep->com.so);
if (state_read(&ep->com) == DEAD)
return (-ECONNRESET);
@@ -1387,8 +1403,8 @@
mtx_lock(&ep->com.lock);
- PDBG("%s ep %p state %s, abrupt %d\n", __FUNCTION__, ep,
- states[ep->com.state], abrupt);
+ PDBG("%s ep %p so %p state %s, abrupt %d\n", __FUNCTION__, ep,
+ ep->com.so, states[ep->com.state], abrupt);
if (ep->com.state == DEAD) {
PDBG("%s already dead ep %p\n", __FUNCTION__, ep);
@@ -1437,13 +1453,31 @@
static void
process_data(struct iwch_ep *ep)
{
- PDBG("%s ep %p\n", __FUNCTION__, ep);
+ struct sockaddr_in *local, *remote;
+
+ PDBG("%s ep %p so %p\n", __FUNCTION__, ep, ep->com.so);
switch (state_read(&ep->com)) {
case MPA_REQ_SENT:
process_mpa_reply(ep);
break;
case MPA_REQ_WAIT:
+
+ /*
+ * XXX
+ * Set local and remote addrs here because when we
+ * dequeue the newly accepted socket, they aren't set
+ * yet in the pcb!
+ */
+ in_getsockaddr(ep->com.so, (struct sockaddr **)&local);
+ in_getpeeraddr(ep->com.so, (struct sockaddr **)&remote);
+ PDBG("%s local %s remote %s\n", __FUNCTION__,
+ inet_ntoa(local->sin_addr),
+ inet_ntoa(remote->sin_addr));
+ ep->com.local_addr = *local;
+ ep->com.remote_addr = *remote;
+ free(local, M_SONAME);
+ free(remote, M_SONAME);
process_mpa_request(ep);
break;
case MPA_REP_SENT:
@@ -1459,6 +1493,7 @@
static void
process_connected(struct iwch_ep *ep)
{
+ PDBG("%s ep %p so %p\n", __FUNCTION__, ep, ep->com.so);
if ((ep->com.so->so_state & SS_ISCONNECTED) && !ep->com.so->so_error) {
send_mpa_req(ep);
} else {
@@ -1502,21 +1537,18 @@
{
struct socket *child_so;
struct iwch_ep *child_ep;
- struct sockaddr_in *remote, *local;
+ struct sockaddr_in *remote;
int err;
+ PDBG("%s parent ep %p so %p\n", __FUNCTION__, parent_ep, parent_ep->com.so);
child_so = dequeue_socket(parent_ep->com.so, &remote);
if (!child_so) {
log(LOG_ERR, "%s - failed to dequeue child socket!\n",
__FUNCTION__);
return;
}
- err = in_getsockaddr(child_so, (struct sockaddr **)&local);
- if (err) {
- log(LOG_ERR, "%s - in_getsockaddr failed %d\n",
- __FUNCTION__, err);
- return;
- }
+ PDBG("%s remote addr %s port %d\n", __FUNCTION__,
+ inet_ntoa(remote->sin_addr), ntohs(remote->sin_port));
child_ep = alloc_ep(sizeof(*child_ep), M_NOWAIT);
if (!child_ep) {
log(LOG_ERR, "%s - failed to allocate ep entry!\n",
@@ -1528,12 +1560,10 @@
child_ep->com.so->so_upcall = iwch_so_upcall;
child_ep->com.so->so_upcallarg = child_ep;
child_ep->com.cm_id = NULL;
- child_ep->com.local_addr = *local;
- child_ep->com.remote_addr = *remote;
child_ep->com.thread = parent_ep->com.thread;
child_ep->parent_ep = parent_ep;
- free(local, M_SONAME);
free(remote, M_SONAME);
+ get_ep(&parent_ep->com);
child_ep->parent_ep = parent_ep;
callout_init(&child_ep->timer, TRUE);
state_set(&child_ep->com, MPA_REQ_WAIT);
@@ -1549,6 +1579,7 @@
struct iwch_ep *ep = arg;
int state = state_read(&ep->com);
+ PDBG("%s so %p so state %x ep %p ep state(%d)=%s\n", __FUNCTION__, so, so->so_state, ep, ep->com.state, states[ep->com.state]);
if (state == CONNECTING) {
process_connected(ep);
return;
More information about the p4-projects
mailing list