[英]How to get next TCP segment in linux kernel module?
我知道我可以这样获得TCP数据包数据的指针:
char *data = (char *)tcphdr + 4 * tcph->doff;
但是,一旦数据被分割,我就无法以这种方式获取完整的数据。 那么,如何获取下一个片段的下一个sk_buff
?
我的简单代码:
#include ...
static struct nf_hook_ops nfho;
unsigned int hook_funcion(void *priv, struct sk_buff *skb, const struct
nf_hook_state *state)
{
// check if it is TCP packet
char *data = (char *)tcphdr + 4 * tcph->doff;
// do something here
return NF_ACCEPT;
}
static int __init hook_init(void)
{
int ret;
nfho.hook = hook_funcion;
nfho.pf = NFPROTO_IPV4;
nfho.hooknum = NF_INET_POST_ROUTING;
nfho.priority = NF_IP_PRI_LAST;
ret = nf_register_hook(&nfho);
printk("xmurp-test start\n");
printk("nf_register_hook returnd %d\n", ret);
return 0;
}
static void __exit hook_exit(void)
{
nf_unregister_hook(&nfho);
printk("xmurp-test stop\n");
}
module_init(hook_init);
module_exit(hook_exit);
您的问题有点复杂,因为TCP中没有“完整数据”这样的东西,因为TCP是流协议,而不是数据报协议(与UDP相反)。 这意味着数据没有特定的末端(除非连接已关闭/重置)。
如果要处理将TCP流分割为大小消息(例如HTTP)的应用程序层协议,则应执行以下步骤:
请记住,网络工作在数据报中 ,TCP是一种流协议。 因此,很可能在处理第一个段时,其余数据尚未到达。 因此,您必须对此特定流上的此数据包和将来的数据包进行碎片整理(碎片整理),然后才能解析上层协议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.