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>