* [PATCH] DSCP match/target patches
@ 2002-06-10 13:49 zenadsl3030
2002-06-11 7:41 ` Harald Welte
0 siblings, 1 reply; 4+ messages in thread
From: zenadsl3030 @ 2002-06-10 13:49 UTC (permalink / raw)
To: netfilter-devel
[-- Attachment #1: Type: text/plain, Size: 263 bytes --]
Hi,
Here is a simple patch to the DSCP match to allow the use of DiffServ class names in the matches, in a similar manner to the target.
Also attached is a one line fix for a typo in the DSCP target where CS6 was defined twice in the match list.
Iain
[-- Attachment #2: libipt_DSCP-target.diff --]
[-- Type: application/octet-stream, Size: 267 bytes --]
--- libipt_DSCP.c.orig Mon Jun 10 14:35:14 2002
+++ libipt_DSCP.c Mon Jun 10 14:35:24 2002
@@ -35,7 +35,7 @@
{ "CS4", 0x20 },
{ "CS5", 0x28 },
{ "CS6", 0x30 },
- { "CS6", 0x38 },
+ { "CS7", 0x38 },
{ "BE", 0 },
{ "AF11", 0x0a },
{ "AF12", 0x0c },
[-- Attachment #3: libipt_dscp-match.diff --]
[-- Type: application/octet-stream, Size: 2390 bytes --]
--- libipt_dscp.c.orig Thu Mar 14 12:19:43 2002
+++ libipt_dscp.c Mon Jun 10 14:32:38 2002
@@ -9,6 +9,7 @@
* For a list of DSCP codepoints see
* http://www.iana.org/assignments/dscp-registry
*
+ * DiffServ class support by Iain Barnes.
*/
#include <stdio.h>
#include <string.h>
@@ -19,6 +20,39 @@
#include <linux/netfilter_ipv4/ip_tables.h>
#include <linux/netfilter_ipv4/ipt_dscp.h>
+
+static struct ds_class
+{
+ char *class;
+ unsigned int dscp;
+} ds_classes[] =
+{
+ { "CS0", 0 },
+ { "CS1", 0x08 },
+ { "CS2", 0x10 },
+ { "CS3", 0x18 },
+ { "CS4", 0x20 },
+ { "CS5", 0x28 },
+ { "CS6", 0x30 },
+ { "CS7", 0x38 },
+ { "BE", 0 },
+ { "AF11", 0x0a },
+ { "AF12", 0x0c },
+ { "AF13", 0x0e },
+ { "AF21", 0x12 },
+ { "AF22", 0x14 },
+ { "AF23", 0x16 },
+ { "AF31", 0x1a },
+ { "AF32", 0x1c },
+ { "AF33", 0x1e },
+ { "AF41", 0x22 },
+ { "AF42", 0x24 },
+ { "AF43", 0x26 },
+ { "EF", 0x2e }
+};
+
+
+
static void init(struct ipt_entry_match *m, unsigned int *nfcache)
{
*nfcache |= NFC_IP_TOS;
@@ -30,12 +64,15 @@
"DSCP match v%s options\n"
"[!] --dscp value Match DSCP codepoint with numerical value\n"
" This value can be in decimal (ex: 32)\n"
-" or in hex (ex: 0x20)\n", NETFILTER_VERSION
+" or in hex (ex: 0x20)\n"
+"[!] --class name Match the DiffServ Class names such as\n"
+" AFxx,BE,EF or CSx\n", NETFILTER_VERSION
);
}
static struct option opts[] = {
{ "dscp", 1, 0, 'F' },
+ { "class", 1, 0, 'G' },
{ 0 }
};
@@ -56,6 +93,23 @@
return;
}
+
+static void
+parse_class(const unsigned char *s, struct ipt_dscp_info *dinfo)
+{
+ int i;
+
+ for(i = 0; i < sizeof(ds_classes) / sizeof(struct ds_class); i++) {
+ if (!strncasecmp (s, ds_classes[i].class,
+ strlen(ds_classes[i].class))) {
+ dinfo->dscp = (u_int8_t)ds_classes[i].dscp;
+ return;
+ }
+ }
+
+ exit_error(PARAMETER_PROBLEM, "Invalid DiffServ class '%s'\n", s);
+}
+
static int
parse(int c, char **argv, int invert, unsigned int *flags,
const struct ipt_entry *entry,
@@ -77,6 +131,18 @@
*flags = 1;
break;
+ case 'G':
+ if (*flags)
+ exit_error(PARAMETER_PROBLEM,
+ "DSCP match: Only use --class ONCE!");
+
+ check_inverse(optarg, &invert, &optind, 0);
+ parse_class(argv[optind - 1], dinfo);
+ if (invert)
+ dinfo->invert = 1;
+ *flags = 1;
+ break;
+
default:
return 0;
}
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] DSCP match/target patches
2002-06-10 13:49 [PATCH] DSCP match/target patches zenadsl3030
@ 2002-06-11 7:41 ` Harald Welte
2002-06-17 17:50 ` Iain Barnes
0 siblings, 1 reply; 4+ messages in thread
From: Harald Welte @ 2002-06-11 7:41 UTC (permalink / raw)
To: zenadsl3030; +Cc: netfilter-devel
[-- Attachment #1: Type: text/plain, Size: 966 bytes --]
On Mon, Jun 10, 2002 at 01:49:13PM +0000, zenadsl3030@zen.co.uk wrote:
> Hi,
>
> Here is a simple patch to the DSCP match to allow the use of DiffServ class
> names in the matches, in a similar manner to the target.
>
> Also attached is a one line fix for a typo in the DSCP target where CS6 was
> defined twice in the match list.
thanks for your contribution. What about putting all the class name <->
numerical resolving in a seperate .c file, which is then compiled once and
linked into both libipt_dscp.so and libipt_DSCP.so ?
I think this would be the ideal case, without any code duplication.
> Iain
--
Live long and prosper
- Harald Welte / laforge@gnumonks.org http://www.gnumonks.org/
============================================================================
GCS/E/IT d- s-: a-- C+++ UL++++$ P+++ L++++$ E--- W- N++ o? K- w--- O- M+
V-- PS++ PE-- Y++ PGP++ t+ 5-- !X !R tv-- b+++ !DI !D G+ e* h--- r++ y+(*)
[-- Attachment #2: Type: application/pgp-signature, Size: 232 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] DSCP match/target patches
2002-06-11 7:41 ` Harald Welte
@ 2002-06-17 17:50 ` Iain Barnes
2002-06-21 17:28 ` Harald Welte
0 siblings, 1 reply; 4+ messages in thread
From: Iain Barnes @ 2002-06-17 17:50 UTC (permalink / raw)
To: netfilter-devel
[-- Attachment #1: Type: text/plain, Size: 1516 bytes --]
Harald
Ok, here is the first cut of a set of patches.
The only thing missing is the Makefile modifications. My knowledge of
the fine art of Makefile writing is sorely lacking, so any help on that
front, from anybody, would be greatly appreciated.
The helper functions have been placed in a libipt_dscp_helper.c file in
the extensions directory.
Both the DSCP match and target have been modified to use the new
functions.
Iain
On Tue, 2002-06-11 at 08:41, Harald Welte wrote:
> On Mon, Jun 10, 2002 at 01:49:13PM +0000, zenadsl3030@zen.co.uk wrote:
> > Hi,
> >
> > Here is a simple patch to the DSCP match to allow the use of DiffServ class
> > names in the matches, in a similar manner to the target.
> >
> > Also attached is a one line fix for a typo in the DSCP target where CS6 was
> > defined twice in the match list.
>
> thanks for your contribution. What about putting all the class name <->
> numerical resolving in a seperate .c file, which is then compiled once and
> linked into both libipt_dscp.so and libipt_DSCP.so ?
>
> I think this would be the ideal case, without any code duplication.
>
> > Iain
>
> --
> Live long and prosper
> - Harald Welte / laforge@gnumonks.org http://www.gnumonks.org/
> ============================================================================
> GCS/E/IT d- s-: a-- C+++ UL++++$ P+++ L++++$ E--- W- N++ o? K- w--- O- M+
> V-- PS++ PE-- Y++ PGP++ t+ 5-- !X !R tv-- b+++ !DI !D G+ e* h--- r++ y+(*)
--
Iain Barnes <zenadsl3030@zen.co.uk>
[-- Attachment #2: dscp-helper.diff --]
[-- Type: text/x-patch, Size: 5643 bytes --]
diff -urN userspace-cvs/extensions/libipt_DSCP.c userspace/extensions/libipt_DSCP.c
--- userspace-cvs/extensions/libipt_DSCP.c Mon Jun 17 18:29:08 2002
+++ userspace/extensions/libipt_DSCP.c Mon Jun 17 18:41:00 2002
@@ -18,39 +18,8 @@
#include <linux/netfilter_ipv4/ip_tables.h>
#include <linux/netfilter_ipv4/ipt_DSCP.h>
+extern unsigned int class_to_dscp(const char *name);
-/* see http://www.iana.org/assignments/dscp-registry */
-
-static struct ds_class
-{
- char *class;
- unsigned int dscp;
-} ds_classes[] =
-{
- { "CS0", 0 },
- { "CS1", 0x08 },
- { "CS2", 0x10 },
- { "CS3", 0x18 },
- { "CS3", 0x18 },
- { "CS4", 0x20 },
- { "CS5", 0x28 },
- { "CS6", 0x30 },
- { "CS6", 0x38 },
- { "BE", 0 },
- { "AF11", 0x0a },
- { "AF12", 0x0c },
- { "AF13", 0x0e },
- { "AF21", 0x12 },
- { "AF22", 0x14 },
- { "AF23", 0x16 },
- { "AF31", 0x1a },
- { "AF32", 0x1c },
- { "AF33", 0x1e },
- { "AF41", 0x22 },
- { "AF42", 0x24 },
- { "AF43", 0x26 },
- { "EF", 0x2e }
-};
static void init(struct ipt_entry_target *t, unsigned int *nfcache)
{
@@ -99,17 +68,10 @@
static void
parse_class(const unsigned char *s, struct ipt_DSCP_info *dinfo)
{
- int i;
-
- for (i = 0; i < sizeof(ds_classes) / sizeof(struct ds_class); i++) {
- if (!strncasecmp(s, ds_classes[i].class,
- strlen(ds_classes[i].class))) {
- dinfo->dscp = (u_int8_t)ds_classes[i].dscp;
- return;
- }
- }
+ unsigned int dscp = class_to_dscp(s);
- exit_error(PARAMETER_PROBLEM, "Invalid DSCP class value '%s'", s);
+ /* Assign the value */
+ dinfo->dscp = (u_int8_t)dscp;
}
diff -urN userspace-cvs/extensions/libipt_dscp.c userspace/extensions/libipt_dscp.c
--- userspace-cvs/extensions/libipt_dscp.c Mon Jun 17 18:29:08 2002
+++ userspace/extensions/libipt_dscp.c Mon Jun 17 18:42:11 2002
@@ -6,6 +6,8 @@
*
* libipt_dscp.c borrowed heavily from libipt_tos.c
*
+ * --class support added by Iain Barnes
+ *
* For a list of DSCP codepoints see
* http://www.iana.org/assignments/dscp-registry
*
@@ -19,6 +21,9 @@
#include <linux/netfilter_ipv4/ip_tables.h>
#include <linux/netfilter_ipv4/ipt_dscp.h>
+
+extern unsigned int class_to_dscp(const char *name);
+
static void init(struct ipt_entry_match *m, unsigned int *nfcache)
{
*nfcache |= NFC_IP_TOS;
@@ -30,12 +35,18 @@
"DSCP match v%s options\n"
"[!] --dscp value Match DSCP codepoint with numerical value\n"
" This value can be in decimal (ex: 32)\n"
-" or in hex (ex: 0x20)\n", IPTABLES_VERSION
+" or in hex (ex: 0x20)\n"
+"[!] --class name Match the DiffServ class. This value may\n"
+" be any of the BE,EF, AFxx or CSx classes\n"
+"\n"
+" These two options are mutually exclusive !\n"
+ , IPTABLES_VERSION
);
}
static struct option opts[] = {
{ "dscp", 1, 0, 'F' },
+ { "class", 1, 0, 'G' },
{ 0 }
};
@@ -56,6 +67,17 @@
return;
}
+
+static void
+parse_class(const char *s, struct ipt_dscp_info *dinfo)
+{
+ unsigned int dscp = class_to_dscp(s);
+
+ /* Assign the value */
+ dinfo->dscp = (u_int8_t)dscp;
+}
+
+
static int
parse(int c, char **argv, int invert, unsigned int *flags,
const struct ipt_entry *entry,
@@ -72,6 +94,17 @@
"DSCP match: Only use --dscp ONCE!");
check_inverse(optarg, &invert, &optind, 0);
parse_dscp(argv[optind-1], dinfo);
+ if (invert)
+ dinfo->invert = 1;
+ *flags = 1;
+ break;
+
+ case 'G':
+ if (*flags)
+ exit_error(PARAMETER_PROBLEM,
+ "DSCP match: Only use --class ONCE!");
+ check_inverse(optarg, &invert, &optind, 0);
+ parse_class(argv[optind - 1], dinfo);
if (invert)
dinfo->invert = 1;
*flags = 1;
diff -urN userspace-cvs/extensions/libipt_dscp_helper.c userspace/extensions/libipt_dscp_helper.c
--- userspace-cvs/extensions/libipt_dscp_helper.c Thu Jan 1 01:00:00 1970
+++ userspace/extensions/libipt_dscp_helper.c Mon Jun 17 18:44:51 2002
@@ -0,0 +1,82 @@
+/*
+ * DiffServ classname <-> DiffServ codepoint mapping functions.
+ *
+ * The latest list of the mappings can be found at:
+ * <http://www.iana.org/assignments/dscp-registry>
+ *
+ * This code is released under the GNU GPL v2, 1991
+ *
+ * Author: Iain Barnes
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <iptables_common.h>
+
+
+
+static struct ds_class
+{
+ const char *name;
+ unsigned int dscp;
+} ds_classes[] =
+{
+ { "CS0", 0x00 },
+ { "CS1", 0x08 },
+ { "CS2", 0x10 },
+ { "CS3", 0x18 },
+ { "CS4", 0x20 },
+ { "CS5", 0x28 },
+ { "CS6", 0x30 },
+ { "CS7", 0x38 },
+ { "BE", 0x00 },
+ { "AF11", 0x0a },
+ { "AF12", 0x0c },
+ { "AF13", 0x0e },
+ { "AF21", 0x12 },
+ { "AF22", 0x14 },
+ { "AF23", 0x16 },
+ { "AF31", 0x1a },
+ { "AF32", 0x1c },
+ { "AF33", 0x1e },
+ { "AF41", 0x22 },
+ { "AF42", 0x24 },
+ { "AF43", 0x26 },
+ { "EF", 0x2e }
+};
+
+
+
+unsigned int
+class_to_dscp(const char *name)
+{
+ int i;
+
+ for (i = 0; i < sizeof(ds_classes) / sizeof(struct ds_class); i++) {
+ if (!strncasecmp(name, ds_classes[i].name,
+ strlen(ds_classes[i].name)))
+ return ds_classes[i].dscp;
+ }
+
+ exit_error(PARAMETER_PROBLEM,
+ "Invalid DSCP value `%d'\n", dscp);
+}
+
+
+
+const char *
+dscp_to_name(unsigned int dscp)
+{
+ int i;
+
+ for (i = 0; i < sizeof(ds_classes) / sizeof(struct ds_class); i++) {
+ if (dscp == ds_classes[i].dscp)
+ return ds_classes[i].name;
+ }
+
+
+ exit_error(PARAMETER_PROBLEM,
+ "Invalid DiffServ class name `%s'\n", name);
+}
+
+
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] DSCP match/target patches
2002-06-17 17:50 ` Iain Barnes
@ 2002-06-21 17:28 ` Harald Welte
0 siblings, 0 replies; 4+ messages in thread
From: Harald Welte @ 2002-06-21 17:28 UTC (permalink / raw)
To: Iain Barnes; +Cc: Netfilter Development Mailinglist
[-- Attachment #1: Type: text/plain, Size: 746 bytes --]
On Mon, Jun 17, 2002 at 06:50:32PM +0100, Iain Barnes wrote:
> Harald
>
> The only thing missing is the Makefile modifications. My knowledge of
> the fine art of Makefile writing is sorely lacking, so any help on that
> front, from anybody, would be greatly appreciated.
I've now managed to solve the problem without Makefile modifications.
Feel free to look at the current CVS code :)
> Iain
--
Live long and prosper
- Harald Welte / laforge@gnumonks.org http://www.gnumonks.org/
============================================================================
GCS/E/IT d- s-: a-- C+++ UL++++$ P+++ L++++$ E--- W- N++ o? K- w--- O- M+
V-- PS++ PE-- Y++ PGP++ t+ 5-- !X !R tv-- b+++ !DI !D G+ e* h--- r++ y+(*)
[-- Attachment #2: Type: application/pgp-signature, Size: 232 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2002-06-21 17:28 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-06-10 13:49 [PATCH] DSCP match/target patches zenadsl3030
2002-06-11 7:41 ` Harald Welte
2002-06-17 17:50 ` Iain Barnes
2002-06-21 17:28 ` Harald Welte
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.