5 * Bart De Schuymer <bdschuym@pandora.be>
10 * added ip-sport and ip-dport
11 * Innominate Security Technologies AG <mhopf@innominate.com>
15 #include <linux/netfilter_bridge/ebtables.h>
16 #include <linux/netfilter_bridge/ebt_ip.h>
20 #include <linux/module.h>
27 static int ebt_filter_ip(const struct sk_buff
*skb
, const struct net_device
*in
,
28 const struct net_device
*out
, const void *data
,
31 struct ebt_ip_info
*info
= (struct ebt_ip_info
*)data
;
32 struct iphdr _iph
, *ih
;
33 struct tcpudphdr _ports
, *pptr
;
35 ih
= skb_header_pointer(skb
, 0, sizeof(_iph
), &_iph
);
38 if (info
->bitmask
& EBT_IP_TOS
&&
39 FWINV(info
->tos
!= ih
->tos
, EBT_IP_TOS
))
41 if (info
->bitmask
& EBT_IP_SOURCE
&&
42 FWINV((ih
->saddr
& info
->smsk
) !=
43 info
->saddr
, EBT_IP_SOURCE
))
45 if ((info
->bitmask
& EBT_IP_DEST
) &&
46 FWINV((ih
->daddr
& info
->dmsk
) !=
47 info
->daddr
, EBT_IP_DEST
))
49 if (info
->bitmask
& EBT_IP_PROTO
) {
50 if (FWINV(info
->protocol
!= ih
->protocol
, EBT_IP_PROTO
))
52 if (!(info
->bitmask
& EBT_IP_DPORT
) &&
53 !(info
->bitmask
& EBT_IP_SPORT
))
55 if (ntohs(ih
->frag_off
) & IP_OFFSET
)
57 pptr
= skb_header_pointer(skb
, ih
->ihl
*4,
58 sizeof(_ports
), &_ports
);
61 if (info
->bitmask
& EBT_IP_DPORT
) {
62 u32 dst
= ntohs(pptr
->dst
);
63 if (FWINV(dst
< info
->dport
[0] ||
68 if (info
->bitmask
& EBT_IP_SPORT
) {
69 u32 src
= ntohs(pptr
->src
);
70 if (FWINV(src
< info
->sport
[0] ||
79 static int ebt_ip_check(const char *tablename
, unsigned int hookmask
,
80 const struct ebt_entry
*e
, void *data
, unsigned int datalen
)
82 struct ebt_ip_info
*info
= (struct ebt_ip_info
*)data
;
84 if (datalen
!= EBT_ALIGN(sizeof(struct ebt_ip_info
)))
86 if (e
->ethproto
!= htons(ETH_P_IP
) ||
87 e
->invflags
& EBT_IPROTO
)
89 if (info
->bitmask
& ~EBT_IP_MASK
|| info
->invflags
& ~EBT_IP_MASK
)
91 if (info
->bitmask
& (EBT_IP_DPORT
| EBT_IP_SPORT
)) {
92 if (info
->invflags
& EBT_IP_PROTO
)
94 if (info
->protocol
!= IPPROTO_TCP
&&
95 info
->protocol
!= IPPROTO_UDP
&&
96 info
->protocol
!= IPPROTO_SCTP
&&
97 info
->protocol
!= IPPROTO_DCCP
)
100 if (info
->bitmask
& EBT_IP_DPORT
&& info
->dport
[0] > info
->dport
[1])
102 if (info
->bitmask
& EBT_IP_SPORT
&& info
->sport
[0] > info
->sport
[1])
107 static struct ebt_match filter_ip
=
109 .name
= EBT_IP_MATCH
,
110 .match
= ebt_filter_ip
,
111 .check
= ebt_ip_check
,
115 static int __init
ebt_ip_init(void)
117 return ebt_register_match(&filter_ip
);
120 static void __exit
ebt_ip_fini(void)
122 ebt_unregister_match(&filter_ip
);
125 module_init(ebt_ip_init
);
126 module_exit(ebt_ip_fini
);
127 MODULE_LICENSE("GPL");