Something went wrong. Try again.
(I'm so sorry!) Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667// SPDX-License-Identifier: GPL-2.0-only/* Kernel module to match packet length. *//* (C) 1999-2001 James Morris <jmorros@intercode.com.au> */
#include <linux/module.h>#include <linux/skbuff.h>#include <linux/ipv6.h>#include <net/ip.h>
#include <linux/netfilter/xt_length.h>#include <linux/netfilter/x_tables.h>
MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");MODULE_DESCRIPTION("Xtables: Packet length (Layer3,4,5) match");MODULE_LICENSE("GPL");MODULE_ALIAS("ipt_length");MODULE_ALIAS("ip6t_length");
static boollength_mt(const struct sk_buff *skb, struct xt_action_param *par){ const struct xt_length_info *info = par->matchinfo; u32 pktlen = skb_ip_totlen(skb);
return (pktlen >= info->min && pktlen <= info->max) ^ info->invert;}
static boollength_mt6(const struct sk_buff *skb, struct xt_action_param *par){ const struct xt_length_info *info = par->matchinfo; u32 pktlen = skb->len;
return (pktlen >= info->min && pktlen <= info->max) ^ info->invert;}
static struct xt_match length_mt_reg[] __read_mostly = { { .name = "length", .family = NFPROTO_IPV4, .match = length_mt, .matchsize = sizeof(struct xt_length_info), .me = THIS_MODULE, }, { .name = "length", .family = NFPROTO_IPV6, .match = length_mt6, .matchsize = sizeof(struct xt_length_info), .me = THIS_MODULE, },};
static int __init length_mt_init(void){ return xt_register_matches(length_mt_reg, ARRAY_SIZE(length_mt_reg));}
static void __exit length_mt_exit(void){ xt_unregister_matches(length_mt_reg, ARRAY_SIZE(length_mt_reg));}
module_init(length_mt_init);module_exit(length_mt_exit);