1#ifndef __PACKET_INTERNAL_H__
2#define __PACKET_INTERNAL_H__
3
4struct packet_mclist {
5	struct packet_mclist	*next;
6	int			ifindex;
7	int			count;
8	unsigned short		type;
9	unsigned short		alen;
10	unsigned char		addr[MAX_ADDR_LEN];
11};
12
13/* kbdq - kernel block descriptor queue */
14struct tpacket_kbdq_core {
15	struct pgv	*pkbdq;
16	unsigned int	feature_req_word;
17	unsigned int	hdrlen;
18	unsigned char	reset_pending_on_curr_blk;
19	unsigned char   delete_blk_timer;
20	unsigned short	kactive_blk_num;
21	unsigned short	blk_sizeof_priv;
22
23	/* last_kactive_blk_num:
24	 * trick to see if user-space has caught up
25	 * in order to avoid refreshing timer when every single pkt arrives.
26	 */
27	unsigned short	last_kactive_blk_num;
28
29	char		*pkblk_start;
30	char		*pkblk_end;
31	int		kblk_size;
32	unsigned int	max_frame_len;
33	unsigned int	knum_blocks;
34	uint64_t	knxt_seq_num;
35	char		*prev;
36	char		*nxt_offset;
37	struct sk_buff	*skb;
38
39	atomic_t	blk_fill_in_prog;
40
41	/* Default is set to 8ms */
42#define DEFAULT_PRB_RETIRE_TOV	(8)
43
44	unsigned short  retire_blk_tov;
45	unsigned short  version;
46	unsigned long	tov_in_jiffies;
47
48	/* timer to retire an outstanding block */
49	struct timer_list retire_blk_timer;
50};
51
52struct pgv {
53	char *buffer;
54};
55
56struct packet_ring_buffer {
57	struct pgv		*pg_vec;
58
59	unsigned int		head;
60	unsigned int		frames_per_block;
61	unsigned int		frame_size;
62	unsigned int		frame_max;
63
64	unsigned int		pg_vec_order;
65	unsigned int		pg_vec_pages;
66	unsigned int		pg_vec_len;
67
68	unsigned int __percpu	*pending_refcnt;
69
70	struct tpacket_kbdq_core	prb_bdqc;
71};
72
73extern struct mutex fanout_mutex;
74#define PACKET_FANOUT_MAX	256
75
76struct packet_fanout {
77	possible_net_t		net;
78	unsigned int		num_members;
79	u16			id;
80	u8			type;
81	u8			flags;
82	atomic_t		rr_cur;
83	struct list_head	list;
84	struct sock		*arr[PACKET_FANOUT_MAX];
85	int			next[PACKET_FANOUT_MAX];
86	spinlock_t		lock;
87	atomic_t		sk_ref;
88	struct packet_type	prot_hook ____cacheline_aligned_in_smp;
89};
90
91struct packet_sock {
92	/* struct sock has to be the first member of packet_sock */
93	struct sock		sk;
94	struct packet_fanout	*fanout;
95	union  tpacket_stats_u	stats;
96	struct packet_ring_buffer	rx_ring;
97	struct packet_ring_buffer	tx_ring;
98	int			copy_thresh;
99	spinlock_t		bind_lock;
100	struct mutex		pg_vec_lock;
101	unsigned int		running:1,	/* prot_hook is attached*/
102				auxdata:1,
103				origdev:1,
104				has_vnet_hdr:1;
105	int			ifindex;	/* bound device		*/
106	__be16			num;
107	struct packet_mclist	*mclist;
108	atomic_t		mapped;
109	enum tpacket_versions	tp_version;
110	unsigned int		tp_hdrlen;
111	unsigned int		tp_reserve;
112	unsigned int		tp_loss:1;
113	unsigned int		tp_tx_has_off:1;
114	unsigned int		tp_tstamp;
115	struct net_device __rcu	*cached_dev;
116	int			(*xmit)(struct sk_buff *skb);
117	struct packet_type	prot_hook ____cacheline_aligned_in_smp;
118};
119
120static struct packet_sock *pkt_sk(struct sock *sk)
121{
122	return (struct packet_sock *)sk;
123}
124
125#endif
126