为什么sk_buff的sk总是NULL
下面是代码:
#define __KERNEL__
#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/if_packet.h>
#include <linux/tcp.h>
#include <linux/jiffies.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/skbuff.h>
#include <linux/ip.h> /* For IP header */
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/in.h>
#include <net/tcp.h>
MODULE_LICENSE("GPL");
static struct nf_hook_ops nfho;
unsigned int hook_func(unsigned int hooknum,
struct sk_buff **pskb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
struct sk_buff *skb;
struct iphdr *iph;
struct tcphdr *th;
struct tcp_sock *tp;
int rtt;
// Just for easy read
if (!pskb || !(*pskb))
return NF_ACCEPT;
skb = *pskb;
if (skb->pkt_type != PACKET_HOST)
return NF_ACCEPT;
if (!pskb_may_pull(skb, sizeof(struct tcphdr)))
return NF_ACCEPT;
// Get iphdr
if (!(skb->nh.iph))
return NF_ACCEPT;
iph = skb->nh.iph;
// Let go if not TCP.
if (iph->protocol != IPPROTO_TCP)
return NF_ACCEPT;
// Let go if sanity check fail.
th = tcp_hdr(skb);
if (!(skb->sk)) {
printk(KERN_ALERT "skb->sk:%p, head:%p, data:%p, tail:%p, end:%p\n", skb->sk, skb->head, skb->data, skb->tail, skb->end);
printk(KERN_ALERT "len:%d, data_len:%d, truesize: %d, dest:%d, doff = %d, sizeof(struct tcphdr) = %d\n", skb->len, skb->data_len, skb->truesi
ze, ntohl(th->dest), th->doff, sizeof(struct tcphdr));
return NF_ACCEPT;
}
printk(KERN_ALERT "OK!");
return NF_ACCEPT;
}
int init_module()
{
nfho.hook = hook_func;
nfho.hooknum = NF_IP_LOCAL_IN;
nfho.pf = PF_INET;
nfho.priority = NF_IP_PRI_FIRST;
nf_register_hook(&nfho);
return 0;
}
void cleanup_module()
{
nf_unregister_hook(&nfho);
}
===========
下面是dmesg看到的输出结果:
skb->sk:0000000000000000, head:ffff81005ac4d000, data:ffff81005ac4d0cc, tail:ffff81005ac4d101, end:ffff81005ac4de80
len:53, data_len:0, truesize: 3952, dest:3473408, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff81005b5c8400, data:ffff81005b5c84ac, tail:ffff81005b5c84e0, end:ffff81005b5c8500
len:52, data_len:0, truesize: 496, dest:3407872, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff81005ac4d000, data:ffff81005ac4d0cc, tail:ffff81005ac4d24f, end:ffff81005ac4de80
len:387, data_len:0, truesize: 3952, dest:25362432, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff81005c1ae000, data:ffff81005c1ae0cc, tail:ffff81005c1ae6b4, end:ffff81005c1aee80
len:1512, data_len:0, truesize: 3952, dest:99090432, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff81005c8af000, data:ffff81005c8af0cc, tail:ffff81005c8af101, end:ffff81005c8afe80
len:53, data_len:0, truesize: 3952, dest:3473408, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff81005a3ea000, data:ffff81005a3ea0cc, tail:ffff81005a3ea101, end:ffff81005a3eae80
len:53, data_len:0, truesize: 3952, dest:3473408, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff81005c8af000, data:ffff81005c8af0cc, tail:ffff81005c8af24f, end:ffff81005c8afe80
len:387, data_len:0, truesize: 3952, dest:25362432, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff81005a486000, data:ffff81005a4860cc, tail:ffff81005a4866b4, end:ffff81005a486e80
len:1512, data_len:0, truesize: 3952, dest:99090432, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff81006151e800, data:ffff81006151e830, tail:ffff81006151e88c, end:ffff81006151e900
len:92, data_len:0, truesize: 496, dest:6029312, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff810060e05800, data:ffff810060e058ac, tail:ffff810060e058e0, end:ffff810060e05900
len:52, data_len:0, truesize: 496, dest:3407872, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff81005ae12000, data:ffff81005ae120cc, tail:ffff81005ae12101, end:ffff81005ae12e80
len:53, data_len:0, truesize: 3952, dest:3473408, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff810059dda000, data:ffff810059dda0cc, tail:ffff810059dda101, end:ffff810059ddae80
len:53, data_len:0, truesize: 3952, dest:3473408, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff81005a5c3000, data:ffff81005a5c30ac, tail:ffff81005a5c30e0, end:ffff81005a5c3100
len:52, data_len:0, truesize: 496, dest:3407872, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff810059dda000, data:ffff810059dda0cc, tail:ffff810059dda24f, end:ffff810059ddae80
len:387, data_len:0, truesize: 3952, dest:25362432, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff81005a0ce000, data:ffff81005a0ce0cc, tail:ffff81005a0ce6b4, end:ffff81005a0cee80
len:1512, data_len:0, truesize: 3952, dest:99090432, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff81005a5c3000, data:ffff81005a5c30ac, tail:ffff81005a5c30e0, end:ffff81005a5c3100
len:52, data_len:0, truesize: 496, dest:3407872, doff = 0, sizeof(struct tcphdr) = 20
skb->sk:0000000000000000, head:ffff81005f4bb000, data:ffff81005f4bb030, tail:ffff81005f4bb08c, end:ffff81005f4bb100
len:92, data_len:0, truesize: 496, dest:6029312, doff = 0, sizeof(struct tcphdr) = 20
=====
问题:
为什么skb->sk总是NULL呢?