Ejemplo n.º 1
0
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,
					   &gthread->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");
}
Ejemplo n.º 2
0
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,
					   &gthread->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");
}
Ejemplo n.º 3
0
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, &param );

     /* 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;
}