-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[NETFILTER]: ip6_tables: support MH match
This introduces match for Mobility Header (MH) described by Mobile IPv6 specification (RFC3775). User can specify the MH type or its range to be matched. Signed-off-by: Masahide NAKAMURA <nakam@linux-ipv6.org> Signed-off-by: Yasuyuki Kozakai <kozakai@linux-ipv6.org> Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Masahide NAKAMURA
authored and
David S. Miller
committed
Feb 8, 2007
1 parent
e60a13e
commit a0ca215
Showing
4 changed files
with
132 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
#ifndef _IP6T_MH_H | ||
#define _IP6T_MH_H | ||
|
||
/* MH matching stuff */ | ||
struct ip6t_mh | ||
{ | ||
u_int8_t types[2]; /* MH type range */ | ||
u_int8_t invflags; /* Inverse flags */ | ||
}; | ||
|
||
/* Values for "invflags" field in struct ip6t_mh. */ | ||
#define IP6T_MH_INV_TYPE 0x01 /* Invert the sense of type. */ | ||
#define IP6T_MH_INV_MASK 0x01 /* All possible flags. */ | ||
|
||
#endif /*_IP6T_MH_H*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
/* | ||
* Copyright (C)2006 USAGI/WIDE Project | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* Author: | ||
* Masahide NAKAMURA @USAGI <masahide.nakamura.cz@hitachi.com> | ||
* | ||
* Based on net/netfilter/xt_tcpudp.c | ||
* | ||
*/ | ||
#include <linux/types.h> | ||
#include <linux/module.h> | ||
#include <net/ip.h> | ||
#include <linux/ipv6.h> | ||
#include <net/ipv6.h> | ||
#include <net/mip6.h> | ||
|
||
#include <linux/netfilter/x_tables.h> | ||
#include <linux/netfilter_ipv6/ip6t_mh.h> | ||
|
||
MODULE_DESCRIPTION("ip6t_tables match for MH"); | ||
MODULE_LICENSE("GPL"); | ||
|
||
#ifdef DEBUG_IP_FIREWALL_USER | ||
#define duprintf(format, args...) printk(format , ## args) | ||
#else | ||
#define duprintf(format, args...) | ||
#endif | ||
|
||
/* Returns 1 if the type is matched by the range, 0 otherwise */ | ||
static inline int | ||
type_match(u_int8_t min, u_int8_t max, u_int8_t type, int invert) | ||
{ | ||
int ret; | ||
|
||
ret = (type >= min && type <= max) ^ invert; | ||
return ret; | ||
} | ||
|
||
static int | ||
match(const struct sk_buff *skb, | ||
const struct net_device *in, | ||
const struct net_device *out, | ||
const struct xt_match *match, | ||
const void *matchinfo, | ||
int offset, | ||
unsigned int protoff, | ||
int *hotdrop) | ||
{ | ||
struct ip6_mh _mh, *mh; | ||
const struct ip6t_mh *mhinfo = matchinfo; | ||
|
||
/* Must not be a fragment. */ | ||
if (offset) | ||
return 0; | ||
|
||
mh = skb_header_pointer(skb, protoff, sizeof(_mh), &_mh); | ||
if (mh == NULL) { | ||
/* We've been asked to examine this packet, and we | ||
can't. Hence, no choice but to drop. */ | ||
duprintf("Dropping evil MH tinygram.\n"); | ||
*hotdrop = 1; | ||
return 0; | ||
} | ||
|
||
return type_match(mhinfo->types[0], mhinfo->types[1], mh->ip6mh_type, | ||
!!(mhinfo->invflags & IP6T_MH_INV_TYPE)); | ||
} | ||
|
||
/* Called when user tries to insert an entry of this type. */ | ||
static int | ||
mh_checkentry(const char *tablename, | ||
const void *entry, | ||
const struct xt_match *match, | ||
void *matchinfo, | ||
unsigned int hook_mask) | ||
{ | ||
const struct ip6t_mh *mhinfo = matchinfo; | ||
|
||
/* Must specify no unknown invflags */ | ||
return !(mhinfo->invflags & ~IP6T_MH_INV_MASK); | ||
} | ||
|
||
static struct xt_match mh_match = { | ||
.name = "mh", | ||
.family = AF_INET6, | ||
.checkentry = mh_checkentry, | ||
.match = match, | ||
.matchsize = sizeof(struct ip6t_mh), | ||
.proto = IPPROTO_MH, | ||
.me = THIS_MODULE, | ||
}; | ||
|
||
static int __init ip6t_mh_init(void) | ||
{ | ||
return xt_register_match(&mh_match); | ||
} | ||
|
||
static void __exit ip6t_mh_fini(void) | ||
{ | ||
xt_unregister_match(&mh_match); | ||
} | ||
|
||
module_init(ip6t_mh_init); | ||
module_exit(ip6t_mh_fini); |