Merge tag 'rproc-v4.10' of git://github.com/andersson/remoteproc
[linux-2.6-block.git] / include / net / lwtunnel.h
index ea3f80f58fd6d57f01d4cd9d7cbe659e7a123150..d4c1c75b886244f76f9539c0709bb72be7974578 100644 (file)
@@ -24,11 +24,11 @@ enum {
 struct lwtunnel_state {
        __u16           type;
        __u16           flags;
+       __u16           headroom;
        atomic_t        refcnt;
        int             (*orig_output)(struct net *net, struct sock *sk, struct sk_buff *skb);
        int             (*orig_input)(struct sk_buff *);
-       int             len;
-       __u16           headroom;
+       struct          rcu_head rcu;
        __u8            data[0];
 };
 
@@ -36,6 +36,7 @@ struct lwtunnel_encap_ops {
        int (*build_state)(struct net_device *dev, struct nlattr *encap,
                           unsigned int family, const void *cfg,
                           struct lwtunnel_state **ts);
+       void (*destroy_state)(struct lwtunnel_state *lws);
        int (*output)(struct net *net, struct sock *sk, struct sk_buff *skb);
        int (*input)(struct sk_buff *skb);
        int (*fill_encap)(struct sk_buff *skb,
@@ -46,10 +47,7 @@ struct lwtunnel_encap_ops {
 };
 
 #ifdef CONFIG_LWTUNNEL
-static inline void lwtstate_free(struct lwtunnel_state *lws)
-{
-       kfree(lws);
-}
+void lwtstate_free(struct lwtunnel_state *lws);
 
 static inline struct lwtunnel_state *
 lwtstate_get(struct lwtunnel_state *lws)
@@ -96,7 +94,8 @@ static inline bool lwtunnel_xmit_redirect(struct lwtunnel_state *lwtstate)
 static inline unsigned int lwtunnel_headroom(struct lwtunnel_state *lwtstate,
                                             unsigned int mtu)
 {
-       if (lwtunnel_xmit_redirect(lwtstate) && lwtstate->headroom < mtu)
+       if ((lwtunnel_xmit_redirect(lwtstate) ||
+            lwtunnel_output_redirect(lwtstate)) && lwtstate->headroom < mtu)
                return lwtstate->headroom;
 
        return 0;