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