net: add rte prefix to ether structures
[dpdk.git] / drivers / net / failsafe / failsafe_private.h
index f3be152..231b89e 100644 (file)
@@ -1,17 +1,20 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  * Copyright 2017 6WIND S.A.
- * Copyright 2017 Mellanox.
+ * Copyright 2017 Mellanox Technologies, Ltd
  */
 
 #ifndef _RTE_ETH_FAILSAFE_PRIVATE_H_
 #define _RTE_ETH_FAILSAFE_PRIVATE_H_
 
+#include <stdint.h>
 #include <sys/queue.h>
+#include <pthread.h>
 
 #include <rte_atomic.h>
 #include <rte_dev.h>
 #include <rte_ethdev_driver.h>
 #include <rte_devargs.h>
+#include <rte_flow.h>
 #include <rte_interrupts.h>
 
 #define FAILSAFE_DRIVER_NAME "Fail-safe PMD"
@@ -80,7 +83,8 @@ struct rte_flow {
        /* sub_flows */
        struct rte_flow *flows[FAILSAFE_MAX_ETHPORTS];
        /* flow description for synchronization */
-       struct rte_flow_desc *fd;
+       struct rte_flow_conv_rule rule;
+       uint8_t rule_data[];
 };
 
 enum dev_state {
@@ -96,13 +100,15 @@ struct fs_stats {
        uint64_t timestamp;
 };
 
+/*
+ * Allocated in shared memory.
+ */
 struct sub_device {
        /* Exhaustive DPDK device description */
        struct sub_device *next;
        struct rte_devargs devargs;
-       struct rte_bus *bus;
-       struct rte_device *dev;
-       struct rte_eth_dev *edev;
+       struct rte_bus *bus; /* for primary process only. */
+       struct rte_device *dev; /* for primary process only. */
        uint8_t sid;
        /* Device state machine */
        enum dev_state state;
@@ -113,21 +119,31 @@ struct sub_device {
        /* Others are retrieved through a file descriptor */
        char *fd_str;
        /* fail-safe device backreference */
-       struct rte_eth_dev *fs_dev;
+       uint16_t fs_port_id; /* shared between processes */
+       /* sub device port id*/
+       uint16_t sdev_port_id; /* shared between processes */
        /* flag calling for recollection */
        volatile unsigned int remove:1;
        /* flow isolation state */
        int flow_isolated:1;
+       /* RMV callback registration state */
+       unsigned int rmv_callback:1;
+       /* LSC callback registration state */
+       unsigned int lsc_callback:1;
 };
 
+/*
+ * This is referenced by eth_dev->data->dev_private
+ * This is shared between processes.
+ */
 struct fs_priv {
-       struct rte_eth_dev *dev;
+       struct rte_eth_dev_data *data; /* backreference to shared data. */
        /*
         * Set of sub_devices.
         * subs[0] is the preferred device
         * any other is just another slave
         */
-       struct sub_device *subs;
+       struct sub_device *subs;  /* shared between processes */
        uint8_t subs_head; /* if head == tail, no subs */
        uint8_t subs_tail; /* first invalid */
        uint8_t subs_tx; /* current emitting device */
@@ -136,8 +152,10 @@ struct fs_priv {
        TAILQ_HEAD(sub_flows, rte_flow) flow_list;
        /* current number of mac_addr slots allocated. */
        uint32_t nb_mac_addr;
-       struct ether_addr mac_addrs[FAILSAFE_MAX_ETHADDR];
+       struct rte_ether_addr mac_addrs[FAILSAFE_MAX_ETHADDR];
        uint32_t mac_addr_pool[FAILSAFE_MAX_ETHADDR];
+       uint32_t nb_mcast_addr;
+       struct rte_ether_addr *mcast_addrs;
        /* current capabilities */
        struct rte_eth_dev_info infos;
        struct rte_eth_dev_owner my_owner; /* Unique owner. */
@@ -161,6 +179,9 @@ struct fs_priv {
         * appropriate failsafe Rx queue.
         */
        struct rx_proxy rxp;
+       pthread_mutex_t hotplug_mutex;
+       /* Hot-plug mutex is locked by the alarm mechanism. */
+       volatile unsigned int alarm_lock:1;
        unsigned int pending_alarm:1; /* An alarm is pending */
        /* flow isolation state */
        int flow_isolated:1;
@@ -180,7 +201,7 @@ int failsafe_hotplug_alarm_cancel(struct rte_eth_dev *dev);
 
 /* RX / TX */
 
-void set_burst_fn(struct rte_eth_dev *dev, int force_safe);
+void failsafe_set_burst_fn(struct rte_eth_dev *dev, int force_safe);
 
 uint16_t failsafe_rx_burst(void *rxq,
                struct rte_mbuf **rx_pkts, uint16_t nb_pkts);
@@ -207,6 +228,7 @@ int failsafe_eal_uninit(struct rte_eth_dev *dev);
 /* ETH_DEV */
 
 int failsafe_eth_dev_state_sync(struct rte_eth_dev *dev);
+void failsafe_eth_dev_unregister_callbacks(struct sub_device *sdev);
 void failsafe_dev_remove(struct rte_eth_dev *dev);
 void failsafe_stats_increment(struct rte_eth_stats *to,
                                struct rte_eth_stats *from);
@@ -216,14 +238,17 @@ int failsafe_eth_rmv_event_callback(uint16_t port_id,
 int failsafe_eth_lsc_event_callback(uint16_t port_id,
                                    enum rte_eth_event_type event,
                                    void *cb_arg, void *out);
+int failsafe_eth_new_event_callback(uint16_t port_id,
+                                   enum rte_eth_event_type event,
+                                   void *cb_arg, void *out);
 
 /* GLOBALS */
 
 extern const char pmd_failsafe_driver_name[];
 extern const struct eth_dev_ops failsafe_ops;
 extern const struct rte_flow_ops fs_flow_ops;
-extern uint64_t hotplug_poll;
-extern int mac_from_arg;
+extern uint64_t failsafe_hotplug_poll;
+extern int failsafe_mac_from_arg;
 
 /* HELPERS */
 
@@ -233,11 +258,12 @@ extern int mac_from_arg;
 
 /* sdev: (struct sub_device *) */
 #define ETH(sdev) \
-       ((sdev)->edev)
+       ((sdev)->sdev_port_id == RTE_MAX_ETHPORTS ? \
+       NULL : &rte_eth_devices[(sdev)->sdev_port_id])
 
 /* sdev: (struct sub_device *) */
 #define PORT_ID(sdev) \
-       (ETH(sdev)->data->port_id)
+       ((sdev)->sdev_port_id)
 
 /* sdev: (struct sub_device *) */
 #define SUB_ID(sdev) \
@@ -303,19 +329,31 @@ extern int mac_from_arg;
  */
 #define FS_ATOMIC_RX(s, i) \
        rte_atomic64_read( \
-        &((struct rxq *)((s)->fs_dev->data->rx_queues[i]))->refcnt[(s)->sid] \
-       )
+        &((struct rxq *) \
+        (fs_dev(s)->data->rx_queues[i]))->refcnt[(s)->sid])
 /**
  * s: (struct sub_device *)
  * i: uint16_t qid
  */
 #define FS_ATOMIC_TX(s, i) \
        rte_atomic64_read( \
-        &((struct txq *)((s)->fs_dev->data->tx_queues[i]))->refcnt[(s)->sid] \
-       )
+        &((struct txq *) \
+        (fs_dev(s)->data->tx_queues[i]))->refcnt[(s)->sid])
+
+#ifdef RTE_EXEC_ENV_FREEBSD
+#define FS_THREADID_TYPE void*
+#define FS_THREADID_FMT  "p"
+#else
+#define FS_THREADID_TYPE unsigned long
+#define FS_THREADID_FMT  "lu"
+#endif
+
+extern int failsafe_logtype;
+
+#define LOG__(l, m, ...) \
+       rte_log(RTE_LOG_ ## l, failsafe_logtype, \
+               "net_failsafe: " m "%c", __VA_ARGS__)
 
-#define LOG__(level, m, ...) \
-       RTE_LOG(level, PMD, "net_failsafe: " m "%c", __VA_ARGS__)
 #define LOG_(level, ...) LOG__(level, __VA_ARGS__, '\n')
 #define DEBUG(...) LOG_(DEBUG, __VA_ARGS__)
 #define INFO(...) LOG_(INFO, __VA_ARGS__)
@@ -346,6 +384,56 @@ fs_find_next(struct rte_eth_dev *dev,
        return &subs[sid];
 }
 
+static inline struct rte_eth_dev *
+fs_dev(struct sub_device *sdev) {
+       return &rte_eth_devices[sdev->fs_port_id];
+}
+
+/*
+ * Lock hot-plug mutex.
+ * is_alarm means that the caller is, for sure, the hot-plug alarm mechanism.
+ */
+static inline int
+fs_lock(struct rte_eth_dev *dev, unsigned int is_alarm)
+{
+       int ret;
+
+       if (is_alarm) {
+               ret = pthread_mutex_trylock(&PRIV(dev)->hotplug_mutex);
+               if (ret) {
+                       DEBUG("Hot-plug mutex lock trying failed(%s), will try"
+                             " again later...", strerror(ret));
+                       return ret;
+               }
+               PRIV(dev)->alarm_lock = 1;
+       } else {
+               ret = pthread_mutex_lock(&PRIV(dev)->hotplug_mutex);
+               if (ret) {
+                       ERROR("Cannot lock mutex(%s)", strerror(ret));
+                       return ret;
+               }
+       }
+       return ret;
+}
+
+/*
+ * Unlock hot-plug mutex.
+ * is_alarm means that the caller is, for sure, the hot-plug alarm mechanism.
+ */
+static inline void
+fs_unlock(struct rte_eth_dev *dev, unsigned int is_alarm)
+{
+       int ret;
+
+       if (is_alarm) {
+               RTE_ASSERT(PRIV(dev)->alarm_lock == 1);
+               PRIV(dev)->alarm_lock = 0;
+       }
+       ret = pthread_mutex_unlock(&PRIV(dev)->hotplug_mutex);
+       if (ret)
+               ERROR("Cannot unlock hot-plug mutex(%s)", strerror(ret));
+}
+
 /*
  * Switch emitting device.
  * If banned is set, banned must not be considered for
@@ -391,7 +479,7 @@ fs_switch_dev(struct rte_eth_dev *dev,
        } else {
                return;
        }
-       set_burst_fn(dev, 0);
+       failsafe_set_burst_fn(dev, 0);
        rte_wmb();
 }