#ifndef __NET_FRAG_H__
#define __NET_FRAG_H__
#include <linux/rhashtable-types.h>
#include <linux/completion.h>
#include <linux/in6.h>
#include <linux/rbtree_types.h>
#include <linux/refcount.h>
#include <net/dropreason-core.h>
struct fqdir { … };
enum { … };
struct frag_v4_compare_key { … };
struct frag_v6_compare_key { … };
struct inet_frag_queue { … };
struct inet_frags { … };
int inet_frags_init(struct inet_frags *);
void inet_frags_fini(struct inet_frags *);
int fqdir_init(struct fqdir **fqdirp, struct inet_frags *f, struct net *net);
static inline void fqdir_pre_exit(struct fqdir *fqdir)
{ … }
void fqdir_exit(struct fqdir *fqdir);
void inet_frag_kill(struct inet_frag_queue *q);
void inet_frag_destroy(struct inet_frag_queue *q);
struct inet_frag_queue *inet_frag_find(struct fqdir *fqdir, void *key);
unsigned int inet_frag_rbtree_purge(struct rb_root *root,
enum skb_drop_reason reason);
static inline void inet_frag_put(struct inet_frag_queue *q)
{ … }
static inline long frag_mem_limit(const struct fqdir *fqdir)
{ … }
static inline void sub_frag_mem_limit(struct fqdir *fqdir, long val)
{ … }
static inline void add_frag_mem_limit(struct fqdir *fqdir, long val)
{ … }
#define IPFRAG_ECN_NOT_ECT …
#define IPFRAG_ECN_ECT_1 …
#define IPFRAG_ECN_ECT_0 …
#define IPFRAG_ECN_CE …
extern const u8 ip_frag_ecn_table[16];
#define IPFRAG_OK …
#define IPFRAG_DUP …
#define IPFRAG_OVERLAP …
int inet_frag_queue_insert(struct inet_frag_queue *q, struct sk_buff *skb,
int offset, int end);
void *inet_frag_reasm_prepare(struct inet_frag_queue *q, struct sk_buff *skb,
struct sk_buff *parent);
void inet_frag_reasm_finish(struct inet_frag_queue *q, struct sk_buff *head,
void *reasm_data, bool try_coalesce);
struct sk_buff *inet_frag_pull_head(struct inet_frag_queue *q);
#endif