Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Feb 2008 00:10:47 GMT
From:      Steve Wise <swise@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 134940 for review
Message-ID:  <200802070010.m170Al6m040670@repoman.freebsd.org>

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

Change 134940 by swise@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;



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