diff options
author | Kip Macy <kmacy@FreeBSD.org> | 2007-12-12 20:21:39 +0000 |
---|---|---|
committer | Kip Macy <kmacy@FreeBSD.org> | 2007-12-12 20:21:39 +0000 |
commit | 620721db82bcd154b887b45cbdc221035f1b1da3 (patch) | |
tree | c7a5f0158e1ded62414c64123f2a5e2dfb9e8bbd /sys/netinet/tcp_ofld.c | |
parent | 52b9b77f785cd788408aa7e07d9cb7496d8bd6d5 (diff) | |
download | src-620721db82bcd154b887b45cbdc221035f1b1da3.tar.gz src-620721db82bcd154b887b45cbdc221035f1b1da3.zip |
Add driver independent interface to offload active established TCP connections
Reviewed by: silby
Notes
Notes:
svn path=/head/; revision=174556
Diffstat (limited to 'sys/netinet/tcp_ofld.c')
-rw-r--r-- | sys/netinet/tcp_ofld.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/sys/netinet/tcp_ofld.c b/sys/netinet/tcp_ofld.c new file mode 100644 index 000000000000..62699a8ff68f --- /dev/null +++ b/sys/netinet/tcp_ofld.c @@ -0,0 +1,126 @@ +/************************************************************************** + +Copyright (c) 2007, Chelsio Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Neither the name of the Chelsio Corporation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +***************************************************************************/ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/types.h> +#include <sys/malloc.h> +#include <sys/kernel.h> +#include <sys/sysctl.h> +#include <sys/mbuf.h> +#include <sys/socket.h> +#include <sys/socketvar.h> + +#include <net/if.h> +#include <net/if_types.h> +#include <net/if_var.h> + +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/in_pcb.h> +#include <netinet/tcp.h> +#include <netinet/tcp_var.h> +#include <netinet/tcp_ofld.h> +#include <netinet/toedev.h> + +int +ofld_connect(struct socket *so, struct sockaddr *nam) +{ + struct ifnet *ifp; + struct toedev *tdev; + struct rtentry *rt; + int err; + + rt = rtalloc1(nam, 1, 0); + if (rt) + RT_UNLOCK(rt); + else + return (EHOSTUNREACH); + + ifp = rt->rt_ifp; + tdev = TOEDEV(ifp); + if (tdev == NULL) + return (EINVAL); + + if (tdev->can_offload(tdev, so) == 0) + return (EINVAL); + + if ((err = tdev->connect(tdev, so, ifp))) + return (err); + + return (0); +} + +int +ofld_send(struct tcpcb *tp) +{ + return tp->t_tu->tu_send(tp); +} + +int +ofld_rcvd(struct tcpcb *tp) +{ + + return tp->t_tu->tu_rcvd(tp); +} + +int +ofld_disconnect(struct tcpcb *tp) +{ + return tp->t_tu->tu_disconnect(tp); +} + +int +ofld_abort(struct tcpcb *tp) +{ + return tp->t_tu->tu_abort(tp); +} + +void +ofld_detach(struct tcpcb *tp) +{ + tp->t_tu->tu_detach(tp); +} + +void +ofld_listen_open(struct tcpcb *tp) +{ + EVENTHANDLER_INVOKE(ofld_listen, OFLD_LISTEN_OPEN, tp); +} + +void +ofld_listen_close(struct tcpcb *tp) +{ + EVENTHANDLER_INVOKE(ofld_listen, OFLD_LISTEN_CLOSE, tp); +} + + |