Minor logic changes, comments, minor fixes
diff --git a/extensions/ebt_vlan.c b/extensions/ebt_vlan.c
index f74b26f..5c8504d 100644
--- a/extensions/ebt_vlan.c
+++ b/extensions/ebt_vlan.c
@@ -1,16 +1,32 @@
 /*
- * Summary: ebt_vlan - 802.1 Q match extension module for userspace
+ * Summary: ebt_vlan - IEEE 802.1Q extension module for userspace
  *
- * Description:802.1 Q Virtual LAN match support module for ebtables project. 
- * Enable to match 802.1 Q VLAN tagged frames by VLAN numeric 
- * identifier (12 - bits field) and user_priority (3 bits field)
+ * Description: 802.1Q Virtual LAN match support module for ebtables project. 
+ * Enables to match 802.1Q:
+ * 1) VLAN-tagged frames by VLAN numeric identifier (12 - bits field)
+ * 2) Priority-tagged frames by user_priority (3 bits field)
+ * 3) Encapsulated Frame by ethernet protocol type/length
  * 
  * Authors:
  * Bart De Schuymer <bart.de.schuymer@pandora.be>
  * Nick Fedchik <nick@fedchik.org.ua> 
  * June, 2002
  *
- * License: GPL 
+ * License: GNU GPL 
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  */
 
@@ -23,26 +39,30 @@
 #include "../include/ebtables_u.h"
 #include <linux/netfilter_bridge/ebt_vlan.h>
 
-#define VLAN_ID    '1'
-#define VLAN_PRIO  '2'
-#define VLAN_ENCAP '3'
+#define GET_BITMASK(_MASK_) vlaninfo->bitmask & _MASK_
+#define SET_BITMASK(_MASK_) vlaninfo->bitmask |= _MASK_
+#define INV_FLAG(_inv_flag_) (vlaninfo->invflags & _inv_flag_) ? "!" : ""
 
+#define VLAN_ID    0
+#define VLAN_PRIO  1
+#define VLAN_ENCAP 2
 static struct option opts[] = {
-	{"vlan-id", required_argument, 0, VLAN_ID},
-	{"vlan-prio", required_argument, 0, VLAN_PRIO},
-	{"vlan-encap", required_argument, 0, VLAN_ENCAP},
-	{0}
+	{"vlan-id", required_argument, NULL, VLAN_ID},
+	{"vlan-prio", required_argument, NULL, VLAN_PRIO},
+	{"vlan-encap", required_argument, NULL, VLAN_ENCAP},
+	{NULL}
 };
 
+
 /*
- * Print out local help by ebtables -h vlan 
+ * Print out local help by "ebtables -h vlan" 
  */
 static void print_help ()
 {
-	printf ("802.1Q VLAN options:\n"
-		"--vlan-id [!] id        : VLAN ID 1-4094 (integer)\n"
-		"--vlan-prio [!] prio    : VLAN Priority 0-7 (integer)\n"
-		"--vlan-encap [!] proto  : VLAN Encapsulated Protocol (integer or string as in /etc/ethertypes)\n");
+	printf ("802.1Q VLAN extension options:\n"
+		"--vlan-id [!]id        : VLAN-tagged frame identifier, 0,1-4094 (integer)\n"
+		"--vlan-prio [!]prio    : Priority-tagged frame user_priority, 0-7 (integer)\n"
+		"--vlan-encap [!]proto  : Encapsulated protocol (hexadecimal)\n");
 }
 
 /*
@@ -53,9 +73,9 @@
 	struct ebt_vlan_info *vlaninfo =
 	    (struct ebt_vlan_info *) match->data;
 	/*
-	 * Just clean initial values 
+	 * Set initial values 
 	 */
-	vlaninfo->id = 0;
+	vlaninfo->id = 1;	/* Default VID for VLAN-tagged 802.1Q frames */
 	vlaninfo->prio = 0;
 	vlaninfo->encap = 0;
 	vlaninfo->invflags = 0;
@@ -69,16 +89,23 @@
 #define OPT_VLAN_PRIO   0x02
 #define OPT_VLAN_ENCAP  0x04
 
+/*
+ * Parse passed arguments values (ranges, flags, etc...)
+ * int c - parameter number from static struct option opts[]
+ * int argc - total amout of arguments (std argc value)
+ * 
+ */
 static int
-parse (int c, char **argv, int argc,
-       const struct ebt_u_entry *entry, unsigned int *flags,
-       struct ebt_entry_match **match)
+parse (int c,
+       char **argv,
+       int argc,
+       const struct ebt_u_entry *entry,
+       unsigned int *flags, struct ebt_entry_match **match)
 {
 	struct ebt_vlan_info *vlaninfo =
 	    (struct ebt_vlan_info *) (*match)->data;
 	unsigned long i;
 	char *end;
-
 	switch (c) {
 	case VLAN_ID:
 		/*
@@ -96,7 +123,7 @@
 		 * Check arg value presence
 		 */
 		if (optind > argc)
-			print_error ("Missing VLAN ID argument\n");
+			print_error ("Missing VLAN ID argument value\n");
 		/*
 		 * Convert argv to long int,
 		 * set *end to end of argv string, 
@@ -106,19 +133,17 @@
 		/*
 		 * Check arg val range
 		 */
-		if (i < 1 || i >= 4094 || *end != '\0') {
-			i = 0;
+		if (i > 4094 || *end != '\0')
 			print_error
-			    ("Problem with specified VLAN ID range\n");
-		}
+			    ("Specified VLAN ID is out of range (0-4094)\n");
 		/*
-		 * Set up parameter value 
+		 * Set up parameter value
 		 */
 		vlaninfo->id = i;
 		/*
 		 * Set up parameter presence flag 
 		 */
-		vlaninfo->bitmask |= EBT_VLAN_ID;
+		SET_BITMASK (EBT_VLAN_ID);
 		break;
 
 	case VLAN_PRIO:
@@ -127,7 +152,7 @@
 			vlaninfo->invflags |= EBT_VLAN_PRIO;
 		if (optind > argc)
 			print_error
-			    ("Missing VLAN Priority level argument\n");
+			    ("Missing user_priority argument value\n");
 		/*
 		 * Convert argv to long int,
 		 * set *end to end of argv string, 
@@ -137,11 +162,9 @@
 		/*
 		 * Check arg val range 
 		 */
-		if (i >= 8 || *end != '\0') {
-			i = 0;
+		if (i >= 8 || *end != '\0')
 			print_error
-			    ("Problem with specified VLAN Priority range\n");
-		}
+			    ("Specified user_priority is out of range (0-7)\n");
 		/*
 		 * Set up parameter value 
 		 */
@@ -149,7 +172,7 @@
 		/*
 		 * Set up parameter presence flag 
 		 */
-		vlaninfo->bitmask |= EBT_VLAN_PRIO;
+		SET_BITMASK (EBT_VLAN_PRIO);
 		break;
 
 	case VLAN_ENCAP:
@@ -158,20 +181,20 @@
 			vlaninfo->invflags |= EBT_VLAN_ENCAP;
 		if (optind > argc)
 			print_error
-			    ("Missing VLAN Encapsulated Protocol argument\n");
+			    ("Missing encapsulated frame type argument value\n");
 		/*
 		 * Parameter can be decimal, hexadecimal, or string.
-		 * Check arg val range 
+		 * Check arg val range (still raw area)
 		 */
 		(unsigned short) i = strtol (argv[optind - 1], &end, 16);
-		if (*end == '\0' && (i < 0 || i > 0xFFFF))
+		if (*end == '\0' && (i < ETH_ZLEN || i > 0xFFFF))
 			print_error
-			    ("Problem with the specified encapsulated protocol");
+			    ("Specified encapsulated frame type is out of range\n");
 		if (*end != '\0')
 			if (name_to_protocol (argv[optind - 1]) == -1)
 				print_error
 				    ("Problem with the specified encapsulated"
-				     "protocol");
+				     "protocol\n");
 		/*
 		 * Set up parameter value (network notation)
 		 */
@@ -179,7 +202,7 @@
 		/*
 		 * Set up parameter presence flag 
 		 */
-		vlaninfo->bitmask |= EBT_VLAN_ENCAP;
+		SET_BITMASK (EBT_VLAN_ENCAP);
 		break;
 	default:
 		return 0;
@@ -188,19 +211,31 @@
 }
 
 /*
- * Final check 
+ * Final check - logical conditions
  */
 static void
 final_check (const struct ebt_u_entry *entry,
 	     const struct ebt_entry_match *match,
-	     const char *name, unsigned int hook_mask, unsigned int time)
+	     const char *name, unsigned int hook, unsigned int time)
 {
+
+	struct ebt_vlan_info *vlaninfo =
+	    (struct ebt_vlan_info *) match->data;
 	/*
-	 * Is any proto supplied there? Or specified proto isn't 802.1Q?
+	 * Is any proto param specified there? Or specified proto isn't 802.1Q?
 	 */
 	if (entry->bitmask & EBT_NOPROTO || entry->ethproto != ETH_P_8021Q)
 		print_error
-		    ("For matching 802.1Q VLAN the protocol must be specified as 802_1Q\n");
+		    ("For use 802.1Q extension the protocol must be specified as 802_1Q\n");
+	/*
+	 * Check if specified vlan-id=0 (priority-tagged frame condition) 
+	 * when vlan-prio was specified.
+	 */
+	if (GET_BITMASK (EBT_VLAN_PRIO)) {
+		if (vlaninfo->id && GET_BITMASK (EBT_VLAN_ID))
+			print_error
+			    ("For use user_priority the specified vlan-id must be 0\n");
+	}
 }
 
 /*
@@ -213,29 +248,36 @@
 	struct ebt_vlan_info *vlaninfo =
 	    (struct ebt_vlan_info *) match->data;
 
+	char ethertype_name[21];
 	/*
 	 * Print VLAN ID if they are specified 
 	 */
-	if (vlaninfo->bitmask & EBT_VLAN_ID) {
-		printf ("--vlan-id %s %d ",
-			vlaninfo->invflags & EBT_VLAN_ID ? "!" : "",
-			vlaninfo->id);
+	if (GET_BITMASK (EBT_VLAN_ID)) {
+		printf ("--%s %s%d ",
+			opts[VLAN_ID].name,
+			INV_FLAG (EBT_VLAN_ID), vlaninfo->id);
 	}
 	/*
-	 * Print VLAN priority if they are specified 
+	 * Print user priority if they are specified 
 	 */
-	if (vlaninfo->bitmask & EBT_VLAN_PRIO) {
-		printf ("--vlan-prio %s %d ",
-			vlaninfo->invflags & EBT_VLAN_PRIO ? "!" : "",
-			vlaninfo->prio);
+	if (GET_BITMASK (EBT_VLAN_PRIO)) {
+		printf ("--%s %s%d ",
+			opts[VLAN_PRIO].name,
+			INV_FLAG (EBT_VLAN_PRIO), vlaninfo->prio);
 	}
 	/*
-	 * Print VLAN encapsulated protocol if they are specified 
+	 * Print encapsulated frame type if they are specified 
 	 */
-	if (vlaninfo->bitmask & EBT_VLAN_ENCAP) {
-		printf ("--vlan-encap %s %2.4X ",
-			vlaninfo->invflags & EBT_VLAN_ENCAP ? "!" : "",
-			ntohs (vlaninfo->encap));
+	if (GET_BITMASK (EBT_VLAN_ENCAP)) {
+		printf ("--%s %s",
+			opts[VLAN_ENCAP].name, INV_FLAG (EBT_VLAN_ENCAP));
+		bzero (ethertype_name, 21);
+		if (!number_to_name
+		    (ntohs (vlaninfo->encap), ethertype_name)) {
+			printf ("%s ", ethertype_name);
+		} else {
+			printf ("%2.4X ", ntohs (vlaninfo->encap));
+		}
 	}
 }