net: flow_offload: remove indirect flow_block declarations leftover
[linux-2.6-microblaze.git] / include / net / flow_offload.h
index efc8350..f2c8311 100644 (file)
@@ -147,6 +147,7 @@ enum flow_action_id {
        FLOW_ACTION_MPLS_PUSH,
        FLOW_ACTION_MPLS_POP,
        FLOW_ACTION_MPLS_MANGLE,
+       FLOW_ACTION_GATE,
        NUM_FLOW_ACTIONS,
 };
 
@@ -167,10 +168,11 @@ enum flow_action_hw_stats_bit {
        FLOW_ACTION_HW_STATS_IMMEDIATE_BIT,
        FLOW_ACTION_HW_STATS_DELAYED_BIT,
        FLOW_ACTION_HW_STATS_DISABLED_BIT,
+
+       FLOW_ACTION_HW_STATS_NUM_BITS
 };
 
 enum flow_action_hw_stats {
-       FLOW_ACTION_HW_STATS_DONT_CARE = 0,
        FLOW_ACTION_HW_STATS_IMMEDIATE =
                BIT(FLOW_ACTION_HW_STATS_IMMEDIATE_BIT),
        FLOW_ACTION_HW_STATS_DELAYED = BIT(FLOW_ACTION_HW_STATS_DELAYED_BIT),
@@ -178,6 +180,7 @@ enum flow_action_hw_stats {
                                   FLOW_ACTION_HW_STATS_DELAYED,
        FLOW_ACTION_HW_STATS_DISABLED =
                BIT(FLOW_ACTION_HW_STATS_DISABLED_BIT),
+       FLOW_ACTION_HW_STATS_DONT_CARE = BIT(FLOW_ACTION_HW_STATS_NUM_BITS) - 1,
 };
 
 typedef void (*action_destr)(void *priv);
@@ -258,6 +261,15 @@ struct flow_action_entry {
                        u8              bos;
                        u8              ttl;
                } mpls_mangle;
+               struct {
+                       u32             index;
+                       s32             prio;
+                       u64             basetime;
+                       u64             cycletime;
+                       u64             cycletimeext;
+                       u32             num_entries;
+                       struct action_gate_entry *entries;
+               } gate;
        };
        struct flow_action_cookie *cookie; /* user defined action cookie */
 };
@@ -330,11 +342,12 @@ __flow_action_hw_stats_check(const struct flow_action *action,
                return false;
 
        action_entry = flow_action_first_entry_get(action);
-       if (action_entry->hw_stats == FLOW_ACTION_HW_STATS_DONT_CARE)
-               return true;
+
+       /* Zero is not a legal value for hw_stats, catch anyone passing it */
+       WARN_ON_ONCE(!action_entry->hw_stats);
 
        if (!check_allow_bit &&
-           action_entry->hw_stats != FLOW_ACTION_HW_STATS_ANY) {
+           ~action_entry->hw_stats & FLOW_ACTION_HW_STATS_ANY) {
                NL_SET_ERR_MSG_MOD(extack, "Driver supports only default HW stats type \"any\"");
                return false;
        } else if (check_allow_bit &&
@@ -430,6 +443,16 @@ enum tc_setup_type;
 typedef int flow_setup_cb_t(enum tc_setup_type type, void *type_data,
                            void *cb_priv);
 
+struct flow_block_cb;
+
+struct flow_block_indr {
+       struct list_head                list;
+       struct net_device               *dev;
+       enum flow_block_binder_type     binder_type;
+       void                            *data;
+       void                            (*cleanup)(struct flow_block_cb *block_cb);
+};
+
 struct flow_block_cb {
        struct list_head        driver_list;
        struct list_head        list;
@@ -437,6 +460,7 @@ struct flow_block_cb {
        void                    *cb_ident;
        void                    *cb_priv;
        void                    (*release)(void *cb_priv);
+       struct flow_block_indr  indr;
        unsigned int            refcnt;
 };
 
@@ -510,37 +534,12 @@ static inline void flow_block_init(struct flow_block *flow_block)
 typedef int flow_indr_block_bind_cb_t(struct net_device *dev, void *cb_priv,
                                      enum tc_setup_type type, void *type_data);
 
-typedef void flow_indr_block_cmd_t(struct net_device *dev,
-                                  flow_indr_block_bind_cb_t *cb, void *cb_priv,
-                                  enum flow_block_command command);
-
-struct flow_indr_block_entry {
-       flow_indr_block_cmd_t *cb;
-       struct list_head        list;
-};
-
-void flow_indr_add_block_cb(struct flow_indr_block_entry *entry);
-
-void flow_indr_del_block_cb(struct flow_indr_block_entry *entry);
-
-int __flow_indr_block_cb_register(struct net_device *dev, void *cb_priv,
-                                 flow_indr_block_bind_cb_t *cb,
-                                 void *cb_ident);
-
-void __flow_indr_block_cb_unregister(struct net_device *dev,
-                                    flow_indr_block_bind_cb_t *cb,
-                                    void *cb_ident);
-
-int flow_indr_block_cb_register(struct net_device *dev, void *cb_priv,
-                               flow_indr_block_bind_cb_t *cb, void *cb_ident);
-
-void flow_indr_block_cb_unregister(struct net_device *dev,
-                                  flow_indr_block_bind_cb_t *cb,
-                                  void *cb_ident);
-
-void flow_indr_block_call(struct net_device *dev,
-                         struct flow_block_offload *bo,
-                         enum flow_block_command command,
-                         enum tc_setup_type type);
+int flow_indr_dev_register(flow_indr_block_bind_cb_t *cb, void *cb_priv);
+void flow_indr_dev_unregister(flow_indr_block_bind_cb_t *cb, void *cb_priv,
+                             flow_setup_cb_t *setup_cb);
+int flow_indr_dev_setup_offload(struct net_device *dev,
+                               enum tc_setup_type type, void *data,
+                               struct flow_block_offload *bo,
+                               void (*cleanup)(struct flow_block_cb *block_cb));
 
 #endif /* _NET_FLOW_OFFLOAD_H */