]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - include/net/ipv6.h
Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux.git] / include / net / ipv6.h
index 60d9480bc4d1e829e6b4191ccd92a83d319f0813..8dfc65639aa4c4dc10277989cf4bfa03ec161354 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/hardirq.h>
 #include <linux/jhash.h>
 #include <linux/refcount.h>
+#include <linux/jump_label_ratelimit.h>
 #include <net/if_inet6.h>
 #include <net/ndisc.h>
 #include <net/flow.h>
@@ -150,6 +151,49 @@ struct frag_hdr {
 #define        IP6_MF          0x0001
 #define        IP6_OFFSET      0xFFF8
 
+struct ip6_fraglist_iter {
+       struct ipv6hdr  *tmp_hdr;
+       struct sk_buff  *frag;
+       int             offset;
+       unsigned int    hlen;
+       __be32          frag_id;
+       u8              nexthdr;
+};
+
+int ip6_fraglist_init(struct sk_buff *skb, unsigned int hlen, u8 *prevhdr,
+                     u8 nexthdr, __be32 frag_id,
+                     struct ip6_fraglist_iter *iter);
+void ip6_fraglist_prepare(struct sk_buff *skb, struct ip6_fraglist_iter *iter);
+
+static inline struct sk_buff *ip6_fraglist_next(struct ip6_fraglist_iter *iter)
+{
+       struct sk_buff *skb = iter->frag;
+
+       iter->frag = skb->next;
+       skb_mark_not_on_list(skb);
+
+       return skb;
+}
+
+struct ip6_frag_state {
+       u8              *prevhdr;
+       unsigned int    hlen;
+       unsigned int    mtu;
+       unsigned int    left;
+       int             offset;
+       int             ptr;
+       int             hroom;
+       int             troom;
+       __be32          frag_id;
+       u8              nexthdr;
+};
+
+void ip6_frag_init(struct sk_buff *skb, unsigned int hlen, unsigned int mtu,
+                  unsigned short needed_tailroom, int hdr_room, u8 *prevhdr,
+                  u8 nexthdr, __be32 frag_id, struct ip6_frag_state *state);
+struct sk_buff *ip6_frag_next(struct sk_buff *skb,
+                             struct ip6_frag_state *state);
+
 #define IP6_REPLY_MARK(net, mark) \
        ((net)->ipv6.sysctl.fwmark_reflect ? (mark) : 0)
 
@@ -258,6 +302,13 @@ struct ipv6_txoptions {
        /* Option buffer, as read by IPV6_PKTOPTIONS, starts here. */
 };
 
+/* flowlabel_reflect sysctl values */
+enum flowlabel_reflect {
+       FLOWLABEL_REFLECT_ESTABLISHED           = 1,
+       FLOWLABEL_REFLECT_TCP_RESET             = 2,
+       FLOWLABEL_REFLECT_ICMPV6_ECHO_REPLIES   = 4,
+};
+
 struct ip6_flowlabel {
        struct ip6_flowlabel __rcu *next;
        __be32                  label;
@@ -339,7 +390,18 @@ static inline void txopt_put(struct ipv6_txoptions *opt)
                kfree_rcu(opt, rcu);
 }
 
-struct ip6_flowlabel *fl6_sock_lookup(struct sock *sk, __be32 label);
+struct ip6_flowlabel *__fl6_sock_lookup(struct sock *sk, __be32 label);
+
+extern struct static_key_false_deferred ipv6_flowlabel_exclusive;
+static inline struct ip6_flowlabel *fl6_sock_lookup(struct sock *sk,
+                                                   __be32 label)
+{
+       if (static_branch_unlikely(&ipv6_flowlabel_exclusive.key))
+               return __fl6_sock_lookup(sk, label) ? : ERR_PTR(-ENOENT);
+
+       return NULL;
+}
+
 struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions *opt_space,
                                         struct ip6_flowlabel *fl,
                                         struct ipv6_txoptions *fopt);