nataraid(4): Add devstat support.
[dragonfly.git] / sys / net / if_var.h
index 8259fad..a8263b3 100644 (file)
@@ -44,6 +44,9 @@
 #ifndef _NET_IF_H_
 #include <net/if.h>
 #endif
+#ifndef _SYS_MUTEX_H_
+#include <sys/mutex.h>
+#endif
 
 /*
  * Structures defining a network interface, providing a packet
@@ -88,7 +91,7 @@ struct        ifaddr_container;
 struct ifaddr;
 struct lwkt_port;
 struct lwkt_msg;
-struct netmsg;
+union  netmsg;
 struct pktinfo;
 struct ifpoll_info;
 
@@ -145,6 +148,8 @@ enum ifnet_serialize {
 #define IFNET_SERIALIZE_TX     IFNET_SERIALIZE_TX_BASE
 #define IFNET_SERIALIZE_RX(i)  (IFNET_SERIALIZE_RX_BASE + (i))
 
+#if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
+
 /*
  * Structure defining a network interface.
  *
@@ -233,6 +238,7 @@ struct ifnet {
                (struct ifnet *, struct sockaddr **, struct sockaddr *);
        int     (*if_start_cpuid)       /* cpuid to run if_start */
                (struct ifnet *);
+       TAILQ_HEAD(, ifg_list) if_groups; /* linked list of groups per if */
 #ifdef DEVICE_POLLING
        void    (*if_poll)              /* IFF_POLLING support */
                (struct ifnet *, enum poll_cmd, int);
@@ -270,8 +276,16 @@ struct ifnet {
        struct ifaddr   *if_lladdr;
        struct lwkt_serialize *if_serializer;   /* serializer or MP lock */
        struct lwkt_serialize if_default_serializer; /* if not supplied */
+       struct mtx      if_ioctl_mtx;   /* high-level ioctl serializing mutex */
        int     if_cpuid;
-       struct netmsg *if_start_nmsg; /* percpu messages to schedule if_start */
+       struct netmsg_base *if_start_nmsg; /* percpu msgs to sched if_start */
+       void    *if_pf_kif; /* pf interface abstraction */
+       union {
+               void *carp_s;           /* carp structure (used by !carp ifs) */
+               struct ifnet *carp_d;   /* ptr to carpdev (used by carp ifs) */
+       } if_carp_ptr;
+       #define if_carp         if_carp_ptr.carp_s
+       #define if_carpdev      if_carp_ptr.carp_d
 };
 typedef void if_init_f_t (void *);
 
@@ -303,6 +317,7 @@ typedef void if_init_f_t (void *);
 /* for compatibility with other BSDs */
 #define        if_list         if_link
 
+#endif
 
 /*
  * Output queues (ifp->if_snd) and slow device input queues (*ifp->if_slowq)
@@ -314,6 +329,7 @@ typedef void if_init_f_t (void *);
 #define        IF_DROP(ifq)            ((ifq)->ifq_drops++)
 #define        IF_QLEN(ifq)            ((ifq)->ifq_len)
 #define        IF_QEMPTY(ifq)          (IF_QLEN(ifq) == 0)
+
 #define        IF_ENQUEUE(ifq, m) do {                                         \
        (m)->m_nextpkt = 0;                                             \
        if ((ifq)->ifq_tail == 0)                                       \
@@ -323,6 +339,7 @@ typedef void if_init_f_t (void *);
        (ifq)->ifq_tail = m;                                            \
        (ifq)->ifq_len++;                                               \
 } while (0)
+
 #define        IF_PREPEND(ifq, m) do {                                         \
        (m)->m_nextpkt = (ifq)->ifq_head;                               \
        if ((ifq)->ifq_tail == 0)                                       \
@@ -330,6 +347,7 @@ typedef void if_init_f_t (void *);
        (ifq)->ifq_head = (m);                                          \
        (ifq)->ifq_len++;                                               \
 } while (0)
+
 #define        IF_DEQUEUE(ifq, m) do {                                         \
        (m) = (ifq)->ifq_head;                                          \
        if (m) {                                                        \
@@ -599,6 +617,39 @@ EVENTHANDLER_DECLARE(ifnet_attach_event, ifnet_attach_event_handler_t);
 typedef void (*ifnet_detach_event_handler_t)(void *, struct ifnet *);
 EVENTHANDLER_DECLARE(ifnet_detach_event, ifnet_detach_event_handler_t);
 
+/*
+ * interface groups
+ */
+struct ifg_group {
+       char                             ifg_group[IFNAMSIZ];
+       u_int                            ifg_refcnt;
+       void                            *ifg_pf_kif;
+       int                              ifg_carp_demoted;
+       TAILQ_HEAD(, ifg_member)         ifg_members;
+       TAILQ_ENTRY(ifg_group)           ifg_next;
+};
+
+struct ifg_member {
+       TAILQ_ENTRY(ifg_member)  ifgm_next;
+       struct ifnet            *ifgm_ifp;
+};
+
+struct ifg_list {
+       struct ifg_group        *ifgl_group;
+       TAILQ_ENTRY(ifg_list)    ifgl_next;
+};
+
+/* group attach event */
+typedef void (*group_attach_event_handler_t)(void *, struct ifg_group *);
+EVENTHANDLER_DECLARE(group_attach_event, group_attach_event_handler_t);
+/* group detach event */
+typedef void (*group_detach_event_handler_t)(void *, struct ifg_group *);
+EVENTHANDLER_DECLARE(group_detach_event, group_detach_event_handler_t);
+/* group change event */
+typedef void (*group_change_event_handler_t)(void *, const char *);
+EVENTHANDLER_DECLARE(group_change_event, group_change_event_handler_t);
+
+
 #ifdef INVARIANTS
 #define ASSERT_IFAC_VALID(ifac)        do { \
        KKASSERT((ifac)->ifa_magic == IFA_CONTAINER_MAGIC); \
@@ -675,6 +726,10 @@ ifa_forwardmsg(struct lwkt_msg *_lmsg, int _nextcpu)
        ifnet_forwardmsg(_lmsg, _nextcpu);
 }
 
+#define REINPUT_KEEPRCVIF      0x0001  /* ether_reinput_oncpu() */
+#define REINPUT_RUNBPF                 0x0002  /* ether_reinput_oncpu() */
+
+
 extern struct ifnethead ifnet;
 extern struct  ifnet   **ifindex2ifnet;
 extern int ifqmaxlen;
@@ -685,15 +740,16 @@ void      ether_ifattach(struct ifnet *, uint8_t *, struct lwkt_serialize *);
 void   ether_ifattach_bpf(struct ifnet *, uint8_t *, u_int, u_int,
                        struct lwkt_serialize *);
 void   ether_ifdetach(struct ifnet *);
+void   ether_demux(struct mbuf *);
 void   ether_demux_oncpu(struct ifnet *, struct mbuf *);
-void   ether_input_oncpu(struct ifnet *, struct mbuf *);
 void   ether_reinput_oncpu(struct ifnet *, struct mbuf *, int);
 void   ether_input_chain(struct ifnet *, struct mbuf *,
                          const struct pktinfo *, struct mbuf_chain *);
 void   ether_input_chain_init(struct mbuf_chain *);
 void   ether_input_dispatch(struct mbuf_chain *);
 int    ether_output_frame(struct ifnet *, struct mbuf *);
-int    ether_ioctl(struct ifnet *, int, caddr_t);
+int    ether_ioctl(struct ifnet *, u_long, caddr_t);
+struct ifnet *ether_bridge_interface(struct ifnet *ifp);
 uint32_t       ether_crc32_le(const uint8_t *, size_t);
 uint32_t       ether_crc32_be(const uint8_t *, size_t);
 
@@ -721,6 +777,12 @@ int        ifpromisc(struct ifnet *, int);
 struct ifnet *ifunit(const char *);
 struct ifnet *if_withname(struct sockaddr *);
 
+struct ifg_group *if_creategroup(const char *);
+int     if_addgroup(struct ifnet *, const char *);
+int     if_delgroup(struct ifnet *, const char *);
+int     if_getgroup(caddr_t, struct ifnet *);
+int     if_getgroupmembers(caddr_t);
+
 struct ifaddr *ifa_ifwithaddr(struct sockaddr *);
 struct ifaddr *ifa_ifwithdstaddr(struct sockaddr *);
 struct ifaddr *ifa_ifwithnet(struct sockaddr *);