LinuxQuestions.org
Visit Jeremy's Blog.
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Linux Forums > Linux - Software > Linux - Kernel
User Name
Password
Linux - Kernel This forum is for all discussion relating to the Linux kernel.

Notices


Reply
  Search this Thread
Old 04-10-2018, 08:56 PM   #1
915086731
Member
 
Registered: Apr 2010
Posts: 144
Blog Entries: 6

Rep: Reputation: 2
kernel_recvmsg crashes kernel when called


I want to implement a TCP server under linux kernel space. It can accept new connection, however, kernel hangs immediately when calling kernel_recvmsg to receive data.

Code:
#define BUFFSIZE 1024

int myserver(void)
{  

    struct socket *sock,*client_sock;  
    struct sockaddr_in s_addr;  
    unsigned short portnum=8888;  
    int ret=0;  

    memset(&s_addr,0,sizeof(s_addr));  
    s_addr.sin_family=AF_INET;  
    s_addr.sin_port=htons(portnum);  
    s_addr.sin_addr.s_addr=in_aton("192.168.0.70");  


    sock=(struct socket *)kmalloc(sizeof(struct socket),GFP_KERNEL);  
    client_sock=(struct socket *)kmalloc(sizeof(struct socket),GFP_KERNEL);  

    /*create a socket*/  
    ret=sock_create_kern(&init_net, AF_INET,SOCK_STREAM, IPPROTO_TCP,&sock);  

    /*bind the socket*/  
    ret=sock->ops->bind(sock,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));  
    if(ret<0){  
            printk("server: bind error\n");  
            return ret;  
    }  
    printk("server:bind ok!\n");  

    /*listen*/  
    ret=sock->ops->listen(sock,10);  
    if(ret<0){  
            printk("server: listen error\n");  
            return ret;  
    }  
    printk("server:listen ok!\n");  

    ret=sock->ops->accept(sock,client_sock,10);
    if(ret<0){  
            printk("server:accept error!\n");  
            return ret;  
    }  

    printk("server: accept ok, Connection Established\n");  

    /*kmalloc a receive buffer*/  
    char *recvbuf=NULL;  
    recvbuf=kmalloc(1024,GFP_KERNEL);  
    if(recvbuf==NULL){  
            printk("server: recvbuf kmalloc error!\n");  
            return -1;  
    }  
    memset(recvbuf, 0, sizeof(recvbuf));  

    /*receive message from client*/  
    struct kvec vec;  
    struct msghdr msg;  
    memset(&vec,0,sizeof(vec));  
    memset(&msg,0,sizeof(msg));  
    vec.iov_base=recvbuf;  
    vec.iov_len=1024;  
    msg.msg_flags=MSG_NOSIGNAL;
    msleep(1000);
/*hi, kernel hangs here!*/
    ret=kernel_recvmsg(client_sock,&msg,&vec,1,1024, msg.msg_flags);
    recvbuf[1023] = 0;
    printk("receive message:\n %s\n",recvbuf);  

    /*release socket*/  
    printk("release socket now\n");
    sock_release(client_sock);  
    sock_release(sock);  
    return ret;  
}  

static int server_init(void){  
    printk("server init:\n");  
    return (myserver());  
}
The above is the code. The following sentence hangs. My kernel version is 3.2.1. I use kgdb to debug kernel, gdb shows `received signal SIGSEGV, Segmentation fault.`

Code:
ret=kernel_recvmsg(client_sock,&msg,&vec,1,1024, msg.msg_flags);
 
Old 04-11-2018, 06:57 AM   #2
915086731
Member
 
Registered: Apr 2010
Posts: 144

Original Poster
Blog Entries: 6

Rep: Reputation: 2
I should use kernel_accept instead of sock->ops->accept, as kernel_accept does more work that initialize the sock->ops

ret=kernel_accept(sock,&client_sock,10);
 
  


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
kernel_recvmsg and kernel_send is taking so much time to receive data from server davidpreetham Linux - Networking 1 03-27-2018 10:38 AM
[SOLVED] Destructor called on objects in deque without it being called explicitly Snark1994 Programming 4 07-13-2011 08:05 AM
USB kernel module, how functions get called by kernel falmdavis Linux - Kernel 1 01-18-2011 01:58 PM
Slackware with new Kernel - rc.modules is called more than once? me-$-on Linux - Newbie 5 01-18-2011 02:35 AM
/sbin/init is not called by the kernel raklo Linux - Hardware 2 09-19-2006 05:31 AM

LinuxQuestions.org > Forums > Linux Forums > Linux - Software > Linux - Kernel

All times are GMT -5. The time now is 10:54 AM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration