xref: /freebsd/sys/net/ifdi_if.m (revision 7cc42f6d)
1#
2# Copyright (c) 2014-2018, Matthew Macy (mmacy@mattmacy.io)
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 are met:
7#
8#  1. Redistributions of source code must retain the above copyright notice,
9#     this list of conditions and the following disclaimer.
10#
11#  2. Neither the name of Matthew Macy nor the names of its
12#     contributors may be used to endorse or promote products derived from
13#     this software without specific prior written permission.
14#
15# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25# POSSIBILITY OF SUCH DAMAGE.
26#
27# $FreeBSD$
28#
29
30#include <sys/types.h>
31#include <sys/systm.h>
32#include <sys/socket.h>
33
34#include <machine/bus.h>
35#include <sys/bus.h>
36
37#include <net/ethernet.h>
38#include <net/if.h>
39#include <net/if_var.h>
40#include <net/if_media.h>
41#include <net/iflib.h>
42#include <net/if_clone.h>
43#include <net/if_dl.h>
44#include <net/if_types.h>
45
46INTERFACE ifdi;
47
48CODE {
49
50	static void
51	null_void_op(if_ctx_t _ctx __unused)
52	{
53	}
54
55	static int
56	null_knlist_add(if_ctx_t _ctx __unused, struct knote *_kn)
57	{
58	    return (0);
59	}
60
61	static int
62	null_knote_event(if_ctx_t _ctx __unused, struct knote *_kn, int _hint)
63	{
64	    return (0);
65	}
66
67	static void
68	null_timer_op(if_ctx_t _ctx __unused, uint16_t _qsidx __unused)
69	{
70	}
71
72	static int
73	null_int_op(if_ctx_t _ctx __unused)
74	{
75		return (0);
76	}
77
78	static int
79	null_int_int_op(if_ctx_t _ctx __unused, int arg0 __unused)
80	{
81		return (ENOTSUP);
82	}
83
84	static int
85	null_queue_intr_enable(if_ctx_t _ctx __unused, uint16_t _qid __unused)
86	{
87		return (ENOTSUP);
88	}
89
90	static void
91	null_led_func(if_ctx_t _ctx __unused, int _onoff __unused)
92	{
93	}
94
95	static void
96	null_vlan_register_op(if_ctx_t _ctx __unused, uint16_t vtag __unused)
97	{
98	}
99
100	static int
101	null_q_setup(if_ctx_t _ctx __unused, uint32_t _qid __unused)
102	{
103		return (0);
104	}
105
106	static int
107	null_i2c_req(if_ctx_t _sctx __unused, struct ifi2creq *_i2c __unused)
108	{
109		return (ENOTSUP);
110	}
111
112	static int
113	null_sysctl_int_delay(if_ctx_t _sctx __unused, if_int_delay_info_t _iidi __unused)
114	{
115		return (0);
116	}
117
118	static int
119	null_iov_init(if_ctx_t _ctx __unused, uint16_t num_vfs __unused, const nvlist_t *params __unused)
120	{
121		return (ENOTSUP);
122	}
123
124	static int
125	null_vf_add(if_ctx_t _ctx __unused, uint16_t num_vfs __unused, const nvlist_t *params __unused)
126	{
127		return (ENOTSUP);
128	}
129
130	static int
131	null_priv_ioctl(if_ctx_t _ctx __unused, u_long command, caddr_t *data __unused)
132	{
133		return (ENOTSUP);
134	}
135
136	static void
137	null_media_status(if_ctx_t ctx __unused, struct ifmediareq *ifmr)
138	{
139	    ifmr->ifm_status = IFM_AVALID | IFM_ACTIVE;
140	    ifmr->ifm_active = IFM_ETHER | IFM_25G_ACC | IFM_FDX;
141	}
142
143	static int
144	null_cloneattach(if_ctx_t ctx __unused, struct if_clone *ifc __unused,
145			 const char *name __unused, caddr_t params __unused)
146	{
147	    return (0);
148	}
149
150	static void
151	null_rx_clset(if_ctx_t _ctx __unused, uint16_t _flid __unused,
152		      uint16_t _qid __unused, caddr_t *_sdcl __unused)
153	{
154	}
155	static void
156	null_object_info_get(if_ctx_t ctx __unused, void *data __unused, int size __unused)
157	{
158	}
159	static int
160	default_mac_set(if_ctx_t ctx, const uint8_t *mac)
161	{
162	    struct ifnet *ifp = iflib_get_ifp(ctx);
163	    struct sockaddr_dl *sdl;
164
165	    if (ifp && ifp->if_addr) {
166		sdl = (struct sockaddr_dl *)ifp->if_addr->ifa_addr;
167		MPASS(sdl->sdl_type == IFT_ETHER);
168		memcpy(LLADDR(sdl), mac, ETHER_ADDR_LEN);
169	    }
170	    return (0);
171	}
172
173	static bool
174	null_needs_restart(if_ctx_t _ctx __unused, enum iflib_restart_event _event __unused)
175	{
176		return (true);
177	}
178};
179
180#
181# kevent interfaces
182#
183
184METHOD int knlist_add {
185	if_ctx_t _ctx;
186	struct knote *_kn;
187} DEFAULT null_knlist_add;
188
189METHOD int knote_event {
190	if_ctx_t _ctx;
191	struct knote *_kn;
192	int hint;
193} DEFAULT null_knote_event;
194
195
196#
197# query
198#
199
200METHOD int object_info_get {
201	if_ctx_t _ctx;
202	void *data;
203	int size;
204} DEFAULT null_object_info_get;
205
206#
207# bus interfaces
208#
209
210METHOD int attach_pre {
211	if_ctx_t _ctx;
212} DEFAULT null_int_op;
213
214METHOD int attach_post {
215	if_ctx_t _ctx;
216} DEFAULT null_int_op;
217
218METHOD int reinit_pre {
219	if_ctx_t _ctx;
220} DEFAULT null_int_op;
221
222METHOD int reinit_post {
223	if_ctx_t _ctx;
224} DEFAULT null_int_op;
225
226METHOD int cloneattach {
227	if_ctx_t _ctx;
228	struct if_clone *_ifc;
229	const char *_name;
230	caddr_t params;
231} DEFAULT null_cloneattach;
232
233METHOD int detach {
234	if_ctx_t _ctx;
235};
236
237METHOD int suspend {
238	if_ctx_t _ctx;
239} DEFAULT null_int_op;
240
241METHOD int shutdown {
242	if_ctx_t _ctx;
243} DEFAULT null_int_op;
244
245METHOD int resume {
246	if_ctx_t _ctx;
247} DEFAULT null_int_op;
248
249#
250# downcall to driver to allocate its
251# own queue state and tie it to the parent
252#
253
254METHOD int tx_queues_alloc {
255	if_ctx_t _ctx;
256	caddr_t *_vaddrs;
257	uint64_t *_paddrs;
258	int ntxqs;
259	int ntxqsets;
260};
261
262METHOD int rx_queues_alloc {
263	if_ctx_t _ctx;
264	caddr_t *_vaddrs;
265	uint64_t *_paddrs;
266	int nrxqs;
267	int nrxqsets;
268};
269
270METHOD void queues_free {
271	if_ctx_t _ctx;
272} DEFAULT null_void_op;
273
274METHOD void rx_clset {
275	if_ctx_t _ctx;
276	uint16_t _fl;
277	uint16_t _qsetid;
278	caddr_t *_sdcl;
279} DEFAULT null_rx_clset;
280
281#
282# interface reset / stop
283#
284
285METHOD void init {
286	if_ctx_t _ctx;
287};
288
289METHOD void stop {
290	if_ctx_t _ctx;
291};
292
293#
294# interrupt setup and manipulation
295#
296
297METHOD int msix_intr_assign {
298	if_ctx_t _sctx;
299	int msix;
300} DEFAULT null_int_int_op;
301
302METHOD void intr_enable {
303	if_ctx_t _ctx;
304};
305
306METHOD void intr_disable {
307	if_ctx_t _ctx;
308};
309
310METHOD int rx_queue_intr_enable {
311	if_ctx_t _ctx;
312	uint16_t _qid;
313} DEFAULT null_queue_intr_enable;
314
315METHOD int tx_queue_intr_enable {
316	if_ctx_t _ctx;
317	uint16_t _qid;
318} DEFAULT null_queue_intr_enable;
319
320METHOD void link_intr_enable {
321	if_ctx_t _ctx;
322} DEFAULT null_void_op;
323
324#
325# interface configuration
326#
327
328METHOD void multi_set {
329	if_ctx_t _ctx;
330};
331
332METHOD int mtu_set {
333	if_ctx_t _ctx;
334	uint32_t _mtu;
335};
336METHOD int mac_set {
337	if_ctx_t _ctx;
338	const uint8_t *_mac;
339} DEFAULT default_mac_set;
340
341METHOD void media_set{
342	if_ctx_t _ctx;
343} DEFAULT null_void_op;
344
345METHOD int promisc_set {
346	if_ctx_t _ctx;
347	int _flags;
348};
349
350METHOD void crcstrip_set {
351	if_ctx_t _ctx;
352	int _onoff;
353	int _strip;
354};
355
356#
357# IOV handling
358#
359
360METHOD void vflr_handle {
361	if_ctx_t _ctx;
362} DEFAULT null_void_op;
363
364METHOD int iov_init {
365	if_ctx_t _ctx;
366	uint16_t num_vfs;
367	const nvlist_t * params;
368} DEFAULT null_iov_init;
369
370METHOD void iov_uninit {
371	if_ctx_t _ctx;
372} DEFAULT null_void_op;
373
374METHOD int iov_vf_add {
375	if_ctx_t _ctx;
376	uint16_t num_vfs;
377	const nvlist_t * params;
378} DEFAULT null_vf_add;
379
380
381#
382# Device status
383#
384
385METHOD void update_admin_status {
386	if_ctx_t _ctx;
387};
388
389METHOD void media_status {
390	if_ctx_t _ctx;
391	struct ifmediareq *_ifm;
392} DEFAULT null_media_status;
393
394METHOD int media_change {
395	if_ctx_t _ctx;
396} DEFAULT null_int_op;
397
398METHOD uint64_t get_counter {
399	if_ctx_t _ctx;
400	ift_counter cnt;
401};
402
403METHOD int priv_ioctl {
404	if_ctx_t _ctx;
405	u_long   _cmd;
406	caddr_t _data;
407} DEFAULT null_priv_ioctl;
408
409#
410# optional methods
411#
412
413METHOD int i2c_req {
414	if_ctx_t _ctx;
415	struct ifi2creq *_req;
416} DEFAULT null_i2c_req;
417
418METHOD int txq_setup {
419	if_ctx_t _ctx;
420	uint32_t _txqid;
421} DEFAULT null_q_setup;
422
423METHOD int rxq_setup {
424	if_ctx_t _ctx;
425	uint32_t _txqid;
426} DEFAULT null_q_setup;
427
428METHOD void timer {
429	if_ctx_t _ctx;
430	uint16_t _txqid;
431} DEFAULT null_timer_op;
432
433METHOD void watchdog_reset {
434	if_ctx_t _ctx;
435} DEFAULT null_void_op;
436
437METHOD void watchdog_reset_queue {
438	if_ctx_t _ctx;
439	uint16_t _q;
440} DEFAULT null_timer_op;
441
442METHOD void led_func {
443	if_ctx_t _ctx;
444	int _onoff;
445} DEFAULT null_led_func;
446
447METHOD void vlan_register {
448	if_ctx_t _ctx;
449	uint16_t _vtag;
450} DEFAULT null_vlan_register_op;
451
452METHOD void vlan_unregister {
453	if_ctx_t _ctx;
454	uint16_t _vtag;
455} DEFAULT null_vlan_register_op;
456
457METHOD int sysctl_int_delay {
458	if_ctx_t _sctx;
459	if_int_delay_info_t _iidi;
460} DEFAULT null_sysctl_int_delay;
461
462METHOD void debug {
463	if_ctx_t _ctx;
464} DEFAULT null_void_op;
465
466METHOD bool needs_restart {
467	if_ctx_t _ctx;
468	enum iflib_restart_event _event;
469} DEFAULT null_needs_restart;
470