xref: /minix3/minix/net/lwip/ifdev.h (revision ef8d499e2d2af900e9b2ab297171d7b088652482)
1*ef8d499eSDavid van Moolenbroek #ifndef MINIX_NET_LWIP_IFDEV_H
2*ef8d499eSDavid van Moolenbroek #define MINIX_NET_LWIP_IFDEV_H
3*ef8d499eSDavid van Moolenbroek 
4*ef8d499eSDavid van Moolenbroek #include <net/if.h>
5*ef8d499eSDavid van Moolenbroek #include <net/if_types.h>
6*ef8d499eSDavid van Moolenbroek #include <netinet6/in6_var.h>
7*ef8d499eSDavid van Moolenbroek #include <netinet6/nd6.h>
8*ef8d499eSDavid van Moolenbroek 
9*ef8d499eSDavid van Moolenbroek /*
10*ef8d499eSDavid van Moolenbroek  * NetBSD makes setting a hardware address through ifconfig(8) a whole lot
11*ef8d499eSDavid van Moolenbroek  * harder than it needs to be, namely by keeping a list of possible hardware
12*ef8d499eSDavid van Moolenbroek  * addresses and marking one of them as active.  For us, that level of extra
13*ef8d499eSDavid van Moolenbroek  * flexibility is completely useless.  In order to shield individual interface
14*ef8d499eSDavid van Moolenbroek  * modules from having to deal with the rather extended interface for the list
15*ef8d499eSDavid van Moolenbroek  * management, we maintain the list in ifdev and simply use a iop_set_hwaddr()
16*ef8d499eSDavid van Moolenbroek  * call to the modules when the active address changes.  This setting is the
17*ef8d499eSDavid van Moolenbroek  * maximum number of hardware addresses in the list maintained by ifdev.  It
18*ef8d499eSDavid van Moolenbroek  * should be at least 2, or changing hardware addresses will not be possible.
19*ef8d499eSDavid van Moolenbroek  */
20*ef8d499eSDavid van Moolenbroek #define IFDEV_NUM_HWADDRS	3
21*ef8d499eSDavid van Moolenbroek 
22*ef8d499eSDavid van Moolenbroek struct ifdev;
23*ef8d499eSDavid van Moolenbroek struct bpfdev_link;
24*ef8d499eSDavid van Moolenbroek struct sockaddr_dlx;
25*ef8d499eSDavid van Moolenbroek 
26*ef8d499eSDavid van Moolenbroek /* Interface operations table. */
27*ef8d499eSDavid van Moolenbroek struct ifdev_ops {
28*ef8d499eSDavid van Moolenbroek 	err_t (* iop_init)(struct ifdev * ifdev, struct netif * netif);
29*ef8d499eSDavid van Moolenbroek 	err_t (* iop_input)(struct pbuf * pbuf, struct netif * netif);
30*ef8d499eSDavid van Moolenbroek 	err_t (* iop_output)(struct ifdev * ifdev, struct pbuf * pbuf,
31*ef8d499eSDavid van Moolenbroek 	    struct netif * netif);
32*ef8d499eSDavid van Moolenbroek 	err_t (* iop_output_v4)(struct netif * netif, struct pbuf * pbuf,
33*ef8d499eSDavid van Moolenbroek 	    const ip4_addr_t * ipaddr);
34*ef8d499eSDavid van Moolenbroek 	err_t (* iop_output_v6)(struct netif * netif, struct pbuf * pbuf,
35*ef8d499eSDavid van Moolenbroek 	    const ip6_addr_t * ipaddr);
36*ef8d499eSDavid van Moolenbroek 	void (* iop_hdrcmplt)(struct ifdev * ifdev, struct pbuf * pbuf);
37*ef8d499eSDavid van Moolenbroek 	void (* iop_poll)(struct ifdev * ifdev);
38*ef8d499eSDavid van Moolenbroek 	int (* iop_set_ifflags)(struct ifdev * ifdev, unsigned int ifflags);
39*ef8d499eSDavid van Moolenbroek 	void (* iop_get_ifcap)(struct ifdev * ifdev, uint64_t * ifcap,
40*ef8d499eSDavid van Moolenbroek 	    uint64_t * ifena);
41*ef8d499eSDavid van Moolenbroek 	int (* iop_set_ifcap)(struct ifdev * ifdev, uint64_t ifcap);
42*ef8d499eSDavid van Moolenbroek 	void (* iop_get_ifmedia)(struct ifdev * ifdev, int * ifcurrent,
43*ef8d499eSDavid van Moolenbroek 	    int * ifactive);
44*ef8d499eSDavid van Moolenbroek 	int (* iop_set_ifmedia)(struct ifdev * ifdev, int ifmedia);
45*ef8d499eSDavid van Moolenbroek 	void (* iop_set_promisc)(struct ifdev * ifdev, int promisc);
46*ef8d499eSDavid van Moolenbroek 	int (* iop_set_hwaddr)(struct ifdev * ifdev, const uint8_t * hwaddr);
47*ef8d499eSDavid van Moolenbroek 	int (* iop_set_mtu)(struct ifdev * ifdev, unsigned int mtu);
48*ef8d499eSDavid van Moolenbroek 	int (* iop_destroy)(struct ifdev * ifdev);
49*ef8d499eSDavid van Moolenbroek };
50*ef8d499eSDavid van Moolenbroek 
51*ef8d499eSDavid van Moolenbroek /* Hardware address list entry.  The first entry, if any, is the active one. */
52*ef8d499eSDavid van Moolenbroek struct ifdev_hwaddr {
53*ef8d499eSDavid van Moolenbroek 	uint8_t ifhwa_addr[NETIF_MAX_HWADDR_LEN];
54*ef8d499eSDavid van Moolenbroek 	uint8_t ifhwa_flags;
55*ef8d499eSDavid van Moolenbroek };
56*ef8d499eSDavid van Moolenbroek #define IFHWAF_VALID		0x01	/* entry contains an address */
57*ef8d499eSDavid van Moolenbroek #define IFHWAF_FACTORY		0x02	/* factory (device-given) address */
58*ef8d499eSDavid van Moolenbroek 
59*ef8d499eSDavid van Moolenbroek /* Interface structure. */
60*ef8d499eSDavid van Moolenbroek struct ifdev {
61*ef8d499eSDavid van Moolenbroek 	TAILQ_ENTRY(ifdev) ifdev_next;	/* list of active interfaces */
62*ef8d499eSDavid van Moolenbroek 	char ifdev_name[IFNAMSIZ];	/* interface name, null terminated */
63*ef8d499eSDavid van Moolenbroek 	unsigned int ifdev_ifflags;	/* NetBSD-style interface flags */
64*ef8d499eSDavid van Moolenbroek 	unsigned int ifdev_dlt;		/* data link type (DLT_) */
65*ef8d499eSDavid van Moolenbroek 	unsigned int ifdev_promisc;	/* number of promiscuity requestors */
66*ef8d499eSDavid van Moolenbroek 	struct netif ifdev_netif;	/* lwIP interface structure */
67*ef8d499eSDavid van Moolenbroek 	struct if_data ifdev_data;	/* NetBSD-style interface data */
68*ef8d499eSDavid van Moolenbroek 	char ifdev_v4set;		/* interface has an IPv4 address? */
69*ef8d499eSDavid van Moolenbroek 	uint8_t ifdev_v6prefix[LWIP_IPV6_NUM_ADDRESSES]; /* IPv6 prefixes */
70*ef8d499eSDavid van Moolenbroek 	uint8_t ifdev_v6flags[LWIP_IPV6_NUM_ADDRESSES]; /* v6 address flags */
71*ef8d499eSDavid van Moolenbroek 	uint8_t ifdev_v6state[LWIP_IPV6_NUM_ADDRESSES]; /* v6 shadow states */
72*ef8d499eSDavid van Moolenbroek 	uint8_t ifdev_v6scope[LWIP_IPV6_NUM_ADDRESSES]; /* cached v6 scopes */
73*ef8d499eSDavid van Moolenbroek 	struct ifdev_hwaddr ifdev_hwlist[IFDEV_NUM_HWADDRS];	/* HW addr's */
74*ef8d499eSDavid van Moolenbroek 	uint32_t ifdev_nd6flags;	/* ND6-related flags (ND6_IFF_) */
75*ef8d499eSDavid van Moolenbroek 	const struct ifdev_ops *ifdev_ops; /* interface operations table */
76*ef8d499eSDavid van Moolenbroek 	TAILQ_HEAD(, bpfdev_link) ifdev_bpf; /* list of attached BPF devices */
77*ef8d499eSDavid van Moolenbroek };
78*ef8d499eSDavid van Moolenbroek 
79*ef8d499eSDavid van Moolenbroek #define ifdev_get_name(ifdev)	((ifdev)->ifdev_name)
80*ef8d499eSDavid van Moolenbroek #define ifdev_get_ifflags(ifdev) ((ifdev)->ifdev_ifflags)
81*ef8d499eSDavid van Moolenbroek #define ifdev_get_dlt(ifdev)	((ifdev)->ifdev_dlt)
82*ef8d499eSDavid van Moolenbroek #define ifdev_is_promisc(ifdev)	((ifdev)->ifdev_promisc != 0)
83*ef8d499eSDavid van Moolenbroek #define ifdev_get_netif(ifdev)	(&(ifdev)->ifdev_netif)
84*ef8d499eSDavid van Moolenbroek #define ifdev_get_nd6flags(ifdev) ((ifdev)->ifdev_nd6flags)
85*ef8d499eSDavid van Moolenbroek #define ifdev_get_iftype(ifdev)	((ifdev)->ifdev_data.ifi_type)
86*ef8d499eSDavid van Moolenbroek #define ifdev_get_hwlen(ifdev)	((ifdev)->ifdev_data.ifi_addrlen)
87*ef8d499eSDavid van Moolenbroek #define ifdev_get_hdrlen(ifdev)	((ifdev)->ifdev_data.ifi_hdrlen)
88*ef8d499eSDavid van Moolenbroek #define ifdev_get_link(ifdev)	((ifdev)->ifdev_data.ifi_link_state)
89*ef8d499eSDavid van Moolenbroek #define ifdev_get_mtu(ifdev)	((ifdev)->ifdev_data.ifi_mtu)
90*ef8d499eSDavid van Moolenbroek #define ifdev_get_metric(ifdev)	((ifdev)->ifdev_data.ifi_metric)
91*ef8d499eSDavid van Moolenbroek #define ifdev_get_ifdata(ifdev)	(&(ifdev)->ifdev_data)
92*ef8d499eSDavid van Moolenbroek #define ifdev_is_loopback(ifdev) ((ifdev)->ifdev_ifflags & IFF_LOOPBACK)
93*ef8d499eSDavid van Moolenbroek #define ifdev_is_up(ifdev)	((ifdev)->ifdev_ifflags & IFF_UP)
94*ef8d499eSDavid van Moolenbroek #define ifdev_is_link_up(ifdev)	(netif_is_link_up(&(ifdev)->ifdev_netif))
95*ef8d499eSDavid van Moolenbroek #define ifdev_set_metric(ifdev, metric)	\
96*ef8d499eSDavid van Moolenbroek 	((void)((ifdev)->ifdev_data.ifi_metric = (metric)))
97*ef8d499eSDavid van Moolenbroek #define ifdev_get_index(ifdev)  \
98*ef8d499eSDavid van Moolenbroek 	((uint32_t)(netif_get_index(ifdev_get_netif(ifdev))))
99*ef8d499eSDavid van Moolenbroek 
100*ef8d499eSDavid van Moolenbroek #define ifdev_output_drop(ifdev) ((ifdev)->ifdev_data.ifi_oerrors++)
101*ef8d499eSDavid van Moolenbroek 
102*ef8d499eSDavid van Moolenbroek #define netif_get_ifdev(netif)	((struct ifdev *)(netif)->state)
103*ef8d499eSDavid van Moolenbroek 
104*ef8d499eSDavid van Moolenbroek void ifdev_init(void);
105*ef8d499eSDavid van Moolenbroek void ifdev_poll(void);
106*ef8d499eSDavid van Moolenbroek 
107*ef8d499eSDavid van Moolenbroek void ifdev_register(const char * name, int (* create)(const char *));
108*ef8d499eSDavid van Moolenbroek 
109*ef8d499eSDavid van Moolenbroek void ifdev_input(struct ifdev * ifdev, struct pbuf * pbuf,
110*ef8d499eSDavid van Moolenbroek 	struct netif * netif, int to_bpf);
111*ef8d499eSDavid van Moolenbroek err_t ifdev_output(struct ifdev * ifdev, struct pbuf * pbuf,
112*ef8d499eSDavid van Moolenbroek 	struct netif * netif, int to_bpf, int hdrcmplt);
113*ef8d499eSDavid van Moolenbroek 
114*ef8d499eSDavid van Moolenbroek void ifdev_attach_bpf(struct ifdev * ifdev, struct bpfdev_link * bpfl);
115*ef8d499eSDavid van Moolenbroek void ifdev_detach_bpf(struct ifdev * ifdev, struct bpfdev_link * bpfl);
116*ef8d499eSDavid van Moolenbroek 
117*ef8d499eSDavid van Moolenbroek struct ifdev *ifdev_get_by_index(uint32_t ifindex);
118*ef8d499eSDavid van Moolenbroek struct ifdev *ifdev_find_by_name(const char * name);
119*ef8d499eSDavid van Moolenbroek struct ifdev *ifdev_enum(struct ifdev * last);
120*ef8d499eSDavid van Moolenbroek 
121*ef8d499eSDavid van Moolenbroek int ifdev_check_name(const char * name, unsigned int * vtype_slot);
122*ef8d499eSDavid van Moolenbroek 
123*ef8d499eSDavid van Moolenbroek int ifdev_set_promisc(struct ifdev * ifdev);
124*ef8d499eSDavid van Moolenbroek void ifdev_clear_promisc(struct ifdev * ifdev);
125*ef8d499eSDavid van Moolenbroek 
126*ef8d499eSDavid van Moolenbroek int ifdev_set_ifflags(struct ifdev * ifdev, unsigned int ifflags);
127*ef8d499eSDavid van Moolenbroek void ifdev_update_ifflags(struct ifdev * ifdev, unsigned int ifflags);
128*ef8d499eSDavid van Moolenbroek 
129*ef8d499eSDavid van Moolenbroek void ifdev_get_ifcap(struct ifdev * ifdev, uint64_t * ifcap,
130*ef8d499eSDavid van Moolenbroek 	uint64_t * ifena);
131*ef8d499eSDavid van Moolenbroek int ifdev_set_ifcap(struct ifdev * ifdev, uint64_t ifena);
132*ef8d499eSDavid van Moolenbroek 
133*ef8d499eSDavid van Moolenbroek int ifdev_get_ifmedia(struct ifdev * ifdev, int * ifcurrent, int * ifactive);
134*ef8d499eSDavid van Moolenbroek int ifdev_set_ifmedia(struct ifdev * ifdev, int ifmedia);
135*ef8d499eSDavid van Moolenbroek 
136*ef8d499eSDavid van Moolenbroek int ifdev_set_mtu(struct ifdev * ifdev, unsigned int mtu);
137*ef8d499eSDavid van Moolenbroek 
138*ef8d499eSDavid van Moolenbroek int ifdev_set_nd6flags(struct ifdev * ifdev, uint32_t nd6flags);
139*ef8d499eSDavid van Moolenbroek 
140*ef8d499eSDavid van Moolenbroek void ifdev_add(struct ifdev * ifdev, const char * name, unsigned int ifflags,
141*ef8d499eSDavid van Moolenbroek 	unsigned int iftype, size_t hdrlen, size_t addrlen, unsigned int dlt,
142*ef8d499eSDavid van Moolenbroek 	unsigned int mtu, uint32_t nd6flags, const struct ifdev_ops * iop);
143*ef8d499eSDavid van Moolenbroek int ifdev_remove(struct ifdev * ifdev);
144*ef8d499eSDavid van Moolenbroek 
145*ef8d499eSDavid van Moolenbroek struct ifdev *ifdev_get_loopback(void);
146*ef8d499eSDavid van Moolenbroek 
147*ef8d499eSDavid van Moolenbroek void ifdev_update_link(struct ifdev * ifdev, int link);
148*ef8d499eSDavid van Moolenbroek void ifdev_update_hwaddr(struct ifdev * ifdev, const uint8_t * hwaddr,
149*ef8d499eSDavid van Moolenbroek 	int is_factory);
150*ef8d499eSDavid van Moolenbroek 
151*ef8d499eSDavid van Moolenbroek int ifdev_create(const char * name);
152*ef8d499eSDavid van Moolenbroek int ifdev_destroy(struct ifdev * ifdev);
153*ef8d499eSDavid van Moolenbroek const char *ifdev_enum_vtypes(unsigned int num);
154*ef8d499eSDavid van Moolenbroek 
155*ef8d499eSDavid van Moolenbroek #endif /* !MINIX_NET_LWIP_IFDEV_H */
156