diff -Naur ebtables-v2.0.10-4_old/extensions/Makefile ebtables-v2.0.10-4/extensions/Makefile
--- ebtables-v2.0.10-4_old/extensions/Makefile	2011-12-15 21:02:47.000000000 +0100
+++ ebtables-v2.0.10-4/extensions/Makefile	2017-07-10 12:52:30.000000000 +0200
@@ -1,7 +1,7 @@
 #! /usr/bin/make
 
 EXT_FUNC+=802_3 nat arp arpreply ip ip6 standard log redirect vlan mark_m mark \
-          pkttype stp among limit ulog nflog
+          pkttype stp among limit ulog nflog eq
 EXT_TABLES+=filter nat broute
 EXT_OBJS+=$(foreach T,$(EXT_FUNC), extensions/ebt_$(T).o)
 EXT_OBJS+=$(foreach T,$(EXT_TABLES), extensions/ebtable_$(T).o)
diff -Naur ebtables-v2.0.10-4_old/extensions/ebt_eq.c ebtables-v2.0.10-4/extensions/ebt_eq.c
--- ebtables-v2.0.10-4_old/extensions/ebt_eq.c	1970-01-01 01:00:00.000000000 +0100
+++ ebtables-v2.0.10-4/extensions/ebt_eq.c	2017-07-11 17:17:12.156687283 +0200
@@ -0,0 +1,216 @@
+/* ebt_eq
+ *
+ * Authors:
+ * Karel Znamenacek <karel@ryston.cz>
+ *
+ * payload test match
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+#include <netdb.h>
+#include "../include/ebtables_u.h"
+#include <linux/netfilter_bridge/ebt_eq.h>
+#include <linux/netfilter_bridge/ebt_ip.h>
+
+#define EQ_A 		'1'
+#define EQ_TEST		'2'
+
+
+
+
+static struct option opts[] =
+{
+	{ "eq"           	, required_argument	, 0, EQ_A	},
+	{ "eq-test"           	, no_argument		, 0, EQ_TEST	},
+	{ 0 }
+};
+
+
+
+
+static void print_help()
+{
+	printf(
+"ip options:\n"
+"--eq    	[!] offset value[/mask] matching offset, data and mask\n"
+"--eq-test 	test data\n");
+}
+
+static void init(struct ebt_entry_match *match)
+{
+	struct ebt_eq_info *eqinfo = (struct ebt_eq_info *)match->data;
+
+	eqinfo->invflags = 0;
+	eqinfo->bitmask = 0;
+	eqinfo->data_len = 0;
+	eqinfo->mask = 0;
+}
+
+/*#define EQ_debug*/
+static int parse(int c, char **argv, int argc, const struct ebt_u_entry *entry,
+   unsigned int *flags, struct ebt_entry_match **match)
+{
+	struct ebt_eq_info *eqinfo = (struct ebt_eq_info *)(*match)->data;
+	char *p;
+	char tmp[4],ch;
+	long int i,n;
+	short int tmp_si;
+
+	switch (c) {
+	case EQ_TEST:
+		ebt_check_option2(flags, EQ_TEST);	/*kdyz bit eq_TEST neni*/
+		eqinfo->bitmask |= EBT_EQ_TEST;		/* nastaven ve flagu, */
+		break;					/*tak se nastavi, jinak return -1;*/
+
+	case EQ_A:
+		ebt_check_option2(flags, EQ_A);
+		eqinfo->bitmask |= EBT_EQ_A;
+/*		if(check_inverse(optarg))
+		{	eqinfo->invflags |= EQ_A;
+		}			inverze neni povolena
+*/
+
+		if(argc<optind+1)	ebt_print_error2("Error 5: Argument missing");
+		p = argv[optind-1];			/*1. parametr pro eq_A*/
+
+		i = sscanf(p," %hx",&eqinfo->offset);
+#ifdef EQ_debug
+		printf("\n*** DEBUG INFO ***\n");
+		printf("***argv[0] = %s***\n",argv[0]);
+		printf("***argv[1] = %s***\n",argv[1]);
+		printf("***argv[4] = %s***\n",argv[4]);
+		printf("***argv[5] = %s***\n",argv[5]);
+		printf("***argv[6] = %s***\n",argv[6]);
+		printf("***optind = %d***\n",optind);
+		printf("***p = %s***\n",p);
+		printf("***t = %d***\n",i);
+		printf("***eqinfo->offset = %hx***\n",eqinfo->offset);
+		printf("******************\n");
+
+#endif
+		if(i != 1 || eqinfo->offset < 0 || eqinfo->offset > MAX_ETHOFFSET-1)
+			ebt_print_error2("Error 6: Problem with specified offset");
+
+/*data field ... az 8 bajtu v hexadecimalnim zapisu*/
+		p = argv[optind];			/*2. parametr pro EQ_A*/
+/* test validity porovnavacich dat */
+		for(i=0; i<=(MAX_CMPDATALEN*2); i++)
+		{	ch=p[i];
+			if(ch >= 'a' && ch <='f') continue;
+			if(ch >= 'A' && ch <='F') continue;
+			if(ch >= '0' && ch <='9') continue;
+	/*	znak nesplnuje podminku pro zapis hexadec. cisla*/
+			if(ch == '\0' && (i%2)!=1) break;	/*kdyz je to konec retezce, musi byt i == sudemu cislu <= 16*/
+			i=0xff; continue;	/*error in data*/
+		}
+/*		printf("i==%ld, ch_value == %d\n",i,ch);*/
+		if(i<(1+(2*MAX_CMPDATALEN)) && ch=='\0')
+			eqinfo->data_len = i/2;
+		else
+			ebt_print_error2("Error 1: Problem with specified data");
+
+		//for(i=0;i<8;eqinfo->data[i++]=-1);		/*nulovani dat*/
+		for(i=0;i< eqinfo->data_len; i++)
+		{	/*printf("\ni..%ld",i);*/
+			tmp[0]=*p;	p++;
+			tmp[1]=*p;	p++;
+			tmp[2]='\0';
+			n=sscanf(tmp,"%hx",&tmp_si);
+			if(n!=1)// || eqinfo->data[i]<0 || eqinfo->data[i]>255)
+				ebt_print_error2("Error 2: Problem with specified data");
+            eqinfo->data[i] = tmp_si;
+
+		}
+
+/* Do something with optind ???*/
+		optind++;
+		break;
+
+	default:
+		return 0;
+	}
+	return 1;
+}
+
+static void final_check(const struct ebt_u_entry *entry,
+   const struct ebt_entry_match *match, const char *name,
+   unsigned int hookmask, unsigned int time)
+{
+	return;		/*nothing to check*/
+}
+
+static void print(const struct ebt_u_entry *entry,
+   const struct ebt_entry_match *match)
+{
+	struct ebt_eq_info *eqinfo = (struct ebt_eq_info *) match->data;
+
+	int i;
+
+	if (eqinfo->bitmask & EBT_EQ_TEST) {
+		printf("--eq-test ");
+		if (eqinfo->invflags & EBT_EQ_TEST)
+			printf("! ");
+	}
+	if (eqinfo->bitmask & EBT_EQ_A) {
+		printf("--eq ");
+		if (eqinfo->invflags & EBT_EQ_A)
+			printf("! ");
+		printf("offset 0x%02X ", eqinfo->offset);
+		printf("data 0x");
+		for(i=0;i<eqinfo->data_len;i++)
+		{
+			printf("%02X",eqinfo->data[i]);
+		}
+		printf(" ");
+/*		printf("mask %d ", eqinfo->mask);		*/
+	}
+}
+
+static int compare(const struct ebt_entry_match *m1,
+   const struct ebt_entry_match *m2)
+{	int i;
+	struct ebt_eq_info *eqinfo1 = (struct ebt_eq_info *)m1->data;
+	struct ebt_eq_info *eqinfo2 = (struct ebt_eq_info *)m2->data;
+
+	if (eqinfo1->bitmask != eqinfo2->bitmask)
+		return 0;
+	if (eqinfo1->data_len != eqinfo2->data_len)
+		return 0;
+	if (eqinfo1->invflags != eqinfo2->invflags)
+		return 0;
+	if (eqinfo1->bitmask & EQ_TEST) {	/* nic */
+
+	}
+	if (eqinfo1->bitmask & EQ_A) {
+		if (eqinfo1->offset != eqinfo2->offset)
+			return 0;
+		for(i=0;i<eqinfo1->data_len;i++)
+		{	if (eqinfo1->data[i] != eqinfo2->data[i])
+				return 0;
+		}
+		if (eqinfo1->mask != eqinfo2->mask)
+			return 0;
+	}
+	return 1;
+}
+
+static struct ebt_u_match eq_match =
+{
+	.name		= EBT_EQ_MATCH,
+	.size		= sizeof(struct ebt_eq_info),
+	.help		= print_help,
+	.init		= init,
+	.parse		= parse,
+	.final_check	= final_check,
+	.print		= print,
+	.compare	= compare,
+	.extra_ops	= opts,
+};
+
+void _init(void)
+{
+	ebt_register_match(&eq_match);
+}
diff -Naur ebtables-v2.0.10-4_old/include/linux/netfilter_bridge/ebt_eq.h ebtables-v2.0.10-4/include/linux/netfilter_bridge/ebt_eq.h
--- ebtables-v2.0.10-4_old/include/linux/netfilter_bridge/ebt_eq.h	1970-01-01 01:00:00.000000000 +0100
+++ ebtables-v2.0.10-4/include/linux/netfilter_bridge/ebt_eq.h	2017-07-11 17:18:12.222820812 +0200
@@ -0,0 +1,28 @@
+/*
+ *  ebt_eq
+ */
+
+#ifndef __LINUX_BRIDGE_EBT_EQ_H
+#define __LINUX_BRIDGE_EBT_EQ_H
+
+#include <linux/types.h>
+
+#define EBT_EQ_A	0x01
+#define EBT_EQ_TEST	0x02
+
+#define EBT_EQ_MATCH "eq"
+#define MAX_ETHOFFSET 1504	/*1518 - 14 (ethernet header)*/
+#define MAX_CMPDATALEN  16
+
+struct ebt_eq_info
+{
+	uint8_t  bitmask;
+	uint8_t  invflags;
+	int16_t offset;	//0 az MAX_ETHOFFSET-1
+//	int16_t data[MAX_CMPDATALEN];	//az 16 bajtu porovnavacich dat
+    uint8_t data[MAX_CMPDATALEN];	//az 16 bajtu porovnavacich dat
+	int16_t data_len;
+	uint32_t mask;
+};
+
+#endif
