aboutsummaryrefslogtreecommitdiffstats
path: root/sys/linux/netfilter_arp.txt
blob: 0f897802da25abb79e932aa33dd04bb7ae724b55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# Copyright 2018 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.

include <linux/socket.h>
include <uapi/linux/netfilter_arp/arp_tables.h>
include <uapi/linux/netfilter_arp/arpt_mangle.h>

setsockopt$ARPT_SO_SET_REPLACE(fd sock_in, level const[SOL_IP], opt const[ARPT_SO_SET_REPLACE], val ptr[in, arpt_replace], len len[val])
setsockopt$ARPT_SO_SET_ADD_COUNTERS(fd sock_in, level const[SOL_IP], opt const[ARPT_SO_SET_ADD_COUNTERS], val ptr[in, arpt_counters_info], len len[val])
getsockopt$ARPT_SO_GET_INFO(fd sock_in, level const[SOL_IP], opt const[ARPT_SO_GET_INFO], val ptr[in, arpt_getinfo], len ptr[in, len[val, int32]])
getsockopt$ARPT_SO_GET_ENTRIES(fd sock_in, level const[SOL_IP], opt const[ARPT_SO_GET_ENTRIES], val ptr[in, arpt_get_entries], len ptr[in, len[val, int32]])
getsockopt$ARPT_SO_GET_REVISION_TARGET(fd sock_in, level const[SOL_IP], opt const[ARPT_SO_GET_REVISION_TARGET], val ptr[in, xt_get_revision], len ptr[in, len[val, int32]])

arpt_replace {
	name			string["filter", XT_TABLE_MAXNAMELEN]
	valid_hooks		const[ARPT_FILTER_VALID_HOOKS, int32]
	num_entries		const[4, int32]
	size			bytesize[entries, int32]
	hook_in			ipt_hook
	hook_out		ipt_hook
	hook_forward		ipt_hook
	underflow_in		ipt_hook
	underflow_out		ipt_hook
	underflow_forward	ipt_hook
	num_counters		const[4, int32]
	counters		ptr[out, array[xt_counters, 4]]
	entries			arpt_replace_entries
}

define ARPT_FILTER_VALID_HOOKS	(1 << NF_ARP_IN) | (1 << NF_ARP_OUT) | (1 << NF_ARP_FORWARD)

arpt_replace_entries {
	entries		array[arpt_entry, 3]
	underflow	arpt_entry_underflow
} [packed, align[PTR_SIZE]]

arpt_entry {
	matches	arpt_entry_matches
	target	arpt_targets
} [packed, align[PTR_SIZE]]

arpt_entry_matches {
	arp		arpt_arp_or_uncond
	target_offset	len[parent, int16]
	next_offset	len[arpt_entry, int16]
	comefrom	const[0, int32]
	counters	xt_counters
# Note: matches should go here, but they seem to be unused in arp tables.
} [align[PTR_SIZE]]

arpt_entry_underflow {
	matches	arpt_entry_underflow_matches
	target	xt_target_t["", const[NF_ACCEPT_VERDICT, int32], 0]
} [align[PTR_SIZE]]

arpt_entry_underflow_matches {
	arp		arpt_arp_uncond
	target_offset	len[parent, int16]
	next_offset	len[arpt_entry_underflow, int16]
	comefrom	const[0, int32]
	counters	xt_counters
}

arpt_arp_or_uncond [
	arp	arpt_arp
	uncond	arpt_arp_uncond
]

type arpt_arp_uncond array[const[0, int8], ARPT_ARP_SIZE]
define ARPT_ARP_SIZE	sizeof(struct arpt_arp)

arpt_arp {
	src		ipv4_addr
	tgt		ipv4_addr
	smsk		ipv4_addr_mask
	tmsk		ipv4_addr_mask
	arhln		int8[0:ARPT_DEV_ADDR_LEN_MAX]
	arhln_mask	int8[0:ARPT_DEV_ADDR_LEN_MAX]
	src_devaddr	arpt_devaddr_info
	tgt_devaddr	arpt_devaddr_info
	arpop		int16be
	arpop_mask	int16be
	arhrd		int16be
	arhrd_mask	int16be
	arpro		int16be
	arpro_mask	int16be
	iniface		devname
	outiface	devname
	iniface_mask	devname_mask
	outiface_mask	devname_mask
	flags		const[0, int8]
	invflags	flags[arpt_arp_invflags, int16]
}

arpt_devaddr_info {
	addr	arpt_devaddr
	mask	arpt_devmask
}

arpt_devaddr [
	empty	array[const[0, int8], ARPT_DEV_ADDR_LEN_MAX]
	mac	mac_addr
]

arpt_devmask {
	mac	mac_addr_mask
} [size[ARPT_DEV_ADDR_LEN_MAX]]

arpt_arp_invflags = ARPT_INV_VIA_IN, ARPT_INV_VIA_OUT, ARPT_INV_SRCIP, ARPT_INV_TGTIP, ARPT_INV_SRCDEVADDR, ARPT_INV_TGTDEVADDR, ARPT_INV_ARPOP, ARPT_INV_ARPHRD, ARPT_INV_ARPPRO, ARPT_INV_ARPHLN

arpt_targets [
	unspec	xt_unspec_targets
	mangle	xt_target_t["mangle", arpt_mangle, 0]
] [varlen]

arpt_mangle {
	src_devaddr	arpt_devaddr
	tgt_devaddr	arpt_devaddr
	src_ip		ipv4_addr
	tgt_ip		ipv4_addr
	flags		flags[arpt_mangle_flags, int8]
	target		flags[arpt_mangle_targets, int32]
}

arpt_mangle_flags = ARPT_MANGLE_SDEV, ARPT_MANGLE_TDEV, ARPT_MANGLE_SIP, ARPT_MANGLE_TIP, ARPT_MANGLE_MASK
arpt_mangle_targets = NF_DROP, NF_ACCEPT, XT_CONTINUE

arpt_counters_info {
	name		string["filter", XT_TABLE_MAXNAMELEN]
	num_counters	len[counters, int32]
	counters	array[xt_counters, 4:4]
}

arpt_getinfo {
	name		string["filter", XT_TABLE_MAXNAMELEN]
	valid_hooks	const[0, int32]
	hook_entry	array[int32, NF_ARP_NUMHOOKS]
	underflow	array[const[0, int32], NF_ARP_NUMHOOKS]
	num_entries	const[0, int32]
	size		const[0, int32]
}

arpt_get_entries {
	name		string["filter", XT_TABLE_MAXNAMELEN]
	size		bytesize[entrytable, int32]
	entrytable	array[int8]
}