Example #1
0
static int make_server_socket (void)
{
	int ret;
	struct sockaddr_in sin;

	ret = sock_create (AF_INET, SOCK_STREAM, 0, &sock);
	if (ret)
		goto err;

	sin.sin_family = AF_INET;
	sin.sin_port = htons (PORT);
	sin.sin_addr.s_addr = 0;

	ret = kernel_bind (sock, (struct sockaddr*)&sin, sizeof (sin));
	if (ret)
		goto err;

	ret = kernel_listen (sock, 1024);
	if (ret)
		goto err;

	schedule_work (&sock_accept);

	return 0;
err:
	if (sock)
		sock_release (sock);
	return ret;
}
Example #2
0
static int make_server_socket (void)
{
	int res;
	struct sockaddr_in sin;

	res = sock_create (AF_INET, SOCK_STREAM, 0, &sock);

	if (res < 0)
		goto err;

	sin.sin_family = AF_INET;
	sin.sin_port = htons (PORT);
	sin.sin_addr.s_addr = 0;

	res = kernel_bind (sock, (struct sockaddr*)&sin, sizeof (sin));

	if (res)
		goto err;

	res = kernel_listen (sock, 256);

	if (res)
		goto err;

	return 0;

err:
	if (sock)
		sock_release (sock);
	return res;
}
Example #3
0
File: rxrpc.c Project: krzk/linux
/*
 * open an RxRPC socket and bind it to be a server for callback notifications
 * - the socket is left in blocking mode and non-blocking ops use MSG_DONTWAIT
 */
int afs_open_socket(struct afs_net *net)
{
	struct sockaddr_rxrpc srx;
	struct socket *socket;
	unsigned int min_level;
	int ret;

	_enter("");

	ret = sock_create_kern(net->net, AF_RXRPC, SOCK_DGRAM, PF_INET6, &socket);
	if (ret < 0)
		goto error_1;

	socket->sk->sk_allocation = GFP_NOFS;

	/* bind the callback manager's address to make this a server socket */
	memset(&srx, 0, sizeof(srx));
	srx.srx_family			= AF_RXRPC;
	srx.srx_service			= CM_SERVICE;
	srx.transport_type		= SOCK_DGRAM;
	srx.transport_len		= sizeof(srx.transport.sin6);
	srx.transport.sin6.sin6_family	= AF_INET6;
	srx.transport.sin6.sin6_port	= htons(AFS_CM_PORT);

	min_level = RXRPC_SECURITY_ENCRYPT;
	ret = kernel_setsockopt(socket, SOL_RXRPC, RXRPC_MIN_SECURITY_LEVEL,
				(void *)&min_level, sizeof(min_level));
	if (ret < 0)
		goto error_2;

	ret = kernel_bind(socket, (struct sockaddr *) &srx, sizeof(srx));
	if (ret == -EADDRINUSE) {
		srx.transport.sin6.sin6_port = 0;
		ret = kernel_bind(socket, (struct sockaddr *) &srx, sizeof(srx));
	}
	if (ret < 0)
		goto error_2;

	rxrpc_kernel_new_call_notification(socket, afs_rx_new_call,
					   afs_rx_discard_new_call);

	ret = kernel_listen(socket, INT_MAX);
	if (ret < 0)
		goto error_2;

	net->socket = socket;
	afs_charge_preallocation(&net->charge_preallocation_work);
	_leave(" = 0");
	return 0;

error_2:
	sock_release(socket);
error_1:
	_leave(" = %d", ret);
	return ret;
}
int listen(SOCKET socket_p, int backlog)
{
int rc;

#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 10)
    rc = kernel_listen(socket_p, backlog);
#else
    rc = -1;
#endif

    return rc;
}
Example #5
0
int app_glue_v4_listen(struct socket *sock)
{
	if(sock->sk) {
		sock->sk->sk_state_change = app_glue_sock_wakeup;
	}
	else {
		syslog(LOG_CRIT,"FATAL %s %d\n",__FILE__,__LINE__);exit(0);
	}
	if(kernel_listen(sock,32000)) {
		syslog(LOG_ERR,"cannot listen %s %d\n",__FILE__,__LINE__);
		return -1;
	}
	return 0;
}
Example #6
0
int
lnet_sock_listen(struct socket **sockp, __u32 local_ip, int local_port,
		 int backlog)
{
	int fatal;
	int rc;

	rc = lnet_sock_create(sockp, &fatal, local_ip, local_port);
	if (rc) {
		if (!fatal)
			CERROR("Can't create socket: port %d already in use\n",
			       local_port);
		return rc;
	}

	rc = kernel_listen(*sockp, backlog);
	if (!rc)
		return 0;

	CERROR("Can't set listen backlog %d: %d\n", backlog, rc);
	sock_release(*sockp);
	return rc;
}
Example #7
0
File: rxrpc.c Project: krzk/linux
/*
 * close the RxRPC socket AFS was using
 */
void afs_close_socket(struct afs_net *net)
{
	_enter("");

	kernel_listen(net->socket, 0);
	flush_workqueue(afs_async_calls);

	if (net->spare_incoming_call) {
		afs_put_call(net->spare_incoming_call);
		net->spare_incoming_call = NULL;
	}

	_debug("outstanding %u", atomic_read(&net->nr_outstanding_calls));
	wait_var_event(&net->nr_outstanding_calls,
		       !atomic_read(&net->nr_outstanding_calls));
	_debug("no outstanding calls");

	kernel_sock_shutdown(net->socket, SHUT_RDWR);
	flush_workqueue(afs_async_calls);
	sock_release(net->socket);

	_debug("dework");
	_leave("");
}
Example #8
0
int mempool_listen_thread(void *data)
{
    int ret = KERERR_SUCCESS;
	struct mempool_dev *dev = (struct mempool_dev *)data;
	struct socket *cli_sock = NULL, *data_sock = NULL;
	struct client_host *clihost = NULL;
	int sockaddrlen = sizeof(struct sockaddr);

	if(!dev) {
		goto null_ptr_error; 
	}
	//init mempool listen socket
    ret = sock_create_kern(PF_INET, SOCK_STREAM, IPPROTO_TCP, &(dev->listen_sock));
    if (ret < 0) {
        KER_DEBUG(KERN_ALERT "mempool listen thread: TCP  create listen sock err, err=%d\n", ret);
        goto create_error;
    }
    dev->listen_sock->sk->sk_reuse = 1;
    ret = sock_create_kern(PF_INET, SOCK_STREAM, IPPROTO_TCP, &(dev->data_listen_sock));
    if (ret < 0) {
        KER_DEBUG(KERN_ALERT "mempool listen thread: TCP  create listen sock err, err=%d\n", ret);
        goto create_data_error;
    }
    dev->data_listen_sock->sk->sk_reuse = 1;

	//bind to interwork interface
    ret = bind_to_device(dev->listen_sock, MEMPOOL_IF_NAME, SERHOST_LISTEN_PORT);
    if (ret < 0) {
        KER_DEBUG(KERN_ALERT "mempool listen thread: Bind to %s err, err=%d\n", MEMPOOL_IF_NAME, ret);
        goto bind_error;
    }
    ret = bind_to_device(dev->data_listen_sock, MEMPOOL_IF_NAME, DATA_PORT);
    if (ret < 0) {
        KER_DEBUG(KERN_ALERT "mempool listen thread: Bind to %s err, err=%d\n", MEMPOOL_IF_NAME, ret);
        goto bind_data_error;
    }
	//begin listen
    ret = kernel_listen(dev->listen_sock, LISTEM_MAX_QUEUE);
    if (ret < 0) {
        KER_DEBUG(KERN_ALERT "mempool thread: sock listen err, err=%d\n", ret);
        goto listen_error;
    }
    ret = kernel_listen(dev->data_listen_sock, LISTEM_MAX_QUEUE);
    if (ret < 0) {
        KER_DEBUG(KERN_ALERT "mempool thread: sock listen err, err=%d\n", ret);
        goto listen_data_error;
    }
	//accept loop
	while(!kthread_should_stop()) {
        schedule_timeout_interruptible(LISTEN_SCHEDULE_TIME * HZ);
		if(!dev->listen_sock) {
			continue;
		}
		clihost = NULL;
		cli_sock = NULL;
		data_sock = NULL;
		ret = kernel_accept(dev->listen_sock, &cli_sock, O_NONBLOCK);
		if (ret < 0) {
			//KER_DEBUG(KERN_ALERT "mempool thread: sock accept err, err=%d\n", ret);
			continue;
		}
        schedule_timeout_interruptible(LISTEN_SCHEDULE_TIME * HZ);
		ret = kernel_accept(dev->data_listen_sock, &data_sock, O_NONBLOCK);
		if (ret < 0) {
			//KER_DEBUG(KERN_ALERT "mempool thread: sock accept err, err=%d\n", ret);
			continue;
		}
		//create client host structure
		clihost = (struct client_host *)kmem_cache_alloc(dev->slab_client_host, GFP_USER);
		memset(clihost, 0, sizeof(struct client_host));
		if(!clihost) {
			KER_DEBUG(KERN_ALERT "mempool thread: create clihost err");
			continue;
		}
		clihost->sock = cli_sock;
		clihost->datasock = data_sock;
		clihost->state = CLIHOST_STATE_CONNECTED;
		kernel_getpeername(cli_sock, (struct sockaddr *)&clihost->host_addr, &sockaddrlen);
		kernel_getpeername(data_sock, (struct sockaddr *)&clihost->host_data_addr, &sockaddrlen);

		//init client host, slab, list_head
		mutex_init(&clihost->ptr_mutex);

		//add to list
		mutex_lock(&dev->lshd_rent_client_mutex);
		list_add_tail(&clihost->ls_rent, &dev->lshd_rent_client);
		mutex_unlock(&dev->lshd_rent_client_mutex);
		//create recive thread for client
		clihost->CliHandleThread = kthread_run(CliRecvThread, clihost, "Client Recive thread");
		if (IS_ERR(clihost->CliHandleThread)) {
			KER_DEBUG(KERN_ALERT "create recvmsg thread err, err=%ld\n",
                PTR_ERR(clihost->CliHandleThread));
			continue;
		}
    }
	while(!kthread_should_stop()) {
        schedule_timeout_interruptible(SCHEDULE_TIME * HZ);
	}
    return 0;
listen_data_error:
listen_error:
bind_data_error:
bind_error:
	if(dev->data_listen_sock) {
		sock_release(dev->data_listen_sock);
	}
create_data_error:
	if(dev->listen_sock) {
		sock_release(dev->listen_sock);
	}
create_error:
null_ptr_error:
	while(!kthread_should_stop()) {
        schedule_timeout_interruptible(SCHEDULE_TIME * HZ);
	}
    return -1;
}
Example #9
0
int init_server(void *conf)
{
    int ret=0;
    int flags=1;
    sock_entry_t *se;
    struct linger ling= {0,0};

    //create workqueue
    if(!wq) {
        wq=create_singlethread_workqueue("kkvserver");
        if(!wq) {
#ifdef DEBUG_KKV_NETWORK
            printk("create_workqueue() failed in server_init()\n");
#endif
            return -ENOMEM;
        }
    }

    if(!svr) {
        svr=kmalloc(sizeof(kkv_server),GFP_KERNEL);
        INIT_WORK(&svr->work,server_work);
    }

    //create socket
    se=(sock_entry_t *)conf;
    ret=sock_create_kern(se->family,se->type,se->protocol,&svr->socket);
    if(ret<0) {
#ifdef DEBUG_KKV_NETWORK
        printk("sock_create_kern() failed=%d, family=%d, type=%d, protocol=%d\n",
               ret,se->family,se->type,se->protocol);
#endif
        goto out0;
    }

    set_server_sock_callbacks(svr->socket,svr);

    ret=kernel_setsockopt(svr->socket,SOL_SOCKET,SO_REUSEADDR,(char*)&flags,sizeof(flags));
    if(ret<0) {
#ifdef DEBUG_KKV_NETWORK
        printk("kernel_setsockopt() failed=%d, level=%d, name=%d\n",ret,SOL_SOCKET,SO_REUSEADDR);
#endif
        goto out1;
    }

    ret=kernel_setsockopt(svr->socket,SOL_SOCKET,SO_KEEPALIVE,(char*)&flags,sizeof(flags));
    if(ret<0) {
#ifdef DEBUG_KKV_NETWORK
        printk("kernel_setsockopt() failed=%d, level=%d, name=%d\n",ret,SOL_SOCKET,SO_KEEPALIVE);
#endif
        goto out1;
    }

    ret=kernel_setsockopt(svr->socket,SOL_SOCKET,SO_LINGER,(char*)&ling,sizeof(ling));
    if(ret<0) {
#ifdef DEBUG_KKV_NETWORK
        printk("kernel_setsockopt() failed=%d, level=%d, name=%d\n",ret,SOL_SOCKET,SO_LINGER);
#endif
        goto out1;
    }

    ret=kernel_setsockopt(svr->socket,SOL_TCP,TCP_NODELAY,(char*)&flags,sizeof(flags));
    if(ret<0) {
#ifdef DEBUG_KKV_NETWORK
        printk("kernel_setsockopt() failed=%d, level=%d, name=%d\n",ret,IPPROTO_TCP,TCP_NODELAY);
#endif
        goto out1;
    }

    ret=kernel_bind(svr->socket,(struct sockaddr*)se->addr,se->addrlen);
    if(ret<0) {
#ifdef DEBUG_KKV_NETWORK
        printk("kernel_bind() failed=%d\n",ret);
#endif
        goto out1;
    }

    ret=kernel_listen(svr->socket,1024);
    if(ret<0) {
#ifdef DEBUG_KKV_NETWORK
        printk("kernel_listen() failed=%d\n",ret);
#endif
        goto out1;
    }

    return 0;

out1:
    sock_release(svr->socket);

out0:
    svr->socket=NULL;

    return ret;
}
Example #10
0
static int threadfn(void *data)
{
    struct socket *sock;
    struct sockaddr_in addr;
    int size,i;
    char buf[bufsize+1];

    if (sock_create_kern(AF_INET, SOCK_STREAM, IPPROTO_TCP, &sock) < 0) {
        err("sock_create_kern");
        goto out;
    }

    sock->sk->sk_reuse = 1;

    memset(&addr, '\0', sizeof(addr));    
    addr.sin_family     = AF_INET;
    addr.sin_addr.s_addr    	= htonl(INADDR_ANY);
    addr.sin_port        = htons(9734);

    if (kernel_bind(sock, &addr, sizeof(addr)) < 0) {
        err("kernel_bind");
        goto err;
    }

    if (kernel_listen(sock, 1024) < 0) {
        err("kernel_listen");
        goto err;
    }

    while (!kthread_should_stop()) {

        struct socket *newsock;
        struct inet_connection_sock *icsk = inet_csk(sock->sk);
    
        	struct socket_wq *wq;
     		rcu_read_lock();
                wq = rcu_dereference(sock->sk->sk_wq);
        wait_event_interruptible(wq->wait,!reqsk_queue_empty(&icsk->icsk_accept_queue) || kthread_should_stop());


        if (!reqsk_queue_empty(&icsk->icsk_accept_queue)) {
            if (kernel_accept(sock, &newsock, MSG_WAITALL) != 0) {
                err("kernel_accept");
                goto err;
            }
		
            printk(KERN_INFO "Server : accept a new connection request.\n");
	   // transfer_data(newsock);


	
		  memset(&buf, 0, bufsize+1);
		  size = receive(newsock, buf, bufsize/2);
 		  printk(KERN_INFO "Server : received %d bytes\n", size);
   //data processing 
 		  printk("Server : received data: %s\n", buf);
		  size = receive(newsock, buf, bufsize/2);
		if (size < 0)
		{
                        printk(KERN_INFO ": error getting datagram, sock_recvmsg error = %d\n", size);
			break;
		}                
		else 
                {
                        printk(KERN_INFO "Server : received %d bytes\n", size);
                         //data processing 
                        printk("Server : received data: %s\n", buf);
			
			for( i=0;i<bufsize/2;i++)
			{
			buf[i]+=1;
			}
			buf[i]=0      ;
			// sending 
			//printk("buf=%s\n",buf);
                        size=send(newsock, buf, bufsize/2+1);
                     	if(size<0)
				printk("Server : error send\n");
                      
                }
	    
	
			//printk("ch =%c\n",ch);
            sock_release(newsock);
        }

    }

err:
    sock_release(sock);
out:
    return 0;
}
Example #11
0
int vdev_socket_task(void*data) {

    struct sockaddr_in s_addr;
    unsigned short portnum=8891;
    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=htonl(INADDR_ANY);

    /*create a socket*/
    ret=sock_create_kern(AF_INET, SOCK_STREAM, 0, &server_sock);
    if(ret) {
        printk("vdev server:socket_create error = %d\n",ret);
        return -1;
    }
    printk("vdev server: socket_create ok!\n");

    /*bind the socket*/
	ret=kernel_bind(server_sock, (struct sockaddr *)&s_addr, sizeof(s_addr));
	if (ret < 0) {
        printk("vdev server: bind error = %d\n",ret);
        sock_release(server_sock);
        return -1;
    }
    printk("vdev server: bind ok!\n");

    /*listen*/
	ret=kernel_listen(server_sock, 5);
    if(ret < 0) {
        printk("vdev server: listen error = %d\n",ret);
        sock_release(server_sock);
        return -1;
    }
    printk("vdev server: listen ok!\n");

	/*accept*/
	for(;;)
	{
        ret=kernel_accept(server_sock, &client_sock, 0);
        if (ret<0) {
            printk("vdev server: accept error = %d\n",ret);
            sock_release(server_sock);
            return -1;
        }
        printk("vdev server: accept ok!\n");

        /*receive message from client*/
        for(;;)
        {
            char cmd=-1;
            ret = vdev_socket_recv(&cmd, 1);
            if(ret < 0) {
                printk("vdev socket recv error\n");
                break;
            }
            ret = process_framework_event(cmd);
            if(ret < 0) {
                printk("vdev socket process error\n");
                break;
            }
        }//for
	}

}