Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[sfrench/cifs-2.6.git] / include / net / ip.h
index 49c672c8cdae9acbc0fe84100dae971ecf1da3e8..6dbf88ea07f1a99a1f9e58d7e5c22e3b5da5df96 100644 (file)
@@ -161,6 +161,44 @@ int ip_output(struct net *net, struct sock *sk, struct sk_buff *skb);
 int ip_mc_output(struct net *net, struct sock *sk, struct sk_buff *skb);
 int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
                   int (*output)(struct net *, struct sock *, struct sk_buff *));
+
+struct ip_fraglist_iter {
+       struct sk_buff  *frag;
+       struct iphdr    *iph;
+       int             offset;
+       unsigned int    hlen;
+};
+
+void ip_fraglist_init(struct sk_buff *skb, struct iphdr *iph,
+                     unsigned int hlen, struct ip_fraglist_iter *iter);
+void ip_fraglist_prepare(struct sk_buff *skb, struct ip_fraglist_iter *iter);
+
+static inline struct sk_buff *ip_fraglist_next(struct ip_fraglist_iter *iter)
+{
+       struct sk_buff *skb = iter->frag;
+
+       iter->frag = skb->next;
+       skb_mark_not_on_list(skb);
+
+       return skb;
+}
+
+struct ip_frag_state {
+       struct iphdr    *iph;
+       unsigned int    hlen;
+       unsigned int    ll_rs;
+       unsigned int    mtu;
+       unsigned int    left;
+       int             offset;
+       int             ptr;
+       __be16          not_last_frag;
+};
+
+void ip_frag_init(struct sk_buff *skb, unsigned int hlen, unsigned int ll_rs,
+                 unsigned int mtu, struct ip_frag_state *state);
+struct sk_buff *ip_frag_next(struct sk_buff *skb,
+                            struct ip_frag_state *state);
+
 void ip_send_check(struct iphdr *ip);
 int __ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
 int ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);