ebt_802_3.c 1.8 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 * 802_3
 *
 * Author:
 * Chris Vitale csv@bluetail.com
 *
 * May 2003
 * 
 */

#include <linux/netfilter_bridge/ebtables.h>
#include <linux/netfilter_bridge/ebt_802_3.h>
#include <linux/module.h>

static int ebt_filter_802_3(const struct sk_buff *skb, const struct net_device *in,
   const struct net_device *out, const void *data, unsigned int datalen)
{
	struct ebt_802_3_info *info = (struct ebt_802_3_info *)data;
	struct ebt_802_3_hdr *hdr = ebt_802_3_hdr(skb);
A
Al Viro 已提交
20
	__be16 type = hdr->llc.ui.ctrl & IS_UI ? hdr->llc.ui.type : hdr->llc.ni.type;
L
Linus Torvalds 已提交
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

	if (info->bitmask & EBT_802_3_SAP) {
		if (FWINV(info->sap != hdr->llc.ui.ssap, EBT_802_3_SAP)) 
				return EBT_NOMATCH;
		if (FWINV(info->sap != hdr->llc.ui.dsap, EBT_802_3_SAP))
				return EBT_NOMATCH;
	}

	if (info->bitmask & EBT_802_3_TYPE) {
		if (!(hdr->llc.ui.dsap == CHECK_TYPE && hdr->llc.ui.ssap == CHECK_TYPE))
			return EBT_NOMATCH;
		if (FWINV(info->type != type, EBT_802_3_TYPE)) 
			return EBT_NOMATCH;
	}

	return EBT_MATCH;
}

static struct ebt_match filter_802_3;
static int ebt_802_3_check(const char *tablename, unsigned int hookmask,
   const struct ebt_entry *e, void *data, unsigned int datalen)
{
	struct ebt_802_3_info *info = (struct ebt_802_3_info *)data;

	if (datalen < sizeof(struct ebt_802_3_info))
		return -EINVAL;
	if (info->bitmask & ~EBT_802_3_MASK || info->invflags & ~EBT_802_3_MASK)
		return -EINVAL;

	return 0;
}

static struct ebt_match filter_802_3 =
{
	.name		= EBT_802_3_MATCH,
	.match		= ebt_filter_802_3,
	.check		= ebt_802_3_check,
	.me		= THIS_MODULE,
};

61
static int __init ebt_802_3_init(void)
L
Linus Torvalds 已提交
62 63 64 65
{
	return ebt_register_match(&filter_802_3);
}

66
static void __exit ebt_802_3_fini(void)
L
Linus Torvalds 已提交
67 68 69 70
{
	ebt_unregister_match(&filter_802_3);
}

71 72
module_init(ebt_802_3_init);
module_exit(ebt_802_3_fini);
L
Linus Torvalds 已提交
73
MODULE_LICENSE("GPL");