From fca59bea770346cf1c1f9b0e00cb48a61b44a8f3 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 25 Oct 2015 21:00:20 +0100 Subject: import of old now defunct presentation slides svn repo --- 2004/netfilter-programming-lwe2004/ipt_workshop.c | 54 +++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 2004/netfilter-programming-lwe2004/ipt_workshop.c (limited to '2004/netfilter-programming-lwe2004/ipt_workshop.c') diff --git a/2004/netfilter-programming-lwe2004/ipt_workshop.c b/2004/netfilter-programming-lwe2004/ipt_workshop.c new file mode 100644 index 0000000..ce00aa4 --- /dev/null +++ b/2004/netfilter-programming-lwe2004/ipt_workshop.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Harald Welte "); +MODULE_DESCRIPTION("LWE2004 workshop iptables module"); + +static int ws_match(const struct sk_buff *skb, const struct net_device *in, + const struct net_device *out, const void *matchinfo, + int offset, const void *hdr, u_int16_t datalen, + int *hotdrop) +{ + const struct ipt_ws_info *info = matchinfo; + const struct iphdr *iph = skb->nh.iph; + + if (iph->ttl == info->ttl) + return 1; + + return 0; +} + +static int ws_checkentry(const char *tablename, const struct ipt_ip *ip, + void *matchinfo, unsigned int matchsize, + unsigned int hook_mask) +{ + if (matchsize != IPT_ALIGN(sizeof(struct ipt_ws_info))) + return 0; + + return 1; +} + +static struct ipt_match ws_match = { + .list = { .prev = NULL, .next = NULL }, + .name = "workshop", + .match = &ws_match, + .checkentry = &ws_checkentry, + .destroy = NULL, + .me = THIS_MODULE +}; + +static int __init init(void) +{ + return ipt_register_match(&ws_match); +} + +static void __exit fini(void) +{ + ipt_unregister_match(&ws_match); +} + +module_init(init); +module_exit(fini); -- cgit v1.2.3