Home | History | Annotate | Download | only in extensions
      1 /* 802_3
      2  *
      3  * Author:
      4  * Chris Vitale <csv (at) bluetail.com>
      5  *
      6  * May 2003
      7  *
      8  * Adapted by Arturo Borrero Gonzalez <arturo (at) debian.org>
      9  * to use libxtables for ebtables-compat
     10  */
     11 
     12 #include <stdbool.h>
     13 #include <stdio.h>
     14 #include <string.h>
     15 #include <stdlib.h>
     16 #include <getopt.h>
     17 #include <xtables.h>
     18 #include <linux/netfilter_bridge/ebt_802_3.h>
     19 
     20 #define _802_3_SAP	'1'
     21 #define _802_3_TYPE	'2'
     22 
     23 static const struct option br802_3_opts[] = {
     24 	{ .name = "802_3-sap",	.has_arg = true, .val = _802_3_SAP },
     25 	{ .name = "802_3-type",	.has_arg = true, .val = _802_3_TYPE },
     26 	XT_GETOPT_TABLEEND,
     27 };
     28 
     29 static void br802_3_print_help(void)
     30 {
     31 	printf(
     32 "802_3 options:\n"
     33 "--802_3-sap [!] protocol       : 802.3 DSAP/SSAP- 1 byte value (hex)\n"
     34 "  DSAP and SSAP are always the same.  One SAP applies to both fields\n"
     35 "--802_3-type [!] protocol      : 802.3 SNAP Type- 2 byte value (hex)\n"
     36 "  Type implies SAP value 0xaa\n");
     37 }
     38 
     39 static void br802_3_init(struct xt_entry_match *match)
     40 {
     41 	struct ebt_802_3_info *info = (struct ebt_802_3_info *)match->data;
     42 
     43 	info->invflags = 0;
     44 	info->bitmask = 0;
     45 }
     46 
     47 static int
     48 br802_3_parse(int c, char **argv, int invert, unsigned int *flags,
     49 	      const void *entry, struct xt_entry_match **match)
     50 {
     51 	struct ebt_802_3_info *info = (struct ebt_802_3_info *) (*match)->data;
     52 	unsigned int i;
     53 	char *end;
     54 
     55 	switch (c) {
     56 	case _802_3_SAP:
     57 		if (invert)
     58 			info->invflags |= EBT_802_3_SAP;
     59 		i = strtoul(optarg, &end, 16);
     60 		if (i > 255 || *end != '\0')
     61 			xtables_error(PARAMETER_PROBLEM,
     62 				      "Problem with specified "
     63 					"sap hex value, %x",i);
     64 		info->sap = i; /* one byte, so no byte order worries */
     65 		info->bitmask |= EBT_802_3_SAP;
     66 		break;
     67 	case _802_3_TYPE:
     68 		if (invert)
     69 			info->invflags |= EBT_802_3_TYPE;
     70 		i = strtoul(optarg, &end, 16);
     71 		if (i > 65535 || *end != '\0') {
     72 			xtables_error(PARAMETER_PROBLEM,
     73 				      "Problem with the specified "
     74 					"type hex value, %x",i);
     75 		}
     76 		info->type = htons(i);
     77 		info->bitmask |= EBT_802_3_TYPE;
     78 		break;
     79 	default:
     80 		return 0;
     81 	}
     82 
     83 	*flags |= info->bitmask;
     84 	return 1;
     85 }
     86 
     87 static void
     88 br802_3_final_check(unsigned int flags)
     89 {
     90 	if (!flags)
     91 		xtables_error(PARAMETER_PROBLEM,
     92 			      "You must specify proper arguments");
     93 }
     94 
     95 static void br802_3_print(const void *ip, const struct xt_entry_match *match,
     96 			  int numeric)
     97 {
     98 	struct ebt_802_3_info *info = (struct ebt_802_3_info *)match->data;
     99 
    100 	if (info->bitmask & EBT_802_3_SAP) {
    101 		printf("--802_3-sap ");
    102 		if (info->invflags & EBT_802_3_SAP)
    103 			printf("! ");
    104 		printf("0x%.2x ", info->sap);
    105 	}
    106 	if (info->bitmask & EBT_802_3_TYPE) {
    107 		printf("--802_3-type ");
    108 		if (info->invflags & EBT_802_3_TYPE)
    109 			printf("! ");
    110 		printf("0x%.4x ", ntohs(info->type));
    111 	}
    112 }
    113 
    114 static struct xtables_match br802_3_match =
    115 {
    116 	.name		= "802_3",
    117 	.revision	= 0,
    118 	.version	= XTABLES_VERSION,
    119 	.family		= NFPROTO_BRIDGE,
    120 	.size		= XT_ALIGN(sizeof(struct ebt_802_3_info)),
    121 	.userspacesize	= XT_ALIGN(sizeof(struct ebt_802_3_info)),
    122 	.init		= br802_3_init,
    123 	.help		= br802_3_print_help,
    124 	.parse		= br802_3_parse,
    125 	.final_check	= br802_3_final_check,
    126 	.print		= br802_3_print,
    127 	.extra_opts	= br802_3_opts,
    128 };
    129 
    130 void _init(void)
    131 {
    132 	xtables_register_match(&br802_3_match);
    133 }
    134