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

请问下linux Kernel 下如何返回指针

    来源: 互联网  发布时间:2016-04-12

    本文导语:  相当奇怪,一旦涉及到地址返回系统就崩溃掉了,直接换成数据返回一切正常。请教高手。代码如下 红色部分是相关的函数代码 typedef struct temp1 {   __u8 prot ;//the protcol   __u32 sradd ;//the ip sourch address   __u32...

相当奇怪,一旦涉及到地址返回系统就崩溃掉了,直接换成数据返回一切正常。请教高手。代码如下
红色部分是相关的函数代码
typedef struct temp1
{
  __u8 prot ;//the protcol
  __u32 sradd ;//the ip sourch address
  __u32 dtadd ;//the ip destine address
  __u16 destport ;//the destine port
  __u16 sourport ;//the source port
}ipdata;

typedef struct temp
{
    
ipdata netdata;// the data we need now
unsigned char *counter;//the counter not used
unsigned char *later;//the vector not used
int key;//the key to found data
int length ;
struct temp *Next;//the pointer to the next member

}hashmember;

static ipdata ipcontent;//the variable to read the data
static hashmember hmember;
static hashmember *Chashtable[251];//the member in the hashtable
static hashmember *test;


bool FindValue(int key, hashmember *value) //The fuction to find the value;
{
bool ret = false;
int i = 0;
int num = key % 251;// decide the num in the array
if(num>0)
{
hashmember *phe = Chashtable[num]; //take the value out
        while(phe)
{
if(ilength)
{
if(phe->key == key)
{
value = phe;// Get the data we want, since in Kernel I could not use & I just use the variable.has
ret = true;
}
}
else
{
return ret;
}
i++;
phe = phe->Next;
}
}

return ret;
}
static unsigned int hook_main(unsigned int hooknum,
                              struct sk_buff **skb,
                              const struct net_device *in,
                              const struct net_device *out,
                              int (*okfn)(struct sk_buff *))
{
unsigned int ret = NF_ACCEPT;   /* flag to decide whether we drop this packet */
struct tcphdr *thead;//TCP struct
struct udphdr *thead1;//UDP struct
ipdata testdata;
//rwlock_t ipcontent = RW_LOCK_UNLOCKED;//protech the data
struct iphdr *iph;      /* ip header */
struct sk_buff *sb = *skb;
int eth=0; // ethernet interface index

/* since we use PF_INET during hook register, we only receive IP packets */
iph=(*skb)->nh.iph;     /* position the ip header pointer */

// Assuming the interface name is like eth0, take the last digit as number
if(in->name != NULL){
eth=in->name[3] - '0';
}

ALERT(0, "%s=%d", in->name, eth);


if(eth  MAX_INGRESS_IF)//|| eth > MAX_INGRESS_IF)
return NF_ACCEPT;
/* handle our ip packet here
 * (note:version verified; checksum has been checked) */

// things need to do in PRE routing stage
if (hooknum == NF_IP_PRE_ROUTING) {
// read_lock(&ipcontent);
//write the data to the ipcontent

ALERT(0, "Ipcontent");
ipcontent.prot = iph ->protocol;
ipcontent.sradd = iph->saddr;
ipcontent.dtadd = iph->daddr;


//read_unlock(&packetInCounterLock[eth]);
if(iph ->protocol == IPPROTO_TCP)//store the data if the protocol is TCP
{
thead = (struct tcphdr *)(sb->data +(sb->nh.iph->ihl*4));
ipcontent.sourport = thead->source;
ipcontent.destport = thead->dest;
}
if(iph ->protocol == IPPROTO_UDP)//store the data if the protocol is UDP
{
thead1 = (struct udphdr *)((*skb)->data +(iph->ihl*4));
ipcontent.sourport = thead1->source;
ipcontent.destport = thead1->dest;
}
hmember.counter = "x01";//store the later used variable with 1 in very bit.
hmember.later = "x01";


}

// things need to do in POST routing stage
//else if (hooknum == NF_IP_POST_ROUTING) {

//}
//Create the hashtable and insert the data.

ALERT(0, "Createkey");
Createkey(ipcontent,hmember.key,251);
hmember.netdata = ipcontent;
//ALERT(0, "%d",hmember.counter);
//ALERT(0, "Insert");
        Insert(hmember.key,hmember.netdata); 
FindValue(hmember.key,test);
        testdata = test->netdata;
if(iph ->protocol == IPPROTO_TCP)//store the data if the protocol is TCP
{
ALERT(0, "The proctocol is TCP");
}
else if(iph ->protocol == IPPROTO_UDP)//store the data if the protocol is UDP
{
ALERT(0, "The proctocol is UDP");
}
else
{
ALERT(0, "The proctocol is unknown");
}
[color=#FF0000]ALERT(0, "The sourseport is port %d.%d", NIPQUAD(testdata.sourport));
ALERT(0, "The destport is port %d.%d", NIPQUAD(testdata.destport));
ALERT(0, "The sourseaddress is %d.%d.%d.%d", NIPQUAD(testdata.sradd));
ALERT(0, "The destineaddress is %d.%d.%d.%d", NIPQUAD(testdata.dtadd));[/color]//



/* we can design whether we accpet or drop the packet
 * to drop this skb, just   return NF_DROP;
 * otherwise,               return NF_ACCEPT; */
return ret;
}

|
你的Chashtable[251]是一个全局静态指针数组,我在你的代码里面好像没有看到给每个数组元素(指针)初始化的地方!
如果没有初始化,那么Chashtable[num]就为NULL,所以,你将它作为返回值使用会有段错误!

另外,你的代码中的对FindValue的指针返回值需要做一个不为空的检测!如下
FindValue(hmember.key,test); 
if(NULL != test)
{  
    printk ("DBG: Got the data!n");
    testdata = test->netdata; 
   ...
}
...

 good luck!

|
哦,那是因为你定义的是静态变量,只在这个文件内起作用,你想把这个地址传出去,让外界来直接访问这个静态数据是不可以的。


    
 
 

您可能感兴趣的文章:

  • 请问如何在linux (redhat)下传递一维数组指针?
  • 请问如何根据函数指针打印出这个函数的名称?
  • 请问用JBuilder开发Applet,如果把鼠标指针变成漏斗?
  • 请问一个方法的返回值类型为一个复数,那么怎样定义这个方法的返回值类型 iis7站长之家
  • 请问return语句会执行哪些操作?在函数中return一个已分配内存的指针,该指针所占用的内存会释放吗?
  • 请问ResultSet返回的是全部数据,还是指针,还是其他什么?
  • 请问:linux下如何将一个类的指针作为参数传给pthread_create创建的线程?
  • 请问在脚本里怎么得到一个程序运行的返回值,脚本怎么返回值?
  • 请问applet怎么能与所在的页面进行通讯 即从页面中取得变量和把返回值返回给页面?
  • 请问一个方法的返回值类型为一个复数,那么怎样定义这个方法的返回值类型
  • 请问JDBC中返回结果参数的存储过程{?=call 过程名(?,?,...)}返回的结果如何得到?
  • 公司要给客户做报表,从数据库返回数据,他们死活要返回的格式为Excel格式,请问我怎样才能把数据库返回的数据存为Excel的格式?
  • Accept() 返回0,请问是怎么回事 ?
  • 请问怎样从命令控制台返回到xwindow?
  • 请问exec系列函数在执行时是立即返回还是有可能阻塞那?
  • 请问一下sleep_on_timeout函数的返回直问题(在线等)
  • 请问gcc有没有类似GetExitCodeProcess的函数,可以获得调用的外部程序的返回值呢?
  • 请问调用notify后被选中线程的wait是立刻返回,还是等到调用notify的线程退出synchronized块后再返回?
  • 请问调用那个方法能够得到变量类型的返回值?
  • 请问一个shell脚本如何返回值?谢谢!
  • 请问内核代码中的返回值问题
  • 请问发送数据成功后返回的ack是在内核的什么地方处理的?
  • 请问如何用wireshark查看http返回的内容
  • 请问:SCO UNIX下SOCKET的recv返回-1,errno=9?在线等·····
  • 请问 如何得到 wget http://11.php --spider 的返回值
  • 请问怎么在JavaBean的函数中返回几个值,然后供JSP调用呢?
  • 请问java中如何在捕获一个违例之后再返回到发生违例的地方?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问Linux Kernel RD工程师是干什么工作,最好具体点?
  • 我有一个RedHat7.2 的内核升级文件kernel.zip.请问如何做生机,具体怎么操作.
  • 请问怎样将linux kernel 从2.4.20 降到2.4.18??
  • 请问linux能把bootloader,kernel,fs打包在一起吗
  • 请问 Linux kernel Memory Management API,有哪些?在哪儿能找到用法?谢谢
  • 请问Kernel与ramdisk的关系?
  • 请问哪里有rh kernel2.5以上的内核版本下载啊?(最好教育网内)
  • 请问kernel panic中的panic是什么意思?
  • 请问在redhat-linux7.2中如何改系统参数,如SEMMNU等,这些在/proc/sys/kernel/目录中没有的。??
  • 请问s3c2443 lay 出板子,linux kernel那些souce code要改哪些地方?
  • 请问大侠: 2.4下应用程序(user space)传大量数据给内核模块(kernel space)的可选方法和最佳方法.
  • 请问怎样实现在易PC上的驱动开发环境,比如在kernel release目录下添加上BUILD目录?
  • 请问linux中的arch/i386/kernel/head.S的汇编语言是用什么编译的
  • 紧急求救!!!请问怎样重新加载Linux的内核Kernel软件包,恢复grub从/dev/hda5的第一个扇区的启动?
  • 请问:怎样写一个linux的系统调用,模块或写到kernel都行
  • 再加100分!吐血求救了!请问怎样重新加载Linux的内核Kernel软件包,恢复grub从/dev/hda5的第一个超级块扇区的启动?
  • 请问:我知道路由器的telnet密码,但忘记了enable 密码,请问如何是好?
  • 请问那里有SYBASE的jbdb 2.0下载;jspsmartupload可以直接将文件上传到数据库,请问如何使用
  • 请问最新的reahat9.0是基于什么核心的?2.4?2.6?请问那里能下载?
  • 请问:请问哪里有关于linux基本操作命令讲解的资料下载,最好是幻灯片格式的.
  • 请问,我试图用#admintool&图形工具命令来安装sun workshop5.0,为什么进入的却是用户管理界面?请问具体该如何在solaris下安装应用软件
  • 请问在Redhat 9里,我从登录就是图形介面,请问如何在图形介面内进入命令行方式呢,谢谢
  • 请问玩过SOLARIS的高手门,在不正常关机后,就不能启动到windows公用桌面了,只能在命令提示模式下了,请问怎么解决这个问题啊?急~!~!
  • 请问:我在redhat下装了bochs-2.2.1-1.rpm,.装了后,想设置一下,但找不到bochsrc.fda.bxrc,请问这个文件在哪个曰录下啊。
  • 请问:在配置Qt时,很多文档都说在.profile,.login里加东西,但是我好像没有发现有这两个文件上,请问这些文件在哪个目录下啊
  • 请问:在GCC里的C程序里的变量的声明是不是只能在前面,而且相同类型的变量的声明只能放在一起?如果不是,请问怎么样可以解决这个问题.
  • 请问各位大虾,小弟今天开始学jsp了,这学期我们有java课,所以已经下载了jdk(好象是1.2),请问我的98环境怎么配置jsp环境呀?我的jdk可以运行.java程序,别的我就不知道了....谢谢!
  • 主机是WIN2000,我用的是LUNIX,请问是否可以共享上网? 如果可以请问如何设置? 500分答谢,龟儿食言!
  • 请问linux下GUI开发的问题!
  • 请问出现fstab文件丢失该怎么修复呀?
  • 请问这个方法如何调用?


  • 站内导航:


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

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

    浙ICP备11055608号-3