11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * 802_3 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Author: 51da177e4SLinus Torvalds * Chris Vitale csv@bluetail.com 61da177e4SLinus Torvalds * 71da177e4SLinus Torvalds * May 2003 81da177e4SLinus Torvalds * 91da177e4SLinus Torvalds */ 1018219d3fSJan Engelhardt #include <linux/module.h> 1118219d3fSJan Engelhardt #include <linux/netfilter/x_tables.h> 121da177e4SLinus Torvalds #include <linux/netfilter_bridge/ebtables.h> 131da177e4SLinus Torvalds #include <linux/netfilter_bridge/ebt_802_3.h> 141da177e4SLinus Torvalds 152d06d4a5SJan Engelhardt static bool 16f7108a20SJan Engelhardt ebt_802_3_mt(const struct sk_buff *skb, const struct xt_match_param *par) 171da177e4SLinus Torvalds { 18f7108a20SJan Engelhardt const struct ebt_802_3_info *info = par->matchinfo; 19abfdf1c4SJan Engelhardt const struct ebt_802_3_hdr *hdr = ebt_802_3_hdr(skb); 2047c183faSAl Viro __be16 type = hdr->llc.ui.ctrl & IS_UI ? hdr->llc.ui.type : hdr->llc.ni.type; 211da177e4SLinus Torvalds 221da177e4SLinus Torvalds if (info->bitmask & EBT_802_3_SAP) { 231da177e4SLinus Torvalds if (FWINV(info->sap != hdr->llc.ui.ssap, EBT_802_3_SAP)) 248cc784eeSJan Engelhardt return false; 251da177e4SLinus Torvalds if (FWINV(info->sap != hdr->llc.ui.dsap, EBT_802_3_SAP)) 268cc784eeSJan Engelhardt return false; 271da177e4SLinus Torvalds } 281da177e4SLinus Torvalds 291da177e4SLinus Torvalds if (info->bitmask & EBT_802_3_TYPE) { 301da177e4SLinus Torvalds if (!(hdr->llc.ui.dsap == CHECK_TYPE && hdr->llc.ui.ssap == CHECK_TYPE)) 318cc784eeSJan Engelhardt return false; 321da177e4SLinus Torvalds if (FWINV(info->type != type, EBT_802_3_TYPE)) 338cc784eeSJan Engelhardt return false; 341da177e4SLinus Torvalds } 351da177e4SLinus Torvalds 368cc784eeSJan Engelhardt return true; 371da177e4SLinus Torvalds } 381da177e4SLinus Torvalds 39b0f38452SJan Engelhardt static int ebt_802_3_mt_check(const struct xt_mtchk_param *par) 401da177e4SLinus Torvalds { 419b4fce7aSJan Engelhardt const struct ebt_802_3_info *info = par->matchinfo; 421da177e4SLinus Torvalds 431da177e4SLinus Torvalds if (info->bitmask & ~EBT_802_3_MASK || info->invflags & ~EBT_802_3_MASK) 44bd414ee6SJan Engelhardt return -EINVAL; 451da177e4SLinus Torvalds 46bd414ee6SJan Engelhardt return 0; 471da177e4SLinus Torvalds } 481da177e4SLinus Torvalds 49043ef46cSJan Engelhardt static struct xt_match ebt_802_3_mt_reg __read_mostly = { 50043ef46cSJan Engelhardt .name = "802_3", 51001a18d3SJan Engelhardt .revision = 0, 52001a18d3SJan Engelhardt .family = NFPROTO_BRIDGE, 532d06d4a5SJan Engelhardt .match = ebt_802_3_mt, 542d06d4a5SJan Engelhardt .checkentry = ebt_802_3_mt_check, 55fc0e3df4SFlorian Westphal .matchsize = sizeof(struct ebt_802_3_info), 561da177e4SLinus Torvalds .me = THIS_MODULE, 571da177e4SLinus Torvalds }; 581da177e4SLinus Torvalds 5965b4b4e8SAndrew Morton static int __init ebt_802_3_init(void) 601da177e4SLinus Torvalds { 61043ef46cSJan Engelhardt return xt_register_match(&ebt_802_3_mt_reg); 621da177e4SLinus Torvalds } 631da177e4SLinus Torvalds 6465b4b4e8SAndrew Morton static void __exit ebt_802_3_fini(void) 651da177e4SLinus Torvalds { 66043ef46cSJan Engelhardt xt_unregister_match(&ebt_802_3_mt_reg); 671da177e4SLinus Torvalds } 681da177e4SLinus Torvalds 6965b4b4e8SAndrew Morton module_init(ebt_802_3_init); 7065b4b4e8SAndrew Morton module_exit(ebt_802_3_fini); 71f776c4cdSJan Engelhardt MODULE_DESCRIPTION("Ebtables: DSAP/SSAP field and SNAP type matching"); 721da177e4SLinus Torvalds MODULE_LICENSE("GPL"); 73