xref: /aosp_15_r20/external/iptables/extensions/libip6t_srh.c (revision a71a954618bbadd4a345637e5edcf36eec826889)
1*a71a9546SAutomerger Merge Worker /* Shared library to add Segment Routing Header (SRH) matching support.
2*a71a9546SAutomerger Merge Worker  *
3*a71a9546SAutomerger Merge Worker  * Author:
4*a71a9546SAutomerger Merge Worker  *       Ahmed Abdelsalam       <[email protected]>
5*a71a9546SAutomerger Merge Worker  */
6*a71a9546SAutomerger Merge Worker 
7*a71a9546SAutomerger Merge Worker #include <stdio.h>
8*a71a9546SAutomerger Merge Worker #include <xtables.h>
9*a71a9546SAutomerger Merge Worker #include <linux/netfilter_ipv6/ip6t_srh.h>
10*a71a9546SAutomerger Merge Worker #include <string.h>
11*a71a9546SAutomerger Merge Worker 
12*a71a9546SAutomerger Merge Worker /* srh command-line options */
13*a71a9546SAutomerger Merge Worker enum {
14*a71a9546SAutomerger Merge Worker 	O_SRH_NEXTHDR,
15*a71a9546SAutomerger Merge Worker 	O_SRH_LEN_EQ,
16*a71a9546SAutomerger Merge Worker 	O_SRH_LEN_GT,
17*a71a9546SAutomerger Merge Worker 	O_SRH_LEN_LT,
18*a71a9546SAutomerger Merge Worker 	O_SRH_SEGS_EQ,
19*a71a9546SAutomerger Merge Worker 	O_SRH_SEGS_GT,
20*a71a9546SAutomerger Merge Worker 	O_SRH_SEGS_LT,
21*a71a9546SAutomerger Merge Worker 	O_SRH_LAST_EQ,
22*a71a9546SAutomerger Merge Worker 	O_SRH_LAST_GT,
23*a71a9546SAutomerger Merge Worker 	O_SRH_LAST_LT,
24*a71a9546SAutomerger Merge Worker 	O_SRH_TAG,
25*a71a9546SAutomerger Merge Worker 	O_SRH_PSID,
26*a71a9546SAutomerger Merge Worker 	O_SRH_NSID,
27*a71a9546SAutomerger Merge Worker 	O_SRH_LSID,
28*a71a9546SAutomerger Merge Worker };
29*a71a9546SAutomerger Merge Worker 
srh_help(void)30*a71a9546SAutomerger Merge Worker static void srh_help(void)
31*a71a9546SAutomerger Merge Worker {
32*a71a9546SAutomerger Merge Worker 	printf(
33*a71a9546SAutomerger Merge Worker "srh match options:\n"
34*a71a9546SAutomerger Merge Worker "[!] --srh-next-hdr		next-hdr        Next Header value of SRH\n"
35*a71a9546SAutomerger Merge Worker "[!] --srh-hdr-len-eq		hdr_len         Hdr Ext Len value of SRH\n"
36*a71a9546SAutomerger Merge Worker "[!] --srh-hdr-len-gt		hdr_len         Hdr Ext Len value of SRH\n"
37*a71a9546SAutomerger Merge Worker "[!] --srh-hdr-len-lt		hdr_len         Hdr Ext Len value of SRH\n"
38*a71a9546SAutomerger Merge Worker "[!] --srh-segs-left-eq		segs_left       Segments Left value of SRH\n"
39*a71a9546SAutomerger Merge Worker "[!] --srh-segs-left-gt		segs_left       Segments Left value of SRH\n"
40*a71a9546SAutomerger Merge Worker "[!] --srh-segs-left-lt		segs_left       Segments Left value of SRH\n"
41*a71a9546SAutomerger Merge Worker "[!] --srh-last-entry-eq 	last_entry      Last Entry value of SRH\n"
42*a71a9546SAutomerger Merge Worker "[!] --srh-last-entry-gt 	last_entry      Last Entry value of SRH\n"
43*a71a9546SAutomerger Merge Worker "[!] --srh-last-entry-lt 	last_entry      Last Entry value of SRH\n"
44*a71a9546SAutomerger Merge Worker "[!] --srh-tag			tag             Tag value of SRH\n"
45*a71a9546SAutomerger Merge Worker "[!] --srh-psid			addr[/mask]	SRH previous SID\n"
46*a71a9546SAutomerger Merge Worker "[!] --srh-nsid			addr[/mask]	SRH next SID\n"
47*a71a9546SAutomerger Merge Worker "[!] --srh-lsid			addr[/mask]	SRH Last SID\n");
48*a71a9546SAutomerger Merge Worker }
49*a71a9546SAutomerger Merge Worker 
50*a71a9546SAutomerger Merge Worker #define s struct ip6t_srh
51*a71a9546SAutomerger Merge Worker static const struct xt_option_entry srh_opts[] = {
52*a71a9546SAutomerger Merge Worker 	{ .name = "srh-next-hdr", .id = O_SRH_NEXTHDR, .type = XTTYPE_UINT8,
53*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, next_hdr)},
54*a71a9546SAutomerger Merge Worker 	{ .name = "srh-hdr-len-eq", .id = O_SRH_LEN_EQ, .type = XTTYPE_UINT8,
55*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, hdr_len)},
56*a71a9546SAutomerger Merge Worker 	{ .name = "srh-hdr-len-gt", .id = O_SRH_LEN_GT, .type = XTTYPE_UINT8,
57*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, hdr_len)},
58*a71a9546SAutomerger Merge Worker 	{ .name = "srh-hdr-len-lt", .id = O_SRH_LEN_LT, .type = XTTYPE_UINT8,
59*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, hdr_len)},
60*a71a9546SAutomerger Merge Worker 	{ .name = "srh-segs-left-eq", .id = O_SRH_SEGS_EQ, .type = XTTYPE_UINT8,
61*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, segs_left)},
62*a71a9546SAutomerger Merge Worker 	{ .name = "srh-segs-left-gt", .id = O_SRH_SEGS_GT, .type = XTTYPE_UINT8,
63*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, segs_left)},
64*a71a9546SAutomerger Merge Worker 	{ .name = "srh-segs-left-lt", .id = O_SRH_SEGS_LT, .type = XTTYPE_UINT8,
65*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, segs_left)},
66*a71a9546SAutomerger Merge Worker 	{ .name = "srh-last-entry-eq", .id = O_SRH_LAST_EQ, .type = XTTYPE_UINT8,
67*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, last_entry)},
68*a71a9546SAutomerger Merge Worker 	{ .name = "srh-last-entry-gt", .id = O_SRH_LAST_GT, .type = XTTYPE_UINT8,
69*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, last_entry)},
70*a71a9546SAutomerger Merge Worker 	{ .name = "srh-last-entry-lt", .id = O_SRH_LAST_LT, .type = XTTYPE_UINT8,
71*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, last_entry)},
72*a71a9546SAutomerger Merge Worker 	{ .name = "srh-tag", .id = O_SRH_TAG, .type = XTTYPE_UINT16,
73*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, tag)},
74*a71a9546SAutomerger Merge Worker 	{ }
75*a71a9546SAutomerger Merge Worker };
76*a71a9546SAutomerger Merge Worker #undef s
77*a71a9546SAutomerger Merge Worker 
78*a71a9546SAutomerger Merge Worker #define s struct ip6t_srh1
79*a71a9546SAutomerger Merge Worker static const struct xt_option_entry srh1_opts[] = {
80*a71a9546SAutomerger Merge Worker 	{ .name = "srh-next-hdr", .id = O_SRH_NEXTHDR, .type = XTTYPE_UINT8,
81*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, next_hdr)},
82*a71a9546SAutomerger Merge Worker 	{ .name = "srh-hdr-len-eq", .id = O_SRH_LEN_EQ, .type = XTTYPE_UINT8,
83*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, hdr_len)},
84*a71a9546SAutomerger Merge Worker 	{ .name = "srh-hdr-len-gt", .id = O_SRH_LEN_GT, .type = XTTYPE_UINT8,
85*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, hdr_len)},
86*a71a9546SAutomerger Merge Worker 	{ .name = "srh-hdr-len-lt", .id = O_SRH_LEN_LT, .type = XTTYPE_UINT8,
87*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, hdr_len)},
88*a71a9546SAutomerger Merge Worker 	{ .name = "srh-segs-left-eq", .id = O_SRH_SEGS_EQ, .type = XTTYPE_UINT8,
89*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, segs_left)},
90*a71a9546SAutomerger Merge Worker 	{ .name = "srh-segs-left-gt", .id = O_SRH_SEGS_GT, .type = XTTYPE_UINT8,
91*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, segs_left)},
92*a71a9546SAutomerger Merge Worker 	{ .name = "srh-segs-left-lt", .id = O_SRH_SEGS_LT, .type = XTTYPE_UINT8,
93*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, segs_left)},
94*a71a9546SAutomerger Merge Worker 	{ .name = "srh-last-entry-eq", .id = O_SRH_LAST_EQ, .type = XTTYPE_UINT8,
95*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, last_entry)},
96*a71a9546SAutomerger Merge Worker 	{ .name = "srh-last-entry-gt", .id = O_SRH_LAST_GT, .type = XTTYPE_UINT8,
97*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, last_entry)},
98*a71a9546SAutomerger Merge Worker 	{ .name = "srh-last-entry-lt", .id = O_SRH_LAST_LT, .type = XTTYPE_UINT8,
99*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, last_entry)},
100*a71a9546SAutomerger Merge Worker 	{ .name = "srh-tag", .id = O_SRH_TAG, .type = XTTYPE_UINT16,
101*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, tag)},
102*a71a9546SAutomerger Merge Worker 	{ .name = "srh-psid", .id = O_SRH_PSID, .type = XTTYPE_HOSTMASK,
103*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT},
104*a71a9546SAutomerger Merge Worker 	{ .name = "srh-nsid", .id = O_SRH_NSID, .type = XTTYPE_HOSTMASK,
105*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT},
106*a71a9546SAutomerger Merge Worker 	{ .name = "srh-lsid", .id = O_SRH_LSID, .type = XTTYPE_HOSTMASK,
107*a71a9546SAutomerger Merge Worker 	.flags = XTOPT_INVERT},
108*a71a9546SAutomerger Merge Worker 	{ }
109*a71a9546SAutomerger Merge Worker };
110*a71a9546SAutomerger Merge Worker #undef s
111*a71a9546SAutomerger Merge Worker 
srh_init(struct xt_entry_match * m)112*a71a9546SAutomerger Merge Worker static void srh_init(struct xt_entry_match *m)
113*a71a9546SAutomerger Merge Worker {
114*a71a9546SAutomerger Merge Worker 	struct ip6t_srh *srhinfo = (void *)m->data;
115*a71a9546SAutomerger Merge Worker 
116*a71a9546SAutomerger Merge Worker 	srhinfo->mt_flags = 0;
117*a71a9546SAutomerger Merge Worker 	srhinfo->mt_invflags = 0;
118*a71a9546SAutomerger Merge Worker }
119*a71a9546SAutomerger Merge Worker 
srh1_init(struct xt_entry_match * m)120*a71a9546SAutomerger Merge Worker static void srh1_init(struct xt_entry_match *m)
121*a71a9546SAutomerger Merge Worker {
122*a71a9546SAutomerger Merge Worker 	struct ip6t_srh1 *srhinfo = (void *)m->data;
123*a71a9546SAutomerger Merge Worker 
124*a71a9546SAutomerger Merge Worker 	srhinfo->mt_flags = 0;
125*a71a9546SAutomerger Merge Worker 	srhinfo->mt_invflags = 0;
126*a71a9546SAutomerger Merge Worker 	memset(srhinfo->psid_addr.s6_addr, 0, sizeof(srhinfo->psid_addr.s6_addr));
127*a71a9546SAutomerger Merge Worker 	memset(srhinfo->nsid_addr.s6_addr, 0, sizeof(srhinfo->nsid_addr.s6_addr));
128*a71a9546SAutomerger Merge Worker 	memset(srhinfo->lsid_addr.s6_addr, 0, sizeof(srhinfo->lsid_addr.s6_addr));
129*a71a9546SAutomerger Merge Worker 	memset(srhinfo->psid_msk.s6_addr, 0, sizeof(srhinfo->psid_msk.s6_addr));
130*a71a9546SAutomerger Merge Worker 	memset(srhinfo->nsid_msk.s6_addr, 0, sizeof(srhinfo->nsid_msk.s6_addr));
131*a71a9546SAutomerger Merge Worker 	memset(srhinfo->lsid_msk.s6_addr, 0, sizeof(srhinfo->lsid_msk.s6_addr));
132*a71a9546SAutomerger Merge Worker }
133*a71a9546SAutomerger Merge Worker 
srh_parse(struct xt_option_call * cb)134*a71a9546SAutomerger Merge Worker static void srh_parse(struct xt_option_call *cb)
135*a71a9546SAutomerger Merge Worker {
136*a71a9546SAutomerger Merge Worker 	struct ip6t_srh *srhinfo = cb->data;
137*a71a9546SAutomerger Merge Worker 
138*a71a9546SAutomerger Merge Worker 	xtables_option_parse(cb);
139*a71a9546SAutomerger Merge Worker 	switch (cb->entry->id) {
140*a71a9546SAutomerger Merge Worker 	case O_SRH_NEXTHDR:
141*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_NEXTHDR;
142*a71a9546SAutomerger Merge Worker 		if (cb->invert)
143*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_NEXTHDR;
144*a71a9546SAutomerger Merge Worker 		break;
145*a71a9546SAutomerger Merge Worker 	case O_SRH_LEN_EQ:
146*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_LEN_EQ;
147*a71a9546SAutomerger Merge Worker 		if (cb->invert)
148*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_LEN_EQ;
149*a71a9546SAutomerger Merge Worker 		break;
150*a71a9546SAutomerger Merge Worker 	case O_SRH_LEN_GT:
151*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_LEN_GT;
152*a71a9546SAutomerger Merge Worker 		if (cb->invert)
153*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_LEN_GT;
154*a71a9546SAutomerger Merge Worker 		break;
155*a71a9546SAutomerger Merge Worker 	case O_SRH_LEN_LT:
156*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_LEN_LT;
157*a71a9546SAutomerger Merge Worker 		if (cb->invert)
158*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_LEN_LT;
159*a71a9546SAutomerger Merge Worker 		break;
160*a71a9546SAutomerger Merge Worker 	case O_SRH_SEGS_EQ:
161*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_SEGS_EQ;
162*a71a9546SAutomerger Merge Worker 		if (cb->invert)
163*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_SEGS_EQ;
164*a71a9546SAutomerger Merge Worker 		break;
165*a71a9546SAutomerger Merge Worker 	case O_SRH_SEGS_GT:
166*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_SEGS_GT;
167*a71a9546SAutomerger Merge Worker 		if (cb->invert)
168*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_SEGS_GT;
169*a71a9546SAutomerger Merge Worker 		break;
170*a71a9546SAutomerger Merge Worker 	case O_SRH_SEGS_LT:
171*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_SEGS_LT;
172*a71a9546SAutomerger Merge Worker 		if (cb->invert)
173*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_SEGS_LT;
174*a71a9546SAutomerger Merge Worker 		break;
175*a71a9546SAutomerger Merge Worker 	case O_SRH_LAST_EQ:
176*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_LAST_EQ;
177*a71a9546SAutomerger Merge Worker 		if (cb->invert)
178*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_LAST_EQ;
179*a71a9546SAutomerger Merge Worker 		break;
180*a71a9546SAutomerger Merge Worker 	case O_SRH_LAST_GT:
181*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_LAST_GT;
182*a71a9546SAutomerger Merge Worker 		if (cb->invert)
183*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_LAST_GT;
184*a71a9546SAutomerger Merge Worker 		break;
185*a71a9546SAutomerger Merge Worker 	case O_SRH_LAST_LT:
186*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_LAST_LT;
187*a71a9546SAutomerger Merge Worker 		if (cb->invert)
188*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_LAST_LT;
189*a71a9546SAutomerger Merge Worker 		break;
190*a71a9546SAutomerger Merge Worker 	case O_SRH_TAG:
191*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_TAG;
192*a71a9546SAutomerger Merge Worker 		if (cb->invert)
193*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_TAG;
194*a71a9546SAutomerger Merge Worker 		break;
195*a71a9546SAutomerger Merge Worker 	}
196*a71a9546SAutomerger Merge Worker }
197*a71a9546SAutomerger Merge Worker 
srh1_parse(struct xt_option_call * cb)198*a71a9546SAutomerger Merge Worker static void srh1_parse(struct xt_option_call *cb)
199*a71a9546SAutomerger Merge Worker {
200*a71a9546SAutomerger Merge Worker 	struct ip6t_srh1 *srhinfo = cb->data;
201*a71a9546SAutomerger Merge Worker 
202*a71a9546SAutomerger Merge Worker 	xtables_option_parse(cb);
203*a71a9546SAutomerger Merge Worker 	switch (cb->entry->id) {
204*a71a9546SAutomerger Merge Worker 	case O_SRH_NEXTHDR:
205*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_NEXTHDR;
206*a71a9546SAutomerger Merge Worker 		if (cb->invert)
207*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_NEXTHDR;
208*a71a9546SAutomerger Merge Worker 		break;
209*a71a9546SAutomerger Merge Worker 	case O_SRH_LEN_EQ:
210*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_LEN_EQ;
211*a71a9546SAutomerger Merge Worker 		if (cb->invert)
212*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_LEN_EQ;
213*a71a9546SAutomerger Merge Worker 		break;
214*a71a9546SAutomerger Merge Worker 	case O_SRH_LEN_GT:
215*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_LEN_GT;
216*a71a9546SAutomerger Merge Worker 		if (cb->invert)
217*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_LEN_GT;
218*a71a9546SAutomerger Merge Worker 		break;
219*a71a9546SAutomerger Merge Worker 	case O_SRH_LEN_LT:
220*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_LEN_LT;
221*a71a9546SAutomerger Merge Worker 		if (cb->invert)
222*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_LEN_LT;
223*a71a9546SAutomerger Merge Worker 		break;
224*a71a9546SAutomerger Merge Worker 	case O_SRH_SEGS_EQ:
225*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_SEGS_EQ;
226*a71a9546SAutomerger Merge Worker 		if (cb->invert)
227*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_SEGS_EQ;
228*a71a9546SAutomerger Merge Worker 		break;
229*a71a9546SAutomerger Merge Worker 	case O_SRH_SEGS_GT:
230*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_SEGS_GT;
231*a71a9546SAutomerger Merge Worker 		if (cb->invert)
232*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_SEGS_GT;
233*a71a9546SAutomerger Merge Worker 		break;
234*a71a9546SAutomerger Merge Worker 	case O_SRH_SEGS_LT:
235*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_SEGS_LT;
236*a71a9546SAutomerger Merge Worker 		if (cb->invert)
237*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_SEGS_LT;
238*a71a9546SAutomerger Merge Worker 		break;
239*a71a9546SAutomerger Merge Worker 	case O_SRH_LAST_EQ:
240*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_LAST_EQ;
241*a71a9546SAutomerger Merge Worker 		if (cb->invert)
242*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_LAST_EQ;
243*a71a9546SAutomerger Merge Worker 		break;
244*a71a9546SAutomerger Merge Worker 	case O_SRH_LAST_GT:
245*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_LAST_GT;
246*a71a9546SAutomerger Merge Worker 		if (cb->invert)
247*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_LAST_GT;
248*a71a9546SAutomerger Merge Worker 		break;
249*a71a9546SAutomerger Merge Worker 	case O_SRH_LAST_LT:
250*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_LAST_LT;
251*a71a9546SAutomerger Merge Worker 		if (cb->invert)
252*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_LAST_LT;
253*a71a9546SAutomerger Merge Worker 		break;
254*a71a9546SAutomerger Merge Worker 	case O_SRH_TAG:
255*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_TAG;
256*a71a9546SAutomerger Merge Worker 		if (cb->invert)
257*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_TAG;
258*a71a9546SAutomerger Merge Worker 		break;
259*a71a9546SAutomerger Merge Worker 	case O_SRH_PSID:
260*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_PSID;
261*a71a9546SAutomerger Merge Worker 		srhinfo->psid_addr = cb->val.haddr.in6;
262*a71a9546SAutomerger Merge Worker 		srhinfo->psid_msk  = cb->val.hmask.in6;
263*a71a9546SAutomerger Merge Worker 		if (cb->invert)
264*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_PSID;
265*a71a9546SAutomerger Merge Worker 		break;
266*a71a9546SAutomerger Merge Worker 	case O_SRH_NSID:
267*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_NSID;
268*a71a9546SAutomerger Merge Worker 		srhinfo->nsid_addr = cb->val.haddr.in6;
269*a71a9546SAutomerger Merge Worker 		srhinfo->nsid_msk  = cb->val.hmask.in6;
270*a71a9546SAutomerger Merge Worker 		if (cb->invert)
271*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_NSID;
272*a71a9546SAutomerger Merge Worker 		break;
273*a71a9546SAutomerger Merge Worker 	case O_SRH_LSID:
274*a71a9546SAutomerger Merge Worker 		srhinfo->mt_flags |= IP6T_SRH_LSID;
275*a71a9546SAutomerger Merge Worker 		srhinfo->lsid_addr = cb->val.haddr.in6;
276*a71a9546SAutomerger Merge Worker 		srhinfo->lsid_msk  = cb->val.hmask.in6;
277*a71a9546SAutomerger Merge Worker 		if (cb->invert)
278*a71a9546SAutomerger Merge Worker 			srhinfo->mt_invflags |= IP6T_SRH_INV_LSID;
279*a71a9546SAutomerger Merge Worker 		break;
280*a71a9546SAutomerger Merge Worker 	}
281*a71a9546SAutomerger Merge Worker }
282*a71a9546SAutomerger Merge Worker 
srh_print(const void * ip,const struct xt_entry_match * match,int numeric)283*a71a9546SAutomerger Merge Worker static void srh_print(const void *ip, const struct xt_entry_match *match,
284*a71a9546SAutomerger Merge Worker 			int numeric)
285*a71a9546SAutomerger Merge Worker {
286*a71a9546SAutomerger Merge Worker 	const struct ip6t_srh *srhinfo = (struct ip6t_srh *)match->data;
287*a71a9546SAutomerger Merge Worker 
288*a71a9546SAutomerger Merge Worker 	printf(" srh");
289*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_NEXTHDR)
290*a71a9546SAutomerger Merge Worker 		printf(" next-hdr:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_NEXTHDR ? "!" : "",
291*a71a9546SAutomerger Merge Worker 			srhinfo->next_hdr);
292*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LEN_EQ)
293*a71a9546SAutomerger Merge Worker 		printf(" hdr-len-eq:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LEN_EQ ? "!" : "",
294*a71a9546SAutomerger Merge Worker 			srhinfo->hdr_len);
295*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LEN_GT)
296*a71a9546SAutomerger Merge Worker 		printf(" hdr-len-gt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LEN_GT ? "!" : "",
297*a71a9546SAutomerger Merge Worker 			srhinfo->hdr_len);
298*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LEN_LT)
299*a71a9546SAutomerger Merge Worker 		printf(" hdr-len-lt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LEN_LT ? "!" : "",
300*a71a9546SAutomerger Merge Worker 			srhinfo->hdr_len);
301*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_SEGS_EQ)
302*a71a9546SAutomerger Merge Worker 		printf(" segs-left-eq:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_EQ ? "!" : "",
303*a71a9546SAutomerger Merge Worker 			srhinfo->segs_left);
304*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_SEGS_GT)
305*a71a9546SAutomerger Merge Worker 		printf(" segs-left-gt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_GT ? "!" : "",
306*a71a9546SAutomerger Merge Worker 			srhinfo->segs_left);
307*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_SEGS_LT)
308*a71a9546SAutomerger Merge Worker 		printf(" segs-left-lt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_LT ? "!" : "",
309*a71a9546SAutomerger Merge Worker 			srhinfo->segs_left);
310*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LAST_EQ)
311*a71a9546SAutomerger Merge Worker 		printf(" last-entry-eq:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LAST_EQ ? "!" : "",
312*a71a9546SAutomerger Merge Worker 			srhinfo->last_entry);
313*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LAST_GT)
314*a71a9546SAutomerger Merge Worker 		printf(" last-entry-gt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LAST_GT ? "!" : "",
315*a71a9546SAutomerger Merge Worker 			srhinfo->last_entry);
316*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LAST_LT)
317*a71a9546SAutomerger Merge Worker 		printf(" last-entry-lt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LAST_LT ? "!" : "",
318*a71a9546SAutomerger Merge Worker 			srhinfo->last_entry);
319*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_TAG)
320*a71a9546SAutomerger Merge Worker 		printf(" tag:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_TAG ? "!" : "",
321*a71a9546SAutomerger Merge Worker 			srhinfo->tag);
322*a71a9546SAutomerger Merge Worker }
323*a71a9546SAutomerger Merge Worker 
srh1_print(const void * ip,const struct xt_entry_match * match,int numeric)324*a71a9546SAutomerger Merge Worker static void srh1_print(const void *ip, const struct xt_entry_match *match, int numeric)
325*a71a9546SAutomerger Merge Worker {
326*a71a9546SAutomerger Merge Worker 	const struct ip6t_srh1 *srhinfo = (struct ip6t_srh1 *)match->data;
327*a71a9546SAutomerger Merge Worker 
328*a71a9546SAutomerger Merge Worker 	printf(" srh");
329*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_NEXTHDR)
330*a71a9546SAutomerger Merge Worker 		printf(" next-hdr:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_NEXTHDR ? "!" : "",
331*a71a9546SAutomerger Merge Worker 			srhinfo->next_hdr);
332*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LEN_EQ)
333*a71a9546SAutomerger Merge Worker 		printf(" hdr-len-eq:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LEN_EQ ? "!" : "",
334*a71a9546SAutomerger Merge Worker 			srhinfo->hdr_len);
335*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LEN_GT)
336*a71a9546SAutomerger Merge Worker 		printf(" hdr-len-gt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LEN_GT ? "!" : "",
337*a71a9546SAutomerger Merge Worker 			srhinfo->hdr_len);
338*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LEN_LT)
339*a71a9546SAutomerger Merge Worker 		printf(" hdr-len-lt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LEN_LT ? "!" : "",
340*a71a9546SAutomerger Merge Worker 			srhinfo->hdr_len);
341*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_SEGS_EQ)
342*a71a9546SAutomerger Merge Worker 		printf(" segs-left-eq:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_EQ ? "!" : "",
343*a71a9546SAutomerger Merge Worker 			srhinfo->segs_left);
344*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_SEGS_GT)
345*a71a9546SAutomerger Merge Worker 		printf(" segs-left-gt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_GT ? "!" : "",
346*a71a9546SAutomerger Merge Worker 			srhinfo->segs_left);
347*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_SEGS_LT)
348*a71a9546SAutomerger Merge Worker 		printf(" segs-left-lt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_LT ? "!" : "",
349*a71a9546SAutomerger Merge Worker 			srhinfo->segs_left);
350*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LAST_EQ)
351*a71a9546SAutomerger Merge Worker 		printf(" last-entry-eq:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LAST_EQ ? "!" : "",
352*a71a9546SAutomerger Merge Worker 			srhinfo->last_entry);
353*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LAST_GT)
354*a71a9546SAutomerger Merge Worker 		printf(" last-entry-gt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LAST_GT ? "!" : "",
355*a71a9546SAutomerger Merge Worker 			srhinfo->last_entry);
356*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LAST_LT)
357*a71a9546SAutomerger Merge Worker 		printf(" last-entry-lt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LAST_LT ? "!" : "",
358*a71a9546SAutomerger Merge Worker 			srhinfo->last_entry);
359*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_TAG)
360*a71a9546SAutomerger Merge Worker 		printf(" tag:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_TAG ? "!" : "",
361*a71a9546SAutomerger Merge Worker 			srhinfo->tag);
362*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_PSID)
363*a71a9546SAutomerger Merge Worker 		printf(" psid %s %s/%u", srhinfo->mt_invflags & IP6T_SRH_INV_PSID ? "!" : "",
364*a71a9546SAutomerger Merge Worker 			xtables_ip6addr_to_numeric(&srhinfo->psid_addr),
365*a71a9546SAutomerger Merge Worker 			xtables_ip6mask_to_cidr(&srhinfo->psid_msk));
366*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_NSID)
367*a71a9546SAutomerger Merge Worker 		printf(" nsid %s %s/%u", srhinfo->mt_invflags & IP6T_SRH_INV_NSID ? "!" : "",
368*a71a9546SAutomerger Merge Worker 			xtables_ip6addr_to_numeric(&srhinfo->nsid_addr),
369*a71a9546SAutomerger Merge Worker 			xtables_ip6mask_to_cidr(&srhinfo->nsid_msk));
370*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LSID)
371*a71a9546SAutomerger Merge Worker 		printf(" lsid %s %s/%u", srhinfo->mt_invflags & IP6T_SRH_INV_LSID ? "!" : "",
372*a71a9546SAutomerger Merge Worker 			xtables_ip6addr_to_numeric(&srhinfo->lsid_addr),
373*a71a9546SAutomerger Merge Worker 			xtables_ip6mask_to_cidr(&srhinfo->lsid_msk));
374*a71a9546SAutomerger Merge Worker }
375*a71a9546SAutomerger Merge Worker 
srh_save(const void * ip,const struct xt_entry_match * match)376*a71a9546SAutomerger Merge Worker static void srh_save(const void *ip, const struct xt_entry_match *match)
377*a71a9546SAutomerger Merge Worker {
378*a71a9546SAutomerger Merge Worker 	const struct ip6t_srh *srhinfo = (struct ip6t_srh *)match->data;
379*a71a9546SAutomerger Merge Worker 
380*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_NEXTHDR)
381*a71a9546SAutomerger Merge Worker 		printf("%s --srh-next-hdr %u", (srhinfo->mt_invflags & IP6T_SRH_INV_NEXTHDR) ? " !" : "",
382*a71a9546SAutomerger Merge Worker 			srhinfo->next_hdr);
383*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LEN_EQ)
384*a71a9546SAutomerger Merge Worker 		printf("%s --srh-hdr-len-eq %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LEN_EQ) ? " !" : "",
385*a71a9546SAutomerger Merge Worker 			srhinfo->hdr_len);
386*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LEN_GT)
387*a71a9546SAutomerger Merge Worker 		printf("%s --srh-hdr-len-gt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LEN_GT) ? " !" : "",
388*a71a9546SAutomerger Merge Worker 			srhinfo->hdr_len);
389*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LEN_LT)
390*a71a9546SAutomerger Merge Worker 		printf("%s --srh-hdr-len-lt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LEN_LT) ? " !" : "",
391*a71a9546SAutomerger Merge Worker 			srhinfo->hdr_len);
392*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_SEGS_EQ)
393*a71a9546SAutomerger Merge Worker 		printf("%s --srh-segs-left-eq %u", (srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_EQ) ? " !" : "",
394*a71a9546SAutomerger Merge Worker 			srhinfo->segs_left);
395*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_SEGS_GT)
396*a71a9546SAutomerger Merge Worker 		printf("%s --srh-segs-left-gt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_GT) ? " !" : "",
397*a71a9546SAutomerger Merge Worker 			srhinfo->segs_left);
398*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_SEGS_LT)
399*a71a9546SAutomerger Merge Worker 		printf("%s --srh-segs-left-lt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_LT) ? " !" : "",
400*a71a9546SAutomerger Merge Worker 			srhinfo->segs_left);
401*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LAST_EQ)
402*a71a9546SAutomerger Merge Worker 		printf("%s --srh-last-entry-eq %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LAST_EQ) ? " !" : "",
403*a71a9546SAutomerger Merge Worker 			srhinfo->last_entry);
404*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LAST_GT)
405*a71a9546SAutomerger Merge Worker 		printf("%s --srh-last-entry-gt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LAST_GT) ? " !" : "",
406*a71a9546SAutomerger Merge Worker 			srhinfo->last_entry);
407*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LAST_LT)
408*a71a9546SAutomerger Merge Worker 		printf("%s --srh-last-entry-lt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LAST_LT) ? " !" : "",
409*a71a9546SAutomerger Merge Worker 			srhinfo->last_entry);
410*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_TAG)
411*a71a9546SAutomerger Merge Worker 		printf("%s --srh-tag %u", (srhinfo->mt_invflags & IP6T_SRH_INV_TAG) ? " !" : "",
412*a71a9546SAutomerger Merge Worker 			srhinfo->tag);
413*a71a9546SAutomerger Merge Worker }
414*a71a9546SAutomerger Merge Worker 
srh1_save(const void * ip,const struct xt_entry_match * match)415*a71a9546SAutomerger Merge Worker static void srh1_save(const void *ip, const struct xt_entry_match *match)
416*a71a9546SAutomerger Merge Worker {
417*a71a9546SAutomerger Merge Worker 	const struct ip6t_srh1 *srhinfo = (struct ip6t_srh1 *)match->data;
418*a71a9546SAutomerger Merge Worker 
419*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_NEXTHDR)
420*a71a9546SAutomerger Merge Worker 		printf("%s --srh-next-hdr %u", (srhinfo->mt_invflags & IP6T_SRH_INV_NEXTHDR) ? " !" : "",
421*a71a9546SAutomerger Merge Worker 			srhinfo->next_hdr);
422*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LEN_EQ)
423*a71a9546SAutomerger Merge Worker 		printf("%s --srh-hdr-len-eq %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LEN_EQ) ? " !" : "",
424*a71a9546SAutomerger Merge Worker 			srhinfo->hdr_len);
425*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LEN_GT)
426*a71a9546SAutomerger Merge Worker 		printf("%s --srh-hdr-len-gt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LEN_GT) ? " !" : "",
427*a71a9546SAutomerger Merge Worker 			srhinfo->hdr_len);
428*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LEN_LT)
429*a71a9546SAutomerger Merge Worker 		printf("%s --srh-hdr-len-lt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LEN_LT) ? " !" : "",
430*a71a9546SAutomerger Merge Worker 			srhinfo->hdr_len);
431*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_SEGS_EQ)
432*a71a9546SAutomerger Merge Worker 		printf("%s --srh-segs-left-eq %u", (srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_EQ) ? " !" : "",
433*a71a9546SAutomerger Merge Worker 			srhinfo->segs_left);
434*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_SEGS_GT)
435*a71a9546SAutomerger Merge Worker 		printf("%s --srh-segs-left-gt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_GT) ? " !" : "",
436*a71a9546SAutomerger Merge Worker 			srhinfo->segs_left);
437*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_SEGS_LT)
438*a71a9546SAutomerger Merge Worker 		printf("%s --srh-segs-left-lt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_LT) ? " !" : "",
439*a71a9546SAutomerger Merge Worker 			srhinfo->segs_left);
440*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LAST_EQ)
441*a71a9546SAutomerger Merge Worker 		printf("%s --srh-last-entry-eq %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LAST_EQ) ? " !" : "",
442*a71a9546SAutomerger Merge Worker 			srhinfo->last_entry);
443*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LAST_GT)
444*a71a9546SAutomerger Merge Worker 		printf("%s --srh-last-entry-gt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LAST_GT) ? " !" : "",
445*a71a9546SAutomerger Merge Worker 			srhinfo->last_entry);
446*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LAST_LT)
447*a71a9546SAutomerger Merge Worker 		printf("%s --srh-last-entry-lt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LAST_LT) ? " !" : "",
448*a71a9546SAutomerger Merge Worker 			srhinfo->last_entry);
449*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_TAG)
450*a71a9546SAutomerger Merge Worker 		printf("%s --srh-tag %u", (srhinfo->mt_invflags & IP6T_SRH_INV_TAG) ? " !" : "",
451*a71a9546SAutomerger Merge Worker 			srhinfo->tag);
452*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_PSID)
453*a71a9546SAutomerger Merge Worker 		printf("%s --srh-psid %s/%u", srhinfo->mt_invflags & IP6T_SRH_INV_PSID ? " !" : "",
454*a71a9546SAutomerger Merge Worker 			xtables_ip6addr_to_numeric(&srhinfo->psid_addr),
455*a71a9546SAutomerger Merge Worker 			xtables_ip6mask_to_cidr(&srhinfo->psid_msk));
456*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_NSID)
457*a71a9546SAutomerger Merge Worker 		printf("%s --srh-nsid %s/%u", srhinfo->mt_invflags & IP6T_SRH_INV_NSID ? " !" : "",
458*a71a9546SAutomerger Merge Worker 			xtables_ip6addr_to_numeric(&srhinfo->nsid_addr),
459*a71a9546SAutomerger Merge Worker 			xtables_ip6mask_to_cidr(&srhinfo->nsid_msk));
460*a71a9546SAutomerger Merge Worker 	if (srhinfo->mt_flags & IP6T_SRH_LSID)
461*a71a9546SAutomerger Merge Worker 		printf("%s --srh-lsid %s/%u", srhinfo->mt_invflags & IP6T_SRH_INV_LSID ? " !" : "",
462*a71a9546SAutomerger Merge Worker 			xtables_ip6addr_to_numeric(&srhinfo->lsid_addr),
463*a71a9546SAutomerger Merge Worker 			xtables_ip6mask_to_cidr(&srhinfo->lsid_msk));
464*a71a9546SAutomerger Merge Worker }
465*a71a9546SAutomerger Merge Worker 
466*a71a9546SAutomerger Merge Worker static struct xtables_match srh_mt6_reg[] = {
467*a71a9546SAutomerger Merge Worker 	{
468*a71a9546SAutomerger Merge Worker 		.name		= "srh",
469*a71a9546SAutomerger Merge Worker 		.version	= XTABLES_VERSION,
470*a71a9546SAutomerger Merge Worker 		.revision	= 0,
471*a71a9546SAutomerger Merge Worker 		.family		= NFPROTO_IPV6,
472*a71a9546SAutomerger Merge Worker 		.size		= XT_ALIGN(sizeof(struct ip6t_srh)),
473*a71a9546SAutomerger Merge Worker 		.userspacesize	= XT_ALIGN(sizeof(struct ip6t_srh)),
474*a71a9546SAutomerger Merge Worker 		.help		= srh_help,
475*a71a9546SAutomerger Merge Worker 		.init		= srh_init,
476*a71a9546SAutomerger Merge Worker 		.print		= srh_print,
477*a71a9546SAutomerger Merge Worker 		.save		= srh_save,
478*a71a9546SAutomerger Merge Worker 		.x6_parse	= srh_parse,
479*a71a9546SAutomerger Merge Worker 		.x6_options	= srh_opts,
480*a71a9546SAutomerger Merge Worker 	},
481*a71a9546SAutomerger Merge Worker 	{
482*a71a9546SAutomerger Merge Worker 		.name		= "srh",
483*a71a9546SAutomerger Merge Worker 		.version	= XTABLES_VERSION,
484*a71a9546SAutomerger Merge Worker 		.revision	= 1,
485*a71a9546SAutomerger Merge Worker 		.family		= NFPROTO_IPV6,
486*a71a9546SAutomerger Merge Worker 		.size		= XT_ALIGN(sizeof(struct ip6t_srh1)),
487*a71a9546SAutomerger Merge Worker 		.userspacesize	= XT_ALIGN(sizeof(struct ip6t_srh1)),
488*a71a9546SAutomerger Merge Worker 		.help		= srh_help,
489*a71a9546SAutomerger Merge Worker 		.init		= srh1_init,
490*a71a9546SAutomerger Merge Worker 		.print		= srh1_print,
491*a71a9546SAutomerger Merge Worker 		.save		= srh1_save,
492*a71a9546SAutomerger Merge Worker 		.x6_parse	= srh1_parse,
493*a71a9546SAutomerger Merge Worker 		.x6_options	= srh1_opts,
494*a71a9546SAutomerger Merge Worker 	}
495*a71a9546SAutomerger Merge Worker };
496*a71a9546SAutomerger Merge Worker 
497*a71a9546SAutomerger Merge Worker void
_init(void)498*a71a9546SAutomerger Merge Worker _init(void)
499*a71a9546SAutomerger Merge Worker {
500*a71a9546SAutomerger Merge Worker 	xtables_register_matches(srh_mt6_reg, ARRAY_SIZE(srh_mt6_reg));
501*a71a9546SAutomerger Merge Worker }
502