当前位置:  技术问答>linux和unix

在内核模块级缓冲UDP的问题(当然不是SOCKET编程了。)

    来源: 互联网  发布时间:2015-03-04

    本文导语:  毕设在写LINUX内核模块。现在碰到一个问题。 总目标:在一个截包函数中缓冲所有UDP包。 截包函数如下。 tatic unsigned int mipv6_intercept(//一个截包的函数         unsigned int hooknum, struct sk_buff **p_skb,//在/usr/src/...

毕设在写LINUX内核模块。现在碰到一个问题。

总目标:在一个截包函数中缓冲所有UDP包。

截包函数如下。

tatic unsigned int mipv6_intercept(//一个截包的函数
        unsigned int hooknum,
struct sk_buff **p_skb,//在/usr/src/linux-2.4.20的linux目录下skbuff.h里定义,很好的一结构。在这里主要用它,具体结构见最后
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
struct sk_buff *skb = (p_skb) ? *p_skb : NULL;
struct ipv6hdr *ipv6h;
struct in6_addr *daddr, *saddr;
__u8 nexthdr;
int nhoff;

if(skb == NULL) return NF_ACCEPT;

ipv6h = skb->nh.ipv6h;
daddr = &ipv6h->daddr;
saddr = &ipv6h->saddr;
nexthdr = ipv6h->nexthdr;//第一个是IP6包头,nexthdr是下一个包头的类型。
//---------以下----有关ICMPV6包的----------可不管---------
         if (ipv6_ext_hdr(nexthdr)) 
nhoff = ipv6_skip_exthdr(skb, nhoff, &nexthdr, 
skb->len - sizeof(*ipv6h));

/*
 * Possible ICMP packets are checked to ensure that all neighbor 
 * solicitations to MNs home address are handled by the HA.
 */
if (nexthdr == IPPROTO_ICMPV6) {
struct icmp6hdr *icmp6h;
int dest_type;

if (nhoff nh.raw[nhoff];

/* HA has to capture all unicast 单播neighbour solicitations in 
   order to check if it is acting as a proxy for the target 
   address. */

if ((dest_type & IPV6_ADDR_UNICAST) && 
    icmp6h->icmp6_type == NDISC_NEIGHBOUR_SOLICITATION) {
ip6_input(skb);
return NF_STOLEN;

}
//---------以上----有关ICMPV6包的----可不管---------------



//---------以下为UDP包的外理-----------------------
if (nexthdr == 17)//17=0x11就是说这个是UDP包,我要缓冲它
{
    printk("this is a udp packet n");
//之后我想打出这个UDP包的内容,缓冲这个UDP包等。
//怎么写???
我想随便打几个结构里的信息出来看看都说错。(模仿系统里UDP.c中的写法)
struct udphdr *uh;
printk("udphdr's source=%dn",uh->source);//在编译模块时说错:dereference pointer to incomplete type

//------------------以上为UDP包处理--------没完成-不会写了------
}
以下为SK_BUFF的结构,含有传输层,网络层,链路层 3层中各种协议的结构,巨好。
struct sk_buff {
/* These two members must be first. */
struct sk_buff * next; /* Next buffer in list  */
struct sk_buff * prev; /* Previous buffer in list  */

struct sk_buff_head * list; /* List we are on */
struct sock *sk; /* Socket we are owned by  */
struct timeval stamp; /* Time we arrived */
struct net_device *dev; /* Device we arrived on/are leaving by */

/* Transport layer header */
union
{
struct tcphdr *th;
struct udphdr  *uh;
struct icmphdr *icmph;
struct igmphdr *igmph;
struct iphdr *ipiph;
struct spxhdr *spxh;
unsigned char *raw;
} h;

/* Network layer header */
union
{
struct iphdr *iph;
struct ipv6hdr *ipv6h;
struct arphdr *arph;
struct ipxhdr *ipxh;
unsigned char *raw;
} nh;
  
/* Link layer header */
union 
{
   struct ethhdr *ethernet;
   unsigned char  *raw;
} mac;

struct  dst_entry *dst;

/* 
 * This is the control buffer. It is free to use for every
 * layer. Please put your private variables there. If you
 * want to keep them across layers you have to do a skb_clone()
 * first. This is owned by whoever has the skb queued ATM.
 */ 
char cb[48];  

unsigned int  len; /* Length of actual data */
  unsigned int  data_len;
unsigned int csum; /* Checksum  */
unsigned char  __unused, /* Dead field, may be reused */
cloned,  /* head may be cloned (check refcnt to be sure). */
   pkt_type, /* Packet class */
   ip_summed; /* Driver fed us an IP checksum */
__u32 priority; /* Packet queueing priority */
atomic_t users; /* User count - see datagram.c,tcp.c  */
unsigned short protocol; /* Packet protocol from driver.  */
unsigned short security; /* Security level of packet */
unsigned int truesize; /* Buffer size  */

unsigned char *head; /* Head of buffer  */
unsigned char *data; /* Data head pointer */
unsigned char *tail; /* Tail pointer */
unsigned char  *end; /* End pointer */

void  (*destructor)(struct sk_buff *); /* Destruct function */
#ifdef CONFIG_NETFILTER
/* Can be used for communication between hooks. */
        unsigned long nfmark;
/* Cache info */
__u32 nfcache;
/* Associated connection, if any */
struct nf_ct_info *nfct;
#ifdef CONFIG_NETFILTER_DEBUG
        unsigned int nf_debug;
#endif
#endif /*CONFIG_NETFILTER*/

#if defined(CONFIG_HIPPI)
union{
__u32 ifield;
} private;
#endif

#ifdef CONFIG_NET_SCHED
       __u32           tc_index;               /* traffic control index */
#endif
};






|

else if (nexthdr==17)
{
printk("tzh UDP :nexthdr=%d  ",nexthdr);
printk("tzhbuf=%dn",tzhbuf);

//failed
//u32 ulen=0;
struct udphdr *udp6h;
int dest_type;

printk(" ##3#%d###",nhoff);

if (nhoff nh.raw[nhoff];

      printk(" ##4#%d###",nhoff);


//printk("dup6h%dn",udp6h);
printk("tzh udphdr's source port =%un",ntohs(udp6h->source));
printk("tzh udphdr's dest port=%un",ntohs(udp6h->dest));
printk("tzh udphdr's length=%un",ntohs(udp6h->len));
printk("tzh udphdr's check=%un",ntohs(udp6h->check));

//__u16 * data=(__u16*)&skb->h.raw[sizeof(struct udphdr)];
__u16 * data=((__u16*)udp6h+sizeof(struct udphdr)/2);
int haha=sizeof(struct udphdr); 
printk("data%dn",haha);

//data[14]='';
int i;
for(i=0;i

    
 
 

您可能感兴趣的文章:

  • linux内核缓冲区与进程缓冲区。
  • 为什么IO函数要把内容从内核缓冲区拷贝到用户缓冲区? 有点浪费
  • 如何确定数据已经从内核缓冲区写入磁盘了?
  • linux内核采用了几种缓冲技术?
  • 内核,标准I/O库,缓冲,他们是什么关系?
  • *******是不是对内核模块编程然后再重新编译内核就可以把此模块整合到linux系统中
  • 内核模块跟内核版本不匹配????????
  • [求教]内核加载模块后,这部分内容编译在内核里的吗?
  • 谁能提供kgdb内核补丁内核模块的下载
  • 驱动模块可以编入内核,想单独编译成模块,makefile怎么写?
  • 大侠帮忙!模块调试(非内核模块)
  • 想删除内核中的一个模块,输入命令后,系统提示该模块不存在。但是我lsmod时,它在/proc/modules中。求解。
  • 求内核和用户态简单易行的通信方法,用户态只需得到一个内核模块参数
  • 内核模块是什么东西,怎么理解呢
  • Linux 内核模块编程问题!!!!
  • 内核模块和设备驱动的区别?
  • 怎么给内核加载自己编写的模块
  • 自定义内核模块禁止启动图形界面
  • 内核模块的问题
  • 升级内核之后,模块加载问题
  • 模块如何被内核调用的?
  • linux内核中网络模块的学习
  • 如何想向内核添家一个自定义的模块?
  • rndis驱动编译成内核模块
  • 内核模块编程打印进程信息
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux内核中影响tcp三次握手的一些协议配置
  • Fedora Core 2自带的内核升级程序下载下来内核后,要不要再编译一遍内核?
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 进程内核栈和操作系统内核栈的关系
  • CentOS 6内核升级:下载编译启用新内核版本详细过程
  • Linux中内核线程不访问内核态地址空间?
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • 2.6内核下编译2.4内核
  • linux内核中的likely宏和unlikely宏介绍及用法
  • 编译新内核后怎么进入原来内核
  • CentOS 6.5 下载地址及如何升级内核(kernel)版本到 3.10.28
  • linux内核中的likely宏和unlikely宏介绍及用法 iis7站长之家
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • 请教:如何安装新内核(rpm包)而不同原来得内核冲突?? 在线等待!!
  • docker使用的技术之Container内核原理介绍
  • linux为什么要升级内核?升级内核有何作用?
  • 内核升级后,如何在新的内核中加载显卡驱动?
  • 内核源码和结果make过的内核源码有什么区别
  • 不重新编译内核能修改内核函数吗?
  • 如何学好内核?学了内核能应用于哪方面?
  • 请问在2.6的内核环境下编译2.4的内核有没有什么特殊的要求


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3