Blame extensions/libip6t_srh.c

Packit 7b22a4
/* Shared library to add Segment Routing Header (SRH) matching support.
Packit 7b22a4
 *
Packit 7b22a4
 * Author:
Packit 7b22a4
 *       Ahmed Abdelsalam       <amsalam20@gmail.com>
Packit 7b22a4
 */
Packit 7b22a4
Packit 7b22a4
#include <stdio.h>
Packit 7b22a4
#include <xtables.h>
Packit 7b22a4
#include <linux/netfilter_ipv6/ip6t_srh.h>
Packit 7b22a4
#include <string.h>
Packit 7b22a4
Packit 7b22a4
/* srh command-line options */
Packit 7b22a4
enum {
Packit 7b22a4
	O_SRH_NEXTHDR,
Packit 7b22a4
	O_SRH_LEN_EQ,
Packit 7b22a4
	O_SRH_LEN_GT,
Packit 7b22a4
	O_SRH_LEN_LT,
Packit 7b22a4
	O_SRH_SEGS_EQ,
Packit 7b22a4
	O_SRH_SEGS_GT,
Packit 7b22a4
	O_SRH_SEGS_LT,
Packit 7b22a4
	O_SRH_LAST_EQ,
Packit 7b22a4
	O_SRH_LAST_GT,
Packit 7b22a4
	O_SRH_LAST_LT,
Packit 7b22a4
	O_SRH_TAG,
Packit 7b22a4
	O_SRH_PSID,
Packit 7b22a4
	O_SRH_NSID,
Packit 7b22a4
	O_SRH_LSID,
Packit 7b22a4
};
Packit 7b22a4
Packit 7b22a4
static void srh_help(void)
Packit 7b22a4
{
Packit 7b22a4
	printf(
Packit 7b22a4
"srh match options:\n"
Packit 7b22a4
"[!] --srh-next-hdr		next-hdr        Next Header value of SRH\n"
Packit 7b22a4
"[!] --srh-hdr-len-eq		hdr_len         Hdr Ext Len value of SRH\n"
Packit 7b22a4
"[!] --srh-hdr-len-gt		hdr_len         Hdr Ext Len value of SRH\n"
Packit 7b22a4
"[!] --srh-hdr-len-lt		hdr_len         Hdr Ext Len value of SRH\n"
Packit 7b22a4
"[!] --srh-segs-left-eq		segs_left       Segments Left value of SRH\n"
Packit 7b22a4
"[!] --srh-segs-left-gt		segs_left       Segments Left value of SRH\n"
Packit 7b22a4
"[!] --srh-segs-left-lt		segs_left       Segments Left value of SRH\n"
Packit 7b22a4
"[!] --srh-last-entry-eq 	last_entry      Last Entry value of SRH\n"
Packit 7b22a4
"[!] --srh-last-entry-gt 	last_entry      Last Entry value of SRH\n"
Packit 7b22a4
"[!] --srh-last-entry-lt 	last_entry      Last Entry value of SRH\n"
Packit 7b22a4
"[!] --srh-tag			tag             Tag value of SRH\n"
Packit 7b22a4
"[!] --srh-psid			addr[/mask]	SRH previous SID\n"
Packit 7b22a4
"[!] --srh-nsid			addr[/mask]	SRH next SID\n"
Packit 7b22a4
"[!] --srh-lsid			addr[/mask]	SRH Last SID\n");
Packit 7b22a4
}
Packit 7b22a4
Packit 7b22a4
#define s struct ip6t_srh
Packit 7b22a4
static const struct xt_option_entry srh_opts[] = {
Packit 7b22a4
	{ .name = "srh-next-hdr", .id = O_SRH_NEXTHDR, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, next_hdr)},
Packit 7b22a4
	{ .name = "srh-hdr-len-eq", .id = O_SRH_LEN_EQ, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, hdr_len)},
Packit 7b22a4
	{ .name = "srh-hdr-len-gt", .id = O_SRH_LEN_GT, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, hdr_len)},
Packit 7b22a4
	{ .name = "srh-hdr-len-lt", .id = O_SRH_LEN_LT, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, hdr_len)},
Packit 7b22a4
	{ .name = "srh-segs-left-eq", .id = O_SRH_SEGS_EQ, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, segs_left)},
Packit 7b22a4
	{ .name = "srh-segs-left-gt", .id = O_SRH_SEGS_GT, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, segs_left)},
Packit 7b22a4
	{ .name = "srh-segs-left-lt", .id = O_SRH_SEGS_LT, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, segs_left)},
Packit 7b22a4
	{ .name = "srh-last-entry-eq", .id = O_SRH_LAST_EQ, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, last_entry)},
Packit 7b22a4
	{ .name = "srh-last-entry-gt", .id = O_SRH_LAST_GT, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, last_entry)},
Packit 7b22a4
	{ .name = "srh-last-entry-lt", .id = O_SRH_LAST_LT, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, last_entry)},
Packit 7b22a4
	{ .name = "srh-tag", .id = O_SRH_TAG, .type = XTTYPE_UINT16,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, tag)},
Packit 7b22a4
	{ }
Packit 7b22a4
};
Packit 7b22a4
#undef s
Packit 7b22a4
Packit 7b22a4
#define s struct ip6t_srh1
Packit 7b22a4
static const struct xt_option_entry srh1_opts[] = {
Packit 7b22a4
	{ .name = "srh-next-hdr", .id = O_SRH_NEXTHDR, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, next_hdr)},
Packit 7b22a4
	{ .name = "srh-hdr-len-eq", .id = O_SRH_LEN_EQ, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, hdr_len)},
Packit 7b22a4
	{ .name = "srh-hdr-len-gt", .id = O_SRH_LEN_GT, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, hdr_len)},
Packit 7b22a4
	{ .name = "srh-hdr-len-lt", .id = O_SRH_LEN_LT, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, hdr_len)},
Packit 7b22a4
	{ .name = "srh-segs-left-eq", .id = O_SRH_SEGS_EQ, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, segs_left)},
Packit 7b22a4
	{ .name = "srh-segs-left-gt", .id = O_SRH_SEGS_GT, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, segs_left)},
Packit 7b22a4
	{ .name = "srh-segs-left-lt", .id = O_SRH_SEGS_LT, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, segs_left)},
Packit 7b22a4
	{ .name = "srh-last-entry-eq", .id = O_SRH_LAST_EQ, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, last_entry)},
Packit 7b22a4
	{ .name = "srh-last-entry-gt", .id = O_SRH_LAST_GT, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, last_entry)},
Packit 7b22a4
	{ .name = "srh-last-entry-lt", .id = O_SRH_LAST_LT, .type = XTTYPE_UINT8,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, last_entry)},
Packit 7b22a4
	{ .name = "srh-tag", .id = O_SRH_TAG, .type = XTTYPE_UINT16,
Packit 7b22a4
	.flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, tag)},
Packit 7b22a4
	{ .name = "srh-psid", .id = O_SRH_PSID, .type = XTTYPE_HOSTMASK,
Packit 7b22a4
	.flags = XTOPT_INVERT},
Packit 7b22a4
	{ .name = "srh-nsid", .id = O_SRH_NSID, .type = XTTYPE_HOSTMASK,
Packit 7b22a4
	.flags = XTOPT_INVERT},
Packit 7b22a4
	{ .name = "srh-lsid", .id = O_SRH_LSID, .type = XTTYPE_HOSTMASK,
Packit 7b22a4
	.flags = XTOPT_INVERT},
Packit 7b22a4
	{ }
Packit 7b22a4
};
Packit 7b22a4
#undef s
Packit 7b22a4
Packit 7b22a4
static void srh_init(struct xt_entry_match *m)
Packit 7b22a4
{
Packit 7b22a4
	struct ip6t_srh *srhinfo = (void *)m->data;
Packit 7b22a4
Packit 7b22a4
	srhinfo->mt_flags = 0;
Packit 7b22a4
	srhinfo->mt_invflags = 0;
Packit 7b22a4
}
Packit 7b22a4
Packit 7b22a4
static void srh1_init(struct xt_entry_match *m)
Packit 7b22a4
{
Packit 7b22a4
	struct ip6t_srh1 *srhinfo = (void *)m->data;
Packit 7b22a4
Packit 7b22a4
	srhinfo->mt_flags = 0;
Packit 7b22a4
	srhinfo->mt_invflags = 0;
Packit 7b22a4
	memset(srhinfo->psid_addr.s6_addr, 0, sizeof(srhinfo->psid_addr.s6_addr));
Packit 7b22a4
	memset(srhinfo->nsid_addr.s6_addr, 0, sizeof(srhinfo->nsid_addr.s6_addr));
Packit 7b22a4
	memset(srhinfo->lsid_addr.s6_addr, 0, sizeof(srhinfo->lsid_addr.s6_addr));
Packit 7b22a4
	memset(srhinfo->psid_msk.s6_addr, 0, sizeof(srhinfo->psid_msk.s6_addr));
Packit 7b22a4
	memset(srhinfo->nsid_msk.s6_addr, 0, sizeof(srhinfo->nsid_msk.s6_addr));
Packit 7b22a4
	memset(srhinfo->lsid_msk.s6_addr, 0, sizeof(srhinfo->lsid_msk.s6_addr));
Packit 7b22a4
}
Packit 7b22a4
Packit 7b22a4
static void srh_parse(struct xt_option_call *cb)
Packit 7b22a4
{
Packit 7b22a4
	struct ip6t_srh *srhinfo = cb->data;
Packit 7b22a4
Packit 7b22a4
	xtables_option_parse(cb);
Packit 7b22a4
	switch (cb->entry->id) {
Packit 7b22a4
	case O_SRH_NEXTHDR:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_NEXTHDR;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_NEXTHDR;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_LEN_EQ:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_LEN_EQ;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_LEN_EQ;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_LEN_GT:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_LEN_GT;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_LEN_GT;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_LEN_LT:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_LEN_LT;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_LEN_LT;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_SEGS_EQ:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_SEGS_EQ;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_SEGS_EQ;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_SEGS_GT:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_SEGS_GT;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_SEGS_GT;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_SEGS_LT:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_SEGS_LT;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_SEGS_LT;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_LAST_EQ:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_LAST_EQ;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_LAST_EQ;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_LAST_GT:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_LAST_GT;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_LAST_GT;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_LAST_LT:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_LAST_LT;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_LAST_LT;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_TAG:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_TAG;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_TAG;
Packit 7b22a4
		break;
Packit 7b22a4
	}
Packit 7b22a4
}
Packit 7b22a4
Packit 7b22a4
static void srh1_parse(struct xt_option_call *cb)
Packit 7b22a4
{
Packit 7b22a4
	struct ip6t_srh1 *srhinfo = cb->data;
Packit 7b22a4
Packit 7b22a4
	xtables_option_parse(cb);
Packit 7b22a4
	switch (cb->entry->id) {
Packit 7b22a4
	case O_SRH_NEXTHDR:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_NEXTHDR;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_NEXTHDR;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_LEN_EQ:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_LEN_EQ;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_LEN_EQ;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_LEN_GT:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_LEN_GT;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_LEN_GT;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_LEN_LT:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_LEN_LT;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_LEN_LT;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_SEGS_EQ:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_SEGS_EQ;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_SEGS_EQ;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_SEGS_GT:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_SEGS_GT;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_SEGS_GT;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_SEGS_LT:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_SEGS_LT;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_SEGS_LT;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_LAST_EQ:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_LAST_EQ;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_LAST_EQ;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_LAST_GT:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_LAST_GT;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_LAST_GT;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_LAST_LT:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_LAST_LT;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_LAST_LT;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_TAG:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_TAG;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_TAG;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_PSID:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_PSID;
Packit 7b22a4
		srhinfo->psid_addr = cb->val.haddr.in6;
Packit 7b22a4
		srhinfo->psid_msk  = cb->val.hmask.in6;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_PSID;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_NSID:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_NSID;
Packit 7b22a4
		srhinfo->nsid_addr = cb->val.haddr.in6;
Packit 7b22a4
		srhinfo->nsid_msk  = cb->val.hmask.in6;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_NSID;
Packit 7b22a4
		break;
Packit 7b22a4
	case O_SRH_LSID:
Packit 7b22a4
		srhinfo->mt_flags |= IP6T_SRH_LSID;
Packit 7b22a4
		srhinfo->lsid_addr = cb->val.haddr.in6;
Packit 7b22a4
		srhinfo->lsid_msk  = cb->val.hmask.in6;
Packit 7b22a4
		if (cb->invert)
Packit 7b22a4
			srhinfo->mt_invflags |= IP6T_SRH_INV_LSID;
Packit 7b22a4
		break;
Packit 7b22a4
	}
Packit 7b22a4
}
Packit 7b22a4
Packit 7b22a4
static void srh_print(const void *ip, const struct xt_entry_match *match,
Packit 7b22a4
			int numeric)
Packit 7b22a4
{
Packit 7b22a4
	const struct ip6t_srh *srhinfo = (struct ip6t_srh *)match->data;
Packit 7b22a4
Packit 7b22a4
	printf(" srh");
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_NEXTHDR)
Packit 7b22a4
		printf(" next-hdr:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_NEXTHDR ? "!" : "",
Packit 7b22a4
			srhinfo->next_hdr);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LEN_EQ)
Packit 7b22a4
		printf(" hdr-len-eq:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LEN_EQ ? "!" : "",
Packit 7b22a4
			srhinfo->hdr_len);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LEN_GT)
Packit 7b22a4
		printf(" hdr-len-gt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LEN_GT ? "!" : "",
Packit 7b22a4
			srhinfo->hdr_len);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LEN_LT)
Packit 7b22a4
		printf(" hdr-len-lt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LEN_LT ? "!" : "",
Packit 7b22a4
			srhinfo->hdr_len);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_SEGS_EQ)
Packit 7b22a4
		printf(" segs-left-eq:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_EQ ? "!" : "",
Packit 7b22a4
			srhinfo->segs_left);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_SEGS_GT)
Packit 7b22a4
		printf(" segs-left-gt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_GT ? "!" : "",
Packit 7b22a4
			srhinfo->segs_left);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_SEGS_LT)
Packit 7b22a4
		printf(" segs-left-lt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_LT ? "!" : "",
Packit 7b22a4
			srhinfo->segs_left);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LAST_EQ)
Packit 7b22a4
		printf(" last-entry-eq:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LAST_EQ ? "!" : "",
Packit 7b22a4
			srhinfo->last_entry);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LAST_GT)
Packit 7b22a4
		printf(" last-entry-gt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LAST_GT ? "!" : "",
Packit 7b22a4
			srhinfo->last_entry);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LAST_LT)
Packit 7b22a4
		printf(" last-entry-lt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LAST_LT ? "!" : "",
Packit 7b22a4
			srhinfo->last_entry);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_TAG)
Packit 7b22a4
		printf(" tag:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_TAG ? "!" : "",
Packit 7b22a4
			srhinfo->tag);
Packit 7b22a4
}
Packit 7b22a4
Packit 7b22a4
static void srh1_print(const void *ip, const struct xt_entry_match *match, int numeric)
Packit 7b22a4
{
Packit 7b22a4
	const struct ip6t_srh1 *srhinfo = (struct ip6t_srh1 *)match->data;
Packit 7b22a4
Packit 7b22a4
	printf(" srh");
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_NEXTHDR)
Packit 7b22a4
		printf(" next-hdr:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_NEXTHDR ? "!" : "",
Packit 7b22a4
			srhinfo->next_hdr);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LEN_EQ)
Packit 7b22a4
		printf(" hdr-len-eq:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LEN_EQ ? "!" : "",
Packit 7b22a4
			srhinfo->hdr_len);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LEN_GT)
Packit 7b22a4
		printf(" hdr-len-gt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LEN_GT ? "!" : "",
Packit 7b22a4
			srhinfo->hdr_len);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LEN_LT)
Packit 7b22a4
		printf(" hdr-len-lt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LEN_LT ? "!" : "",
Packit 7b22a4
			srhinfo->hdr_len);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_SEGS_EQ)
Packit 7b22a4
		printf(" segs-left-eq:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_EQ ? "!" : "",
Packit 7b22a4
			srhinfo->segs_left);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_SEGS_GT)
Packit 7b22a4
		printf(" segs-left-gt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_GT ? "!" : "",
Packit 7b22a4
			srhinfo->segs_left);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_SEGS_LT)
Packit 7b22a4
		printf(" segs-left-lt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_LT ? "!" : "",
Packit 7b22a4
			srhinfo->segs_left);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LAST_EQ)
Packit 7b22a4
		printf(" last-entry-eq:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LAST_EQ ? "!" : "",
Packit 7b22a4
			srhinfo->last_entry);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LAST_GT)
Packit 7b22a4
		printf(" last-entry-gt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LAST_GT ? "!" : "",
Packit 7b22a4
			srhinfo->last_entry);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LAST_LT)
Packit 7b22a4
		printf(" last-entry-lt:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_LAST_LT ? "!" : "",
Packit 7b22a4
			srhinfo->last_entry);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_TAG)
Packit 7b22a4
		printf(" tag:%s%d", srhinfo->mt_invflags & IP6T_SRH_INV_TAG ? "!" : "",
Packit 7b22a4
			srhinfo->tag);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_PSID)
Packit 7b22a4
		printf(" psid %s %s/%u", srhinfo->mt_invflags & IP6T_SRH_INV_PSID ? "!" : "",
Packit 7b22a4
			xtables_ip6addr_to_numeric(&srhinfo->psid_addr),
Packit 7b22a4
			xtables_ip6mask_to_cidr(&srhinfo->psid_msk));
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_NSID)
Packit 7b22a4
		printf(" nsid %s %s/%u", srhinfo->mt_invflags & IP6T_SRH_INV_NSID ? "!" : "",
Packit 7b22a4
			xtables_ip6addr_to_numeric(&srhinfo->nsid_addr),
Packit 7b22a4
			xtables_ip6mask_to_cidr(&srhinfo->nsid_msk));
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LSID)
Packit 7b22a4
		printf(" lsid %s %s/%u", srhinfo->mt_invflags & IP6T_SRH_INV_LSID ? "!" : "",
Packit 7b22a4
			xtables_ip6addr_to_numeric(&srhinfo->lsid_addr),
Packit 7b22a4
			xtables_ip6mask_to_cidr(&srhinfo->lsid_msk));
Packit 7b22a4
}
Packit 7b22a4
Packit 7b22a4
static void srh_save(const void *ip, const struct xt_entry_match *match)
Packit 7b22a4
{
Packit 7b22a4
	const struct ip6t_srh *srhinfo = (struct ip6t_srh *)match->data;
Packit 7b22a4
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_NEXTHDR)
Packit 7b22a4
		printf("%s --srh-next-hdr %u", (srhinfo->mt_invflags & IP6T_SRH_INV_NEXTHDR) ? " !" : "",
Packit 7b22a4
			srhinfo->next_hdr);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LEN_EQ)
Packit 7b22a4
		printf("%s --srh-hdr-len-eq %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LEN_EQ) ? " !" : "",
Packit 7b22a4
			srhinfo->hdr_len);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LEN_GT)
Packit 7b22a4
		printf("%s --srh-hdr-len-gt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LEN_GT) ? " !" : "",
Packit 7b22a4
			srhinfo->hdr_len);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LEN_LT)
Packit 7b22a4
		printf("%s --srh-hdr-len-lt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LEN_LT) ? " !" : "",
Packit 7b22a4
			srhinfo->hdr_len);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_SEGS_EQ)
Packit 7b22a4
		printf("%s --srh-segs-left-eq %u", (srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_EQ) ? " !" : "",
Packit 7b22a4
			srhinfo->segs_left);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_SEGS_GT)
Packit 7b22a4
		printf("%s --srh-segs-left-gt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_GT) ? " !" : "",
Packit 7b22a4
			srhinfo->segs_left);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_SEGS_LT)
Packit 7b22a4
		printf("%s --srh-segs-left-lt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_LT) ? " !" : "",
Packit 7b22a4
			srhinfo->segs_left);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LAST_EQ)
Packit 7b22a4
		printf("%s --srh-last-entry-eq %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LAST_EQ) ? " !" : "",
Packit 7b22a4
			srhinfo->last_entry);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LAST_GT)
Packit 7b22a4
		printf("%s --srh-last-entry-gt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LAST_GT) ? " !" : "",
Packit 7b22a4
			srhinfo->last_entry);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LAST_LT)
Packit 7b22a4
		printf("%s --srh-last-entry-lt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LAST_LT) ? " !" : "",
Packit 7b22a4
			srhinfo->last_entry);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_TAG)
Packit 7b22a4
		printf("%s --srh-tag %u", (srhinfo->mt_invflags & IP6T_SRH_INV_TAG) ? " !" : "",
Packit 7b22a4
			srhinfo->tag);
Packit 7b22a4
}
Packit 7b22a4
Packit 7b22a4
static void srh1_save(const void *ip, const struct xt_entry_match *match)
Packit 7b22a4
{
Packit 7b22a4
	const struct ip6t_srh1 *srhinfo = (struct ip6t_srh1 *)match->data;
Packit 7b22a4
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_NEXTHDR)
Packit 7b22a4
		printf("%s --srh-next-hdr %u", (srhinfo->mt_invflags & IP6T_SRH_INV_NEXTHDR) ? " !" : "",
Packit 7b22a4
			srhinfo->next_hdr);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LEN_EQ)
Packit 7b22a4
		printf("%s --srh-hdr-len-eq %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LEN_EQ) ? " !" : "",
Packit 7b22a4
			srhinfo->hdr_len);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LEN_GT)
Packit 7b22a4
		printf("%s --srh-hdr-len-gt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LEN_GT) ? " !" : "",
Packit 7b22a4
			srhinfo->hdr_len);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LEN_LT)
Packit 7b22a4
		printf("%s --srh-hdr-len-lt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LEN_LT) ? " !" : "",
Packit 7b22a4
			srhinfo->hdr_len);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_SEGS_EQ)
Packit 7b22a4
		printf("%s --srh-segs-left-eq %u", (srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_EQ) ? " !" : "",
Packit 7b22a4
			srhinfo->segs_left);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_SEGS_GT)
Packit 7b22a4
		printf("%s --srh-segs-left-gt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_GT) ? " !" : "",
Packit 7b22a4
			srhinfo->segs_left);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_SEGS_LT)
Packit 7b22a4
		printf("%s --srh-segs-left-lt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_SEGS_LT) ? " !" : "",
Packit 7b22a4
			srhinfo->segs_left);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LAST_EQ)
Packit 7b22a4
		printf("%s --srh-last-entry-eq %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LAST_EQ) ? " !" : "",
Packit 7b22a4
			srhinfo->last_entry);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LAST_GT)
Packit 7b22a4
		printf("%s --srh-last-entry-gt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LAST_GT) ? " !" : "",
Packit 7b22a4
			srhinfo->last_entry);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LAST_LT)
Packit 7b22a4
		printf("%s --srh-last-entry-lt %u", (srhinfo->mt_invflags & IP6T_SRH_INV_LAST_LT) ? " !" : "",
Packit 7b22a4
			srhinfo->last_entry);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_TAG)
Packit 7b22a4
		printf("%s --srh-tag %u", (srhinfo->mt_invflags & IP6T_SRH_INV_TAG) ? " !" : "",
Packit 7b22a4
			srhinfo->tag);
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_PSID)
Packit 7b22a4
		printf("%s --srh-psid %s/%u", srhinfo->mt_invflags & IP6T_SRH_INV_PSID ? " !" : "",
Packit 7b22a4
			xtables_ip6addr_to_numeric(&srhinfo->psid_addr),
Packit 7b22a4
			xtables_ip6mask_to_cidr(&srhinfo->psid_msk));
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_NSID)
Packit 7b22a4
		printf("%s --srh-nsid %s/%u", srhinfo->mt_invflags & IP6T_SRH_INV_NSID ? " !" : "",
Packit 7b22a4
			xtables_ip6addr_to_numeric(&srhinfo->nsid_addr),
Packit 7b22a4
			xtables_ip6mask_to_cidr(&srhinfo->nsid_msk));
Packit 7b22a4
	if (srhinfo->mt_flags & IP6T_SRH_LSID)
Packit 7b22a4
		printf("%s --srh-lsid %s/%u", srhinfo->mt_invflags & IP6T_SRH_INV_LSID ? " !" : "",
Packit 7b22a4
			xtables_ip6addr_to_numeric(&srhinfo->lsid_addr),
Packit 7b22a4
			xtables_ip6mask_to_cidr(&srhinfo->lsid_msk));
Packit 7b22a4
}
Packit 7b22a4
Packit 7b22a4
static struct xtables_match srh_mt6_reg[] = {
Packit 7b22a4
	{
Packit 7b22a4
		.name		= "srh",
Packit 7b22a4
		.version	= XTABLES_VERSION,
Packit 7b22a4
		.revision	= 0,
Packit 7b22a4
		.family		= NFPROTO_IPV6,
Packit 7b22a4
		.size		= XT_ALIGN(sizeof(struct ip6t_srh)),
Packit 7b22a4
		.userspacesize	= XT_ALIGN(sizeof(struct ip6t_srh)),
Packit 7b22a4
		.help		= srh_help,
Packit 7b22a4
		.init		= srh_init,
Packit 7b22a4
		.print		= srh_print,
Packit 7b22a4
		.save		= srh_save,
Packit 7b22a4
		.x6_parse	= srh_parse,
Packit 7b22a4
		.x6_options	= srh_opts,
Packit 7b22a4
	},
Packit 7b22a4
	{
Packit 7b22a4
		.name		= "srh",
Packit 7b22a4
		.version	= XTABLES_VERSION,
Packit 7b22a4
		.revision	= 1,
Packit 7b22a4
		.family		= NFPROTO_IPV6,
Packit 7b22a4
		.size		= XT_ALIGN(sizeof(struct ip6t_srh1)),
Packit 7b22a4
		.userspacesize	= XT_ALIGN(sizeof(struct ip6t_srh1)),
Packit 7b22a4
		.help		= srh_help,
Packit 7b22a4
		.init		= srh1_init,
Packit 7b22a4
		.print		= srh1_print,
Packit 7b22a4
		.save		= srh1_save,
Packit 7b22a4
		.x6_parse	= srh1_parse,
Packit 7b22a4
		.x6_options	= srh1_opts,
Packit 7b22a4
	}
Packit 7b22a4
};
Packit 7b22a4
Packit 7b22a4
void
Packit 7b22a4
_init(void)
Packit 7b22a4
{
Packit 7b22a4
	xtables_register_matches(srh_mt6_reg, ARRAY_SIZE(srh_mt6_reg));
Packit 7b22a4
}