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