关于sk_buff的问题
我写了小程序:但是对于sk_buff中的操作有问题,unsigned char * p_ch_addr = &(p_skb -> nh.iph -> saddr)就是对的,而unsigned char *
p_ch_port =&(p_skb->h.th->dest)j就是错的,我看了看raodan翻译的深入Linux网络核心堆栈中使用的是
struct tcphdr * thread;
thread = (struct tcphdr *)(p_skb->data + p_skb->nh.iph->ihl *4);
if((thread->dest) == *((unsigned short *)p_ch_dest_port))但是这样还是会有问题错误是dereferencing pointer to incomplete type,
还有我使用sk_buff中的h.icmph->checksum +=1;没有问题但是如果使用的是tcp的头中的check又会出现上面的错误信息,请那位大侠帮帮忙解释解释为什么错?
代码如下
int filter_rcv(struct sk_buff * p_skb, struct device * p_dv,struct packet_type * p_pt)
{
struct tcphdr * thread;
p_ch_access_ip[0]="\xc0\xa8\x00\x07";
p_ch_access_ip[1]="\xc0\xa8\x00\xd3";
p_ch_access_ip[2]="\xc0\xa8\x00\xb0";
if((PACKET_HOST == p_skb -> pkt_type ) && (__constant_htons(ETH_P_IP) ==p_skb->protocol))
{
if((4 == p_skb->nh.iph->version) && (IPPROTO_TCP == p_skb->nh.iph->protocol))
{
// char * p_ch_data=(unsigned char *)&(p_skb->h.th->source);
// printk("%c \n",p_skb->h.th->source);
thread = (struct tcphdr *)(p_skb->data + p_skb->nh.iph->ihl *4);
if((thread->dest) == *((unsigned short *)p_ch_dest_port))
{
if((p_skb->nh.iph->saddr !=*(unsigned int *)p_ch_access_ip[0])&&(p_skb->nh.iph->saddr != *(unsigned int *)p_ch_access_ip[1])&&(p_skb->nh.iph->saddr !=*(unsigned int *)p_ch_access_ip[2]))
{
unsigned char * p_ch_addr = &(p_skb -> nh.iph -> saddr);
printk("saddr is %d.%d.%d.%d in telnet \n",*(p_ch_addr),*(p_ch_addr+1),*(p_ch_addr+2),*(p_ch_addr+3));
p_skb->h.th->check +=1;
}
}
}
}
kfree_skb(p_skb);
return(0);
}