xref: /openbmc/linux/net/bridge/netfilter/ebt_802_3.c (revision 85cfbc25)
109c434b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * 802_3
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * Author:
61da177e4SLinus Torvalds  * Chris Vitale csv@bluetail.com
71da177e4SLinus Torvalds  *
81da177e4SLinus Torvalds  * May 2003
91da177e4SLinus Torvalds  *
101da177e4SLinus Torvalds  */
1118219d3fSJan Engelhardt #include <linux/module.h>
1218219d3fSJan Engelhardt #include <linux/netfilter/x_tables.h>
131da177e4SLinus Torvalds #include <linux/netfilter_bridge/ebtables.h>
1485cfbc25SJeremy Sowden #include <linux/skbuff.h>
1585cfbc25SJeremy Sowden #include <uapi/linux/netfilter_bridge/ebt_802_3.h>
1685cfbc25SJeremy Sowden 
ebt_802_3_hdr(const struct sk_buff * skb)1785cfbc25SJeremy Sowden static struct ebt_802_3_hdr *ebt_802_3_hdr(const struct sk_buff *skb)
1885cfbc25SJeremy Sowden {
1985cfbc25SJeremy Sowden 	return (struct ebt_802_3_hdr *)skb_mac_header(skb);
2085cfbc25SJeremy Sowden }
211da177e4SLinus Torvalds 
222d06d4a5SJan Engelhardt static bool
ebt_802_3_mt(const struct sk_buff * skb,struct xt_action_param * par)2362fc8051SJan Engelhardt ebt_802_3_mt(const struct sk_buff *skb, struct xt_action_param *par)
241da177e4SLinus Torvalds {
25f7108a20SJan Engelhardt 	const struct ebt_802_3_info *info = par->matchinfo;
26abfdf1c4SJan Engelhardt 	const struct ebt_802_3_hdr *hdr = ebt_802_3_hdr(skb);
2747c183faSAl Viro 	__be16 type = hdr->llc.ui.ctrl & IS_UI ? hdr->llc.ui.type : hdr->llc.ni.type;
281da177e4SLinus Torvalds 
291da177e4SLinus Torvalds 	if (info->bitmask & EBT_802_3_SAP) {
30c37a2dfaSJoe Perches 		if (NF_INVF(info, EBT_802_3_SAP, info->sap != hdr->llc.ui.ssap))
318cc784eeSJan Engelhardt 			return false;
32c37a2dfaSJoe Perches 		if (NF_INVF(info, EBT_802_3_SAP, info->sap != hdr->llc.ui.dsap))
338cc784eeSJan Engelhardt 			return false;
341da177e4SLinus Torvalds 	}
351da177e4SLinus Torvalds 
361da177e4SLinus Torvalds 	if (info->bitmask & EBT_802_3_TYPE) {
371da177e4SLinus Torvalds 		if (!(hdr->llc.ui.dsap == CHECK_TYPE && hdr->llc.ui.ssap == CHECK_TYPE))
388cc784eeSJan Engelhardt 			return false;
39c37a2dfaSJoe Perches 		if (NF_INVF(info, EBT_802_3_TYPE, info->type != type))
408cc784eeSJan Engelhardt 			return false;
411da177e4SLinus Torvalds 	}
421da177e4SLinus Torvalds 
438cc784eeSJan Engelhardt 	return true;
441da177e4SLinus Torvalds }
451da177e4SLinus Torvalds 
ebt_802_3_mt_check(const struct xt_mtchk_param * par)46b0f38452SJan Engelhardt static int ebt_802_3_mt_check(const struct xt_mtchk_param *par)
471da177e4SLinus Torvalds {
489b4fce7aSJan Engelhardt 	const struct ebt_802_3_info *info = par->matchinfo;
491da177e4SLinus Torvalds 
501da177e4SLinus Torvalds 	if (info->bitmask & ~EBT_802_3_MASK || info->invflags & ~EBT_802_3_MASK)
51bd414ee6SJan Engelhardt 		return -EINVAL;
521da177e4SLinus Torvalds 
53bd414ee6SJan Engelhardt 	return 0;
541da177e4SLinus Torvalds }
551da177e4SLinus Torvalds 
56043ef46cSJan Engelhardt static struct xt_match ebt_802_3_mt_reg __read_mostly = {
57043ef46cSJan Engelhardt 	.name		= "802_3",
58001a18d3SJan Engelhardt 	.revision	= 0,
59001a18d3SJan Engelhardt 	.family		= NFPROTO_BRIDGE,
602d06d4a5SJan Engelhardt 	.match		= ebt_802_3_mt,
612d06d4a5SJan Engelhardt 	.checkentry	= ebt_802_3_mt_check,
62fc0e3df4SFlorian Westphal 	.matchsize	= sizeof(struct ebt_802_3_info),
631da177e4SLinus Torvalds 	.me		= THIS_MODULE,
641da177e4SLinus Torvalds };
651da177e4SLinus Torvalds 
ebt_802_3_init(void)6665b4b4e8SAndrew Morton static int __init ebt_802_3_init(void)
671da177e4SLinus Torvalds {
68043ef46cSJan Engelhardt 	return xt_register_match(&ebt_802_3_mt_reg);
691da177e4SLinus Torvalds }
701da177e4SLinus Torvalds 
ebt_802_3_fini(void)7165b4b4e8SAndrew Morton static void __exit ebt_802_3_fini(void)
721da177e4SLinus Torvalds {
73043ef46cSJan Engelhardt 	xt_unregister_match(&ebt_802_3_mt_reg);
741da177e4SLinus Torvalds }
751da177e4SLinus Torvalds 
7665b4b4e8SAndrew Morton module_init(ebt_802_3_init);
7765b4b4e8SAndrew Morton module_exit(ebt_802_3_fini);
78f776c4cdSJan Engelhardt MODULE_DESCRIPTION("Ebtables: DSAP/SSAP field and SNAP type matching");
791da177e4SLinus Torvalds MODULE_LICENSE("GPL");
80