parisc: switch to ->regset_get()
[linux-2.6-microblaze.git] / include / net / pkt_cls.h
index a972244..ed65619 100644 (file)
@@ -72,6 +72,10 @@ static inline struct Qdisc *tcf_block_q(struct tcf_block *block)
 
 int tcf_classify(struct sk_buff *skb, const struct tcf_proto *tp,
                 struct tcf_result *res, bool compat_mode);
+int tcf_classify_ingress(struct sk_buff *skb,
+                        const struct tcf_block *ingress_block,
+                        const struct tcf_proto *tp, struct tcf_result *res,
+                        bool compat_mode);
 
 #else
 static inline bool tcf_block_shared(struct tcf_block *block)
@@ -133,6 +137,15 @@ static inline int tcf_classify(struct sk_buff *skb, const struct tcf_proto *tp,
 {
        return TC_ACT_UNSPEC;
 }
+
+static inline int tcf_classify_ingress(struct sk_buff *skb,
+                                      const struct tcf_block *ingress_block,
+                                      const struct tcf_proto *tp,
+                                      struct tcf_result *res, bool compat_mode)
+{
+       return TC_ACT_UNSPEC;
+}
+
 #endif
 
 static inline unsigned long
@@ -249,7 +262,8 @@ static inline void tcf_exts_put_net(struct tcf_exts *exts)
 
 static inline void
 tcf_exts_stats_update(const struct tcf_exts *exts,
-                     u64 bytes, u64 packets, u64 lastuse)
+                     u64 bytes, u64 packets, u64 lastuse,
+                     u8 used_hw_stats, bool used_hw_stats_valid)
 {
 #ifdef CONFIG_NET_CLS_ACT
        int i;
@@ -260,6 +274,8 @@ tcf_exts_stats_update(const struct tcf_exts *exts,
                struct tc_action *a = exts->actions[i];
 
                tcf_action_stats_update(a, bytes, packets, lastuse, true);
+               a->used_hw_stats = used_hw_stats;
+               a->used_hw_stats_valid = used_hw_stats_valid;
        }
 
        preempt_enable();
@@ -309,6 +325,7 @@ int tcf_exts_validate(struct net *net, struct tcf_proto *tp,
 void tcf_exts_destroy(struct tcf_exts *exts);
 void tcf_exts_change(struct tcf_exts *dst, struct tcf_exts *src);
 int tcf_exts_dump(struct sk_buff *skb, struct tcf_exts *exts);
+int tcf_exts_terse_dump(struct sk_buff *skb, struct tcf_exts *exts);
 int tcf_exts_dump_stats(struct sk_buff *skb, struct tcf_exts *exts);
 
 /**
@@ -489,12 +506,16 @@ tcf_change_indev(struct net *net, struct nlattr *indev_tlv,
        struct net_device *dev;
 
        if (nla_strlcpy(indev, indev_tlv, IFNAMSIZ) >= IFNAMSIZ) {
-               NL_SET_ERR_MSG(extack, "Interface name too long");
+               NL_SET_ERR_MSG_ATTR(extack, indev_tlv,
+                                   "Interface name too long");
                return -EINVAL;
        }
        dev = __dev_get_by_name(net, indev);
-       if (!dev)
+       if (!dev) {
+               NL_SET_ERR_MSG_ATTR(extack, indev_tlv,
+                                   "Network device not found");
                return -ENODEV;
+       }
        return dev->ifindex;
 }
 
@@ -509,7 +530,7 @@ tcf_match_indev(struct sk_buff *skb, int ifindex)
 }
 
 int tc_setup_flow_action(struct flow_action *flow_action,
-                        const struct tcf_exts *exts, bool rtnl_held);
+                        const struct tcf_exts *exts);
 void tc_cleanup_flow_action(struct flow_action *flow_action);
 
 int tc_setup_cb_call(struct tcf_block *block, enum tc_setup_type type,
@@ -727,6 +748,7 @@ struct tc_red_qopt_offload_params {
        u32 limit;
        bool is_ecn;
        bool is_harddrop;
+       bool is_nodrop;
        struct gnet_stats_queue *qstats;
 };
 
@@ -881,4 +903,19 @@ struct tc_tbf_qopt_offload {
        };
 };
 
+enum tc_fifo_command {
+       TC_FIFO_REPLACE,
+       TC_FIFO_DESTROY,
+       TC_FIFO_STATS,
+};
+
+struct tc_fifo_qopt_offload {
+       enum tc_fifo_command command;
+       u32 handle;
+       u32 parent;
+       union {
+               struct tc_qopt_offload_stats stats;
+       };
+};
+
 #endif