static void gannet_recvloop(void) { int size; int bufsize = 1600; unsigned char buf[bufsize + 1]; /* Kernal 3.0 Changes Start */ static DEFINE_MUTEX(ker_lock_mutex); /* kernel thread initialization */ // lock_kernel(); ==> Commenting this line since in Kernal 3.0 this feature has been removed. mutex_lock(&ker_lock_mutex); /* Kernal 3.0 Changes End */ current->flags |= PF_NOFREEZE; /* daemonize (take care with signals, after daemonize they are disabled) */ daemonize(MODULE_NAME); allow_signal(SIGKILL); /* Kernal 3.0 Changes Start */ // unlock_kernel(); ==> Commenting this line since in Kernal 3.0 this feature has been removed mutex_unlock(&ker_lock_mutex); /* Kernal 3.0 Changes End */ /* main loop */ while (!gthreadquit) { memset(&buf, 0, bufsize + 1); size = ksocket_receive(gthread->priv->rx_sock, >hread->priv->rx_addr, buf, bufsize); if (signal_pending(current)) break; if (size < 0) { printk(KERN_ERR MODULE_NAME "gannet: error getting datagram, " "sock_recvmsg error = %d\n", size); } else { /* send to kernel */ rx(buf, size); } } printk(KERN_INFO "gannet thread exit\n"); }
static void gannet_recvloop(void) { int size; int bufsize = 1600; unsigned char buf[bufsize + 1]; /* kernel thread initialization */ lock_kernel(); current->flags |= PF_NOFREEZE; /* daemonize (take care with signals, after daemonize they are disabled) */ daemonize(MODULE_NAME); allow_signal(SIGKILL); unlock_kernel(); /* main loop */ while (!gthreadquit) { memset(&buf, 0, bufsize + 1); size = ksocket_receive(gthread->priv->rx_sock, >hread->priv->rx_addr, buf, bufsize); if (signal_pending(current)) break; if (size < 0) { printk(KERN_ERR MODULE_NAME "gannet: error getting datagram, " "sock_recvmsg error = %d\n", size); } else { /* send to kernel */ rx(buf, size); } } printk(KERN_INFO "gannet thread exit\n"); }
static int one_udp_thread( void *arg ) { OneUDP *udp = arg; int size; OneUDPMessage *message; struct sched_param param; param.sched_priority = 50; sched_setscheduler( current, SCHED_FIFO, ¶m ); /* kernel thread initialization */ udp->running = 1; printk(KERN_DEBUG "One/UDP: listening on port %d\n", ONE_PORT); message = kmalloc( sizeof(OneUDPMessage), GFP_KERNEL ); if (!message) { printk( KERN_ERR "One/UDP: could not allocate %zu bytes for receiving messages\n", sizeof(OneUDPMessage) ); return -ENOMEM; } /* main loop */ while (!kthread_should_stop()) { size = ksocket_receive( udp->sock, &udp->addr, message, sizeof(OneUDPMessage) ); if (signal_pending(current)) break; if (size < 0) printk(KERN_DEBUG "One/UDP: error getting datagram, sock_recvmsg error = %d\n", size); else { int ret; OneQueueDispatch dispatch; struct iovec iov; ONE_DEBUG( "UDP: Received %d bytes\n", size); switch (message->type) { case OUMT_DISPATCH: ONE_DEBUG( " -> DISPATCH\n" ); ONE_DEBUG( " queue_id: 0x%08x\n", message->dispatch.header.queue_id ); ONE_DEBUG( " flags: 0x%08x\n", message->dispatch.header.flags ); ONE_DEBUG( " size: %u\n", message->dispatch.header.size ); ONE_DEBUG( " uncompressed: %u\n", message->dispatch.header.uncompressed ); if (message->dispatch.header.flags) { printk(KERN_ERR "One/UDP: unsupported flags!\n" ); break; } if (message->dispatch.header.uncompressed > ONE_MAX_PACKET_SIZE) { printk(KERN_ERR "One/UDP: uncompressed > ONE_MAX_PACKET_SIZE!\n" ); break; } if (message->dispatch.header.size > message->dispatch.header.uncompressed) { printk(KERN_ERR "One/UDP: size (%u) > uncompressed (%u)!\n", message->dispatch.header.size, message->dispatch.header.uncompressed ); break; } one_core_lock( one_core ); dispatch.header = message->dispatch.header; dispatch.iov = &iov; dispatch.iov_count = 1; iov.iov_base = message->dispatch.buf; iov.iov_len = message->dispatch.header.size; ret = one_queue_dispatch( NULL, &dispatch ); if (ret) printk(KERN_ERR "One/UDP: dispatch error %d!\n", ret ); one_core_unlock( one_core ); break; case OUMT_ATTACH: ONE_DEBUG( " -> ATTACH\n" ); break; case OUMT_DETACH: ONE_DEBUG( " -> DETACH\n" ); break; default: printk(KERN_ERR "One/UDP: unknown message type 0x%08x!\n", message->type ); break; } } } kfree( message ); return 0; }