Hello,
 The following module creates a UDP kernel socket which calls sock_recvms.
after insmoding the module ,
netstat -nl | grep 4000 shows that indeed a socket was created and that it
listens on port 4000.
However, after running rmmod  on the module, it does **not** close the socket.
netstat -nl | grep 4000 shows that it **does** exist; the "rmmod"
itself hangs, and
there are no kernel messages.
Any ideas?

The code of the module is below:

static int createUdpInSocket(void)
{
        int res;
        struct sockaddr_in server;
        int servererror;
        unsigned char *buf;
        printk( KERN_ERR "createUdpInSocket\n" );

        if( sock_create( PF_INET,SOCK_DGRAM,IPPROTO_UDP,&udpInserversocket)<0 ) 
{
                printk(KERN_ERR "server: Error creating udpserversocket.\n" );
                return -EIO;
        }
        server.sin_family      = AF_INET;
        server.sin_addr.s_addr = INADDR_ANY;
        server.sin_port = htons((unsigned short)4000);
        servererror = udpInserversocket->ops->bind(udpInserversocket,
                        (struct sockaddr *) &server, sizeof(server) );
                {
                struct msghdr msg;
                struct iovec iov;
                mm_segment_t oldfs;
                int size = 0;
                int len = 160;
                iov.iov_base = buf;
                msg.msg_flags = 0;
                msg.msg_name = &server;
                msg.msg_namelen  = sizeof(struct sockaddr_in);
                msg.msg_control = NULL;
                msg.msg_controllen = 0;
                msg.msg_iov = &iov;
                msg.msg_iovlen = 1;
                msg.msg_control = NULL;

                oldfs = get_fs();
                set_fs(KERNEL_DS);
                printk("before sock_recvmsg in %s %s\n",__FUNCTION__,__FILE__);
                size = sock_recvmsg(udpInserversocket,&msg,len,msg.msg_flags);
                printk("after sock_recvmsg in %s %s\n",__FUNCTION__,__FILE__);
                set_fs(oldfs);

                }
}


static int kernThread(void *arg)
{
        allow_signal(SIGKILL);

  createUdpInSocket();

        return 0;
}


static int __init nic_init(void)
        {
        int ret;        
        void *kdata;
        p = kthread_run(kernThread,kdata,"myKernThread");
                
        return 0;       
        }

//////////////////////////////////////////////////////////////////////////////

static void __exit nic_exit(void)
        {
        printk("in nic_exit\n");
  if (p)
          kthread_stop(p);

        if (udpInserversocket)
                sock_release(udpInserversocket);                

        }

        
//////////////////////////////////////////////////////////////////////////////

module_init(nic_init)
module_exit(nic_exit)

Regards,
Mark Ryden

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to [email protected]
Please read the FAQ at http://kernelnewbies.org/FAQ

Reply via email to