if_clone.h (228071) | if_clone.h (241610) |
---|---|
1/*- 2 * Copyright (c) 1982, 1986, 1989, 1993 3 * The Regents of the University of California. 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 --- 13 unchanged lines hidden (view full) --- 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * From: @(#)if.h 8.1 (Berkeley) 6/10/93 | 1/*- 2 * Copyright (c) 1982, 1986, 1989, 1993 3 * The Regents of the University of California. 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 --- 13 unchanged lines hidden (view full) --- 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * From: @(#)if.h 8.1 (Berkeley) 6/10/93 |
30 * $FreeBSD: head/sys/net/if_clone.h 228071 2011-11-28 14:44:59Z glebius $ | 30 * $FreeBSD: head/sys/net/if_clone.h 241610 2012-10-16 13:37:54Z glebius $ |
31 */ 32 33#ifndef _NET_IF_CLONE_H_ 34#define _NET_IF_CLONE_H_ 35 36#ifdef _KERNEL 37 | 31 */ 32 33#ifndef _NET_IF_CLONE_H_ 34#define _NET_IF_CLONE_H_ 35 36#ifdef _KERNEL 37 |
38#define IFC_CLONE_INITIALIZER(name, data, maxunit, \ 39 attach, match, create, destroy) \ 40 { \ 41 .ifc_name = name, \ 42 .ifc_maxunit = maxunit, \ 43 .ifc_data = data, \ 44 .ifc_attach = attach, \ 45 .ifc_match = match, \ 46 .ifc_create = create, \ 47 .ifc_destroy = destroy, \ 48 } | 38struct if_clone; |
49 | 39 |
50/* 51 * Structure describing a `cloning' interface. 52 * 53 * List of locks 54 * (c) const until freeing 55 * (d) driver specific data, may need external protection. 56 * (e) locked by if_cloners_mtx 57 * (i) locked by ifc_mtx mtx 58 */ 59struct if_clone { 60 LIST_ENTRY(if_clone) ifc_list; /* (e) On list of cloners */ 61 const char *ifc_name; /* (c) Name of device, e.g. `gif' */ 62 int ifc_maxunit; /* (c) Maximum unit number */ 63 struct unrhdr *ifc_unrhdr; /* (c) alloc_unr(9) header */ 64 void *ifc_data; /* (*) Data for ifc_* functions. */ | 40/* Methods. */ 41typedef int ifc_match_t(struct if_clone *, const char *); 42typedef int ifc_create_t(struct if_clone *, char *, size_t, caddr_t); 43typedef int ifc_destroy_t(struct if_clone *, struct ifnet *); |
65 | 44 |
66 /* (c) Driver specific cloning functions. Called with no locks held. */ 67 void (*ifc_attach)(struct if_clone *); 68 int (*ifc_match)(struct if_clone *, const char *); 69 int (*ifc_create)(struct if_clone *, char *, size_t, caddr_t); 70 int (*ifc_destroy)(struct if_clone *, struct ifnet *); | 45typedef int ifcs_create_t(struct if_clone *, int, caddr_t); 46typedef void ifcs_destroy_t(struct ifnet *); |
71 | 47 |
72 long ifc_refcnt; /* (i) Refrence count. */ 73 struct mtx ifc_mtx; /* Mutex to protect members. */ 74 LIST_HEAD(, ifnet) ifc_iflist; /* (i) List of cloned interfaces */ 75}; 76 77void if_clone_init(void); 78int if_clone_attach(struct if_clone *); | 48/* Interface cloner (de)allocating functions. */ 49struct if_clone * 50 if_clone_advanced(const char *, u_int, ifc_match_t, ifc_create_t, 51 ifc_destroy_t); 52struct if_clone * 53 if_clone_simple(const char *, ifcs_create_t, ifcs_destroy_t, u_int); |
79void if_clone_detach(struct if_clone *); | 54void if_clone_detach(struct if_clone *); |
80void vnet_if_clone_init(void); | |
81 | 55 |
82int if_clone_create(char *, size_t, caddr_t); 83int if_clone_destroy(const char *); 84int if_clone_destroyif(struct if_clone *, struct ifnet *); 85int if_clone_list(struct if_clonereq *); 86 | 56/* Unit (de)allocating fucntions. */ |
87int ifc_name2unit(const char *name, int *unit); 88int ifc_alloc_unit(struct if_clone *, int *); 89void ifc_free_unit(struct if_clone *, int); 90 | 57int ifc_name2unit(const char *name, int *unit); 58int ifc_alloc_unit(struct if_clone *, int *); 59void ifc_free_unit(struct if_clone *, int); 60 |
91/* 92 * The ifc_simple functions, structures, and macros implement basic 93 * cloning as in 5.[012]. 94 */ 95 96struct ifc_simple_data { 97 int ifcs_minifs; /* minimum number of interfaces */ 98 99 int (*ifcs_create)(struct if_clone *, int, caddr_t); 100 void (*ifcs_destroy)(struct ifnet *); 101}; 102 103/* interface clone event */ | 61/* Interface clone event. */ |
104typedef void (*if_clone_event_handler_t)(void *, struct if_clone *); 105EVENTHANDLER_DECLARE(if_clone_event, if_clone_event_handler_t); 106 | 62typedef void (*if_clone_event_handler_t)(void *, struct if_clone *); 63EVENTHANDLER_DECLARE(if_clone_event, if_clone_event_handler_t); 64 |
107#define IFC_SIMPLE_DECLARE(name, minifs) \ 108struct ifc_simple_data name##_cloner_data = \ 109 {minifs, name##_clone_create, name##_clone_destroy}; \ 110struct if_clone name##_cloner = \ 111 IFC_CLONE_INITIALIZER(#name, &name##_cloner_data, IF_MAXUNIT, \ 112 ifc_simple_attach, ifc_simple_match, ifc_simple_create, ifc_simple_destroy) | 65/* The below interfaces used only by net/if.c. */ 66void if_clone_init(void); 67void vnet_if_clone_init(void); 68int if_clone_create(char *, size_t, caddr_t); 69int if_clone_destroy(const char *); 70int if_clone_list(struct if_clonereq *); |
113 | 71 |
114void ifc_simple_attach(struct if_clone *); 115int ifc_simple_match(struct if_clone *, const char *); 116int ifc_simple_create(struct if_clone *, char *, size_t, caddr_t); 117int ifc_simple_destroy(struct if_clone *, struct ifnet *); | 72/* The below interface used only by epair(4). */ 73int if_clone_destroyif(struct if_clone *, struct ifnet *); |
118 119#endif /* _KERNEL */ | 74 75#endif /* _KERNEL */ |
120 | |
121#endif /* !_NET_IF_CLONE_H_ */ | 76#endif /* !_NET_IF_CLONE_H_ */ |