Date: Sun, 4 Nov 2007 22:41:04 GMT From: Kip Macy <kmacy@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 128645 for review Message-ID: <200711042241.lA4Mf4xG083891@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=128645 Change 128645 by kmacy@kmacy:storage:toestack on 2007/11/04 22:40:52 add configuration option of DISABLE_TCP_OFFLOAD so that offload hooks become no-ops add hooks for offload listen close add eventhandler hooks for listen offload start and stop Affected files ... .. //depot/projects/toestack/sys/netinet/tcp_ofld.c#5 edit .. //depot/projects/toestack/sys/netinet/tcp_ofld.h#6 edit .. //depot/projects/toestack/sys/netinet/tcp_subr.c#7 edit .. //depot/projects/toestack/sys/netinet/tcp_usrreq.c#7 edit Differences ... ==== //depot/projects/toestack/sys/netinet/tcp_ofld.c#5 (text+ko) ==== @@ -65,43 +65,40 @@ } int -ofld_disconnect(struct tcpcb *tp) +ofld_send(struct tcpcb *tp) { - - return tp->t_tu->tu_disconnect(tp); + return tp->t_tu->tu_send(tp); } int -ofld_abort(struct tcpcb *tp) +ofld_rcvd(struct tcpcb *tp) { - return tp->t_tu->tu_abort(tp); + return tp->t_tu->tu_rcvd(tp); } int -ofld_send(struct tcpcb *tp) +ofld_disconnect(struct tcpcb *tp) { - - return tp->t_tu->tu_send(tp); + return tp->t_tu->tu_disconnect(tp); } int -ofld_listen(struct tcpcb *tp) +ofld_abort(struct tcpcb *tp) { + return tp->t_tu->tu_abort(tp); +} - return tp->t_tu->tu_listen_start(tp); +void +ofld_listen_open(struct tcpcb *tp) +{ + EVENTHANDLER_INVOKE(ofld_listen, OFLD_LISTEN_OPEN, tp); } -int +void ofld_listen_close(struct tcpcb *tp) { - - return tp->t_tu->tu_listen_stop(tp); + EVENTHANDLER_INVOKE(ofld_listen, OFLD_LISTEN_CLOSE, tp); } -int -ofld_rcvd(struct tcpcb *tp) -{ - return tp->t_tu->tu_rcvd(tp); -} ==== //depot/projects/toestack/sys/netinet/tcp_ofld.h#6 (text+ko) ==== @@ -5,18 +5,18 @@ #define tp_offload(tp) ((tp)->t_flags & TF_TOE) #define SO_OFFLOADABLE(so) ((so->so_options & SO_NOOFFLOAD) == 0) - int ofld_connect(struct socket *so, struct sockaddr *nam); int ofld_can_offload(struct tcpcb *tp, struct sockaddr *nam); + +int ofld_send(struct tcpcb *tp); +int ofld_rcvd(struct tcpcb *tp); int ofld_disconnect(struct tcpcb *tp); int ofld_abort(struct tcpcb *tp); -int ofld_send(struct tcpcb *tp); -int ofld_listen(struct tcpcb *tp); -int ofld_listen_close(struct tcpcb *tp); -int ofld_rcvd(struct tcpcb *tp); +void ofld_listen_open(struct tcpcb *tp); +void ofld_listen_close(struct tcpcb *tp); - +#ifndef DISABLE_TCP_OFFLOAD static __inline int tcp_gen_connect(struct socket *so, struct sockaddr *nam) { @@ -72,36 +72,81 @@ } static __inline int -tcp_gen_listen(struct tcpcb *tp) +tcp_gen_rcvd(struct tcpcb *tp) { int error; if (tp_offload(tp)) - error = ofld_listen(tp); + error = ofld_rcvd(tp); + else + error = tcp_output(tp); return (error); } +static __inline void +tcp_gen_listen_open(struct tcpcb *tp) +{ + if (SO_OFFLOADABLE(tp->t_inpcb->inp_socket)) + ofld_listen_open(tp); +} + +static __inline void +tcp_gen_listen_close(struct tcpcb *tp) +{ + ofld_listen_close(tp); +} +#else + static __inline int +tcp_gen_connect(struct socket *so, struct sockaddr *nam) +{ + return tcp_output(tp); +} + +static __inline int +tcp_gen_disconnect(struct tcpcb *tp) +{ + return tcp_output(tp); +} + +static __inline int +tcp_gen_abort(struct tcpcb *tp) +{ + return tcp_output(tp); +} + +static __inline int +tcp_gen_send(struct tcpcb *tp) +{ + return tcp_output(tp); +} + +static __inline int tcp_gen_rcvd(struct tcpcb *tp) { - int error; + return tcp_output(tp); +} + +static __inline void +tcp_gen_listen_open(struct tcpcb *tp) {} - if (tp_offload(tp)) - error = ofld_rcvd(tp); - else - error = tcp_output(tp); +static __inline void +tcp_gen_listen_close(struct tcpcb *tp) {} - return (error); -} +#endif struct toe_usrreqs { + int (*tu_send)(struct tcpcb *tp); + int (*tu_rcvd)(struct tcpcb *tp); int (*tu_disconnect)(struct tcpcb *tp); int (*tu_abort)(struct tcpcb *tp); - int (*tu_send)(struct tcpcb *tp); - int (*tu_listen_start)(struct tcpcb *tp); - int (*tu_listen_stop)(struct tcpcb *tp); - int (*tu_rcvd)(struct tcpcb *tp); + }; +#define OFLD_LISTEN_OPEN 1 +#define OFLD_LISTEN_CLOSE 2 +typedef void (*ofld_listen_fn)(void *, int, struct tcpcb *); +EVENTHANDLER_DECLARE(ofld_listen, ofld_listen_fn); + #endif ==== //depot/projects/toestack/sys/netinet/tcp_subr.c#7 (text+ko) ==== @@ -769,6 +769,9 @@ INP_INFO_WLOCK_ASSERT(&tcbinfo); INP_LOCK_ASSERT(inp); + if (tp->t_state == TCPS_LISTEN) + tcp_gen_listen_close(tp); + in_pcbdrop(inp); tcpstat.tcps_closed++; KASSERT(inp->inp_socket != NULL, ("tcp_close: inp_socket NULL")); ==== //depot/projects/toestack/sys/netinet/tcp_usrreq.c#7 (text+ko) ==== @@ -386,7 +386,7 @@ if (error == 0) { tp->t_state = TCPS_LISTEN; solisten_proto(so, backlog); - tcp_gen_listen(tp); + tcp_gen_listen_open(tp); } SOCK_UNLOCK(so); @@ -1513,8 +1513,9 @@ INP_LOCK_ASSERT(tp->t_inpcb); switch (tp->t_state) { + case TCPS_LISTEN: + tcp_gen_listen_close(tp); case TCPS_CLOSED: - case TCPS_LISTEN: tp->t_state = TCPS_CLOSED; tp = tcp_close(tp); /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200711042241.lA4Mf4xG083891>