1 /*- 2 * Copyright (c) 2012 Chelsio Communications, Inc. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD$ 27 */ 28 29 #ifndef _NETINET_TOE_H_ 30 #define _NETINET_TOE_H_ 31 32 #ifndef _KERNEL 33 #error "no user-serviceable parts inside" 34 #endif 35 36 struct tcpopt; 37 struct tcphdr; 38 struct in_conninfo; 39 40 struct toedev { 41 TAILQ_ENTRY(toedev) link; /* glue for toedev_list */ 42 void *tod_softc; /* TOE driver private data */ 43 44 /* 45 * Active open. If a failure occurs, it is reported back by the driver 46 * via toe_connect_failed. 47 */ 48 int (*tod_connect)(struct toedev *, struct socket *, struct rtentry *, 49 struct sockaddr *); 50 51 /* Passive open. */ 52 int (*tod_listen_start)(struct toedev *, struct tcpcb *); 53 int (*tod_listen_stop)(struct toedev *, struct tcpcb *); 54 55 /* 56 * The kernel uses this routine to pass on any frame it receives for an 57 * offloaded connection to the TOE driver. This is an unusual event. 58 */ 59 void (*tod_input)(struct toedev *, struct tcpcb *, struct mbuf *); 60 61 /* 62 * This is called by the kernel during pru_rcvd for an offloaded TCP 63 * connection and provides an opportunity for the TOE driver to manage 64 * its rx window and credits. 65 */ 66 void (*tod_rcvd)(struct toedev *, struct tcpcb *); 67 68 /* 69 * Transmit routine. The kernel calls this to have the TOE driver 70 * evaluate whether there is data to be transmitted, and transmit it. 71 */ 72 int (*tod_output)(struct toedev *, struct tcpcb *); 73 74 /* Immediate teardown: send RST to peer. */ 75 int (*tod_send_rst)(struct toedev *, struct tcpcb *); 76 77 /* Initiate orderly disconnect by sending FIN to the peer. */ 78 int (*tod_send_fin)(struct toedev *, struct tcpcb *); 79 80 /* Called to indicate that the kernel is done with this TCP PCB. */ 81 void (*tod_pcb_detach)(struct toedev *, struct tcpcb *); 82 83 /* 84 * The kernel calls this once it has information about an L2 entry that 85 * the TOE driver enquired about previously (via toe_l2_resolve). 86 */ 87 void (*tod_l2_update)(struct toedev *, struct ifnet *, 88 struct sockaddr *, uint8_t *, uint16_t); 89 90 /* XXX. Route has been redirected. */ 91 void (*tod_route_redirect)(struct toedev *, struct ifnet *, 92 struct rtentry *, struct rtentry *); 93 94 /* Syncache interaction. */ 95 void (*tod_syncache_added)(struct toedev *, void *); 96 void (*tod_syncache_removed)(struct toedev *, void *); 97 int (*tod_syncache_respond)(struct toedev *, void *, struct mbuf *); 98 void (*tod_offload_socket)(struct toedev *, void *, struct socket *); 99 100 /* TCP socket option */ 101 void (*tod_ctloutput)(struct toedev *, struct tcpcb *, int, int); 102 }; 103 104 #include <sys/eventhandler.h> 105 typedef void (*tcp_offload_listen_start_fn)(void *, struct tcpcb *); 106 typedef void (*tcp_offload_listen_stop_fn)(void *, struct tcpcb *); 107 EVENTHANDLER_DECLARE(tcp_offload_listen_start, tcp_offload_listen_start_fn); 108 EVENTHANDLER_DECLARE(tcp_offload_listen_stop, tcp_offload_listen_stop_fn); 109 110 void init_toedev(struct toedev *); 111 int register_toedev(struct toedev *); 112 int unregister_toedev(struct toedev *); 113 114 /* 115 * General interface for looking up L2 information for an IP address. If an 116 * answer is not available right away then the TOE driver's tod_l2_update will 117 * be called later. 118 */ 119 int toe_l2_resolve(struct toedev *, struct ifnet *, struct sockaddr *, 120 uint8_t *, uint16_t *); 121 122 void toe_connect_failed(struct toedev *, struct inpcb *, int); 123 124 void toe_syncache_add(struct in_conninfo *, struct tcpopt *, struct tcphdr *, 125 struct inpcb *, void *, void *); 126 int toe_syncache_expand(struct in_conninfo *, struct tcpopt *, struct tcphdr *, 127 struct socket **); 128 129 int toe_4tuple_check(struct in_conninfo *, struct tcphdr *, struct ifnet *); 130 #endif 131