コード例 #1
0
ファイル: app_glue.c プロジェクト: jmmcgee/ipaugenblick
int app_glue_v4_connect(struct socket *sock,unsigned int ipaddr,unsigned short port)
{
	struct sockaddr_in sin;

	if(!sock->sk)
		return -1;
        struct inet_sock *inet = inet_sk(sock->sk);
	while(!inet->inet_num) {
		sin.sin_family = AF_INET;
		sin.sin_addr.s_addr = /*my_ip_addr*/0;
		sin.sin_port = htons(rand() & 0xffff);
		if(kernel_bind(sock,(struct sockaddr *)&sin,sizeof(sin))) {
			syslog(LOG_ERR,"cannot bind %s %d %d\n",__FILE__,__LINE__,sin.sin_port);
			continue;
		}
		break;
	}
	sin.sin_family = AF_INET;
	sin.sin_addr.s_addr = ipaddr;
	sin.sin_port = port;
	if(sock->sk) {
		sock->sk->sk_state_change = app_glue_sock_wakeup;
	}
	kernel_connect(sock, (struct sockaddr *)&sin,sizeof(sin), 0);
	return 0;
}
コード例 #2
0
ファイル: ip6_udp_tunnel.c プロジェクト: coderkan/linux
int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg,
                     struct socket **sockp)
{
    struct sockaddr_in6 udp6_addr;
    int err;
    struct socket *sock = NULL;

    err = sock_create_kern(AF_INET6, SOCK_DGRAM, 0, &sock);
    if (err < 0)
        goto error;

    sk_change_net(sock->sk, net);

    udp6_addr.sin6_family = AF_INET6;
    memcpy(&udp6_addr.sin6_addr, &cfg->local_ip6,
           sizeof(udp6_addr.sin6_addr));
    udp6_addr.sin6_port = cfg->local_udp_port;
    err = kernel_bind(sock, (struct sockaddr *)&udp6_addr,
                      sizeof(udp6_addr));
    if (err < 0)
        goto error;

    if (cfg->peer_udp_port) {
        udp6_addr.sin6_family = AF_INET6;
        memcpy(&udp6_addr.sin6_addr, &cfg->peer_ip6,
               sizeof(udp6_addr.sin6_addr));
        udp6_addr.sin6_port = cfg->peer_udp_port;
        err = kernel_connect(sock,
                             (struct sockaddr *)&udp6_addr,
                             sizeof(udp6_addr), 0);
    }
    if (err < 0)
        goto error;

    udp_set_no_check6_tx(sock->sk, !cfg->use_udp6_tx_checksums);
    udp_set_no_check6_rx(sock->sk, !cfg->use_udp6_rx_checksums);

    *sockp = sock;
    return 0;

error:
    if (sock) {
        kernel_sock_shutdown(sock, SHUT_RDWR);
        sk_release_kernel(sock->sk);
    }
    *sockp = NULL;
    return err;
}
コード例 #3
0
ファイル: verbs.c プロジェクト: Shmuma/sample_mods
static int exchange_info (unsigned int addr)
{
	struct socket *sock = NULL;
	struct sockaddr_in sin;
	int ret;

	ret = sock_create (AF_INET, SOCK_STREAM, 0, &sock);
	if (ret) {
		printk (KERN_INFO "Sock create failed: %d\n", ret);
		goto err;
	}

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

	printk (KERN_INFO "Trying to connect to 0x%x\n", server_addr);

	ret = kernel_connect (sock, (struct sockaddr*)&sin, sizeof (sin), 0);
	if (ret) {
		printk (KERN_INFO "Connect failed: %d\n", ret);
		goto err;
	}

	ret = recv_remote_info (sock, &remote_info);
	if (ret)
		goto err;
	ret = send_remote_info (sock, &local_info);
	if (ret)
		goto err;

	have_remote_info = 1;
	printk (KERN_INFO "Got information about remote side.\n");
	printk (KERN_INFO "QPN: 0x%x, QKey: %u, LID: 0x%x, GID: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
		remote_info.qp_num, remote_info.qkey, remote_info.lid,
		remote_info.gid.raw[0], remote_info.gid.raw[1], remote_info.gid.raw[2], remote_info.gid.raw[3],
		remote_info.gid.raw[4], remote_info.gid.raw[5], remote_info.gid.raw[6], remote_info.gid.raw[7],
		remote_info.gid.raw[8], remote_info.gid.raw[9], remote_info.gid.raw[10], remote_info.gid.raw[10],
		remote_info.gid.raw[12], remote_info.gid.raw[13], remote_info.gid.raw[14], remote_info.gid.raw[15]);

err:
	if (sock)
		sock_release (sock);
	return ret;
}
コード例 #4
0
ファイル: udp_tunnel.c プロジェクト: mikemvk/linux-at91
int udp_sock_create4(struct net *net, struct udp_port_cfg *cfg,
                     struct socket **sockp)
{
    int err;
    struct socket *sock = NULL;
    struct sockaddr_in udp_addr;

    err = sock_create_kern(AF_INET, SOCK_DGRAM, 0, &sock);
    if (err < 0)
        goto error;

    sk_change_net(sock->sk, net);

    udp_addr.sin_family = AF_INET;
    udp_addr.sin_addr = cfg->local_ip;
    udp_addr.sin_port = cfg->local_udp_port;
    err = kernel_bind(sock, (struct sockaddr *)&udp_addr,
                      sizeof(udp_addr));
    if (err < 0)
        goto error;

    if (cfg->peer_udp_port) {
        udp_addr.sin_family = AF_INET;
        udp_addr.sin_addr = cfg->peer_ip;
        udp_addr.sin_port = cfg->peer_udp_port;
        err = kernel_connect(sock, (struct sockaddr *)&udp_addr,
                             sizeof(udp_addr), 0);
        if (err < 0)
            goto error;
    }

    sock->sk->sk_no_check_tx = !cfg->use_udp_checksums;

    *sockp = sock;
    return 0;

error:
    if (sock) {
        kernel_sock_shutdown(sock, SHUT_RDWR);
        sk_release_kernel(sock->sk);
    }
    *sockp = NULL;
    return err;
}
コード例 #5
0
/*
 * We need to preserve the port number so the reply cache on the server can
 * find our cached RPC replies when we get around to reconnecting.
 */
static void xs_abort_connection(struct rpc_xprt *xprt)
{
    int result;
    struct socket *sock = xprt->sock;
    struct sockaddr any;

    dprintk("RPC:      disconnecting xprt %p to reuse port\n", xprt);

    /*
     * Disconnect the transport socket by doing a connect operation
     * with AF_UNSPEC.  This should return immediately...
     */
    memset(&any, 0, sizeof(any));
    any.sa_family = AF_UNSPEC;
    result = kernel_connect(sock, &any, sizeof(any), 0);
    if (result)
        dprintk("RPC:      AF_UNSPEC connect return code %d\n",
                result);
}
コード例 #6
0
ファイル: tunnel.c プロジェクト: kawa1983/sclp
int sclp_sock_create4(struct net *net, struct sclp_port_cfg *cfg, struct socket **sockp)
{
    int err;
    struct socket *sock = NULL;
    struct sockaddr_in sclp_addr;

    err = sock_create_kern(AF_INET, SOCK_SCLP, 0, &sock);
    if (err < 0)
        goto error;

    sk_change_net(sock->sk, net);

    sclp_addr.sin_family = AF_INET;
    sclp_addr.sin_addr = cfg->local_ip;
    sclp_addr.sin_port = cfg->local_sclp_port;

    err = kernel_bind(sock, (struct sockaddr*)&sclp_addr, sizeof(sclp_addr));
    if (err < 0)
        goto error;

    if (cfg->peer_sclp_port) {
        sclp_addr.sin_family = AF_INET;
        sclp_addr.sin_addr = cfg->peer_ip;
        sclp_addr.sin_port = cfg->peer_sclp_port;
        err = kernel_connect(sock, (struct sockaddr*)&sclp_addr, sizeof(sclp_addr), 0);
        if (err < 0)
            goto error;
    }

    *sockp = sock;
    return 0;

error:
    if (sock) {
        kernel_sock_shutdown(sock, SHUT_RDWR);
        sk_release_kernel(sock->sk);
    }
    *sockp = NULL;
    return err;
}
コード例 #7
0
ファイル: lib-socket.c プロジェクト: SantoshShilimkar/linux
int
lnet_sock_connect(struct socket **sockp, int *fatal, __u32 local_ip,
		  int local_port, __u32 peer_ip, int peer_port)
{
	struct sockaddr_in srvaddr;
	int rc;

	rc = lnet_sock_create(sockp, fatal, local_ip, local_port);
	if (rc)
		return rc;

	memset(&srvaddr, 0, sizeof(srvaddr));
	srvaddr.sin_family = AF_INET;
	srvaddr.sin_port = htons(peer_port);
	srvaddr.sin_addr.s_addr = htonl(peer_ip);

	rc = kernel_connect(*sockp, (struct sockaddr *)&srvaddr,
			    sizeof(srvaddr), 0);
	if (!rc)
		return 0;

	/*
	 * EADDRNOTAVAIL probably means we're already connected to the same
	 * peer/port on the same local port on a differently typed
	 * connection.  Let our caller retry with a different local
	 * port...
	 */
	*fatal = !(rc == -EADDRNOTAVAIL);

	CDEBUG_LIMIT(*fatal ? D_NETERROR : D_NET,
		     "Error %d connecting %pI4h/%d -> %pI4h/%d\n", rc,
		     &local_ip, local_port, &peer_ip, peer_port);

	sock_release(*sockp);
	return rc;
}
コード例 #8
0
ファイル: ipt_SYSLOG.c プロジェクト: Elbandi/ipt_syslog
static int syslog_connect(struct socket **socket)
{
    int ret = 0;
    int retry = 0;
    int logtype = SOCK_DGRAM;
    struct sockaddr_un syslog_server;

    while (retry < 2)
    {
        ret = sock_create_kern(PF_UNIX, logtype, 0, socket);
        if (ret < 0)
            break;

        syslog_server.sun_family = PF_UNIX;
        strcpy(syslog_server.sun_path , "/dev/log");
        ret = kernel_connect(*socket, (struct sockaddr *)&syslog_server, sizeof(struct sockaddr_un) - 1, 0);
        if (ret < 0)
        {
            if (ret == -EPROTOTYPE)
            {
                logtype = (logtype == SOCK_DGRAM ? SOCK_STREAM : SOCK_DGRAM);
            }
            retry++;
            goto cleanup_sock;
        }

        (*socket)->sk->sk_allocation = GFP_NOIO;
        return ret;

cleanup_sock:
        sock_release(*socket);
        *socket = NULL;
    }

    return ret;
}
コード例 #9
0
ファイル: udp_tunnel.c プロジェクト: 0day-ci/ovs
int rpl_udp_sock_create(struct net *net, struct udp_port_cfg *cfg,
		        struct socket **sockp)
{
	int err;
	struct socket *sock = NULL;

#if IS_ENABLED(CONFIG_IPV6)
	if (cfg->family == AF_INET6) {
		struct sockaddr_in6 udp6_addr;

		err = sock_create_kern(net, AF_INET6, SOCK_DGRAM, 0, &sock);
		if (err < 0)
			goto error;

		udp6_addr.sin6_family = AF_INET6;
		memcpy(&udp6_addr.sin6_addr, &cfg->local_ip6,
		       sizeof(udp6_addr.sin6_addr));
		udp6_addr.sin6_port = cfg->local_udp_port;
		err = kernel_bind(sock, (struct sockaddr *)&udp6_addr,
				  sizeof(udp6_addr));
		if (err < 0)
			goto error;

		if (cfg->peer_udp_port) {
			udp6_addr.sin6_family = AF_INET6;
			memcpy(&udp6_addr.sin6_addr, &cfg->peer_ip6,
			       sizeof(udp6_addr.sin6_addr));
			udp6_addr.sin6_port = cfg->peer_udp_port;
			err = kernel_connect(sock,
					     (struct sockaddr *)&udp6_addr,
					     sizeof(udp6_addr), 0);
		}
		if (err < 0)
			goto error;
	} else
#endif
	if (cfg->family == AF_INET) {
		struct sockaddr_in udp_addr;

		err = sock_create_kern(net, AF_INET, SOCK_DGRAM, 0, &sock);
		if (err < 0)
			goto error;

		udp_addr.sin_family = AF_INET;
		udp_addr.sin_addr = cfg->local_ip;
		udp_addr.sin_port = cfg->local_udp_port;
		err = kernel_bind(sock, (struct sockaddr *)&udp_addr,
				  sizeof(udp_addr));
		if (err < 0)
			goto error;

		if (cfg->peer_udp_port) {
			udp_addr.sin_family = AF_INET;
			udp_addr.sin_addr = cfg->peer_ip;
			udp_addr.sin_port = cfg->peer_udp_port;
			err = kernel_connect(sock,
					     (struct sockaddr *)&udp_addr,
					     sizeof(udp_addr), 0);
			if (err < 0)
				goto error;
		}
	} else {
		return -EPFNOSUPPORT;
	}


	*sockp = sock;

	return 0;

error:
	if (sock) {
		kernel_sock_shutdown(sock, SHUT_RDWR);
		sock_release(sock);
	}
	*sockp = NULL;
	return err;
}
コード例 #10
0
/**
 * xs_tcp_connect_worker - connect a TCP socket to a remote endpoint
 * @args: RPC transport to connect
 *
 * Invoked by a work queue tasklet.
 */
static void xs_tcp_connect_worker(void *args)
{
    struct rpc_xprt *xprt = (struct rpc_xprt *)args;
    struct socket *sock = xprt->sock;
    int err, status = -EIO;

    if (xprt->shutdown || xprt->addr.sin_port == 0)
        goto out;

    dprintk("RPC:      xs_tcp_connect_worker for xprt %p\n", xprt);

    if (!xprt->sock) {
        /* start from scratch */
        if ((err = sock_create_kern(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock)) < 0) {
            dprintk("RPC:      can't create TCP transport socket (%d).\n", -err);
            goto out;
        }
        xs_reclassify_socket(sock);

        if (xs_bind(xprt, sock)) {
            sock_release(sock);
            goto out;
        }
    } else
        /* "close" the socket, preserving the local port */
        xs_tcp_reuse_connection(xprt);

    if (!xprt->inet) {
        struct sock *sk = sock->sk;

        write_lock_bh(&sk->sk_callback_lock);

        sk->sk_user_data = xprt;
        xprt->old_data_ready = sk->sk_data_ready;
        xprt->old_state_change = sk->sk_state_change;
        xprt->old_write_space = sk->sk_write_space;
        sk->sk_data_ready = xs_tcp_data_ready;
        sk->sk_state_change = xs_tcp_state_change;
        sk->sk_write_space = xs_tcp_write_space;
        sk->sk_allocation = GFP_ATOMIC;

        /* socket options */
        sk->sk_userlocks |= SOCK_BINDPORT_LOCK;
        sock_reset_flag(sk, SOCK_LINGER);
        tcp_sk(sk)->linger2 = 0;
        tcp_sk(sk)->nonagle |= TCP_NAGLE_OFF;

        xprt_clear_connected(xprt);

        /* Reset to new socket */
        xprt->sock = sock;
        xprt->inet = sk;

        write_unlock_bh(&sk->sk_callback_lock);
    }

    /* Tell the socket layer to start connecting... */
    xprt->stat.connect_count++;
    xprt->stat.connect_start = jiffies;
    status = kernel_connect(sock, (struct sockaddr *) &xprt->addr,
                            sizeof(xprt->addr), O_NONBLOCK);
    dprintk("RPC: %p  connect status %d connected %d sock state %d\n",
            xprt, -status, xprt_connected(xprt), sock->sk->sk_state);
    if (status < 0) {
        switch (status) {
        case -EINPROGRESS:
        case -EALREADY:
            goto out_clear;
        case -ECONNREFUSED:
        case -ECONNRESET:
            /* retry with existing socket, after a delay */
            break;
        case -ENETUNREACH:
            status = -ENOTCONN;
            break;
        default:
            /* get rid of existing socket, and retry */
            xs_close(xprt);
            break;
        }
    }
out:
    xprt_wake_pending_tasks(xprt, status);
out_clear:
    xprt_clear_connecting(xprt);
}
コード例 #11
0
/* Create a new IPv4 subflow.
 *
 * We are in user-context and meta-sock-lock is hold.
 */
int mptcp_init4_subsockets(struct sock *meta_sk, const struct mptcp_loc4 *loc,
			   struct mptcp_rem4 *rem)
{
	struct tcp_sock *tp;
	struct sock *sk;
	struct sockaddr_in loc_in, rem_in;
	struct socket_alloc sock_full;
	struct socket *sock = (struct socket *)&sock_full;
	int ret;

	/** First, create and prepare the new socket */
	memcpy(&sock_full, meta_sk->sk_socket, sizeof(sock_full));
	sock->state = SS_UNCONNECTED;
	sock->ops = NULL;

	ret = inet_create(sock_net(meta_sk), sock, IPPROTO_TCP, 1);
	if (unlikely(ret < 0)) {
		net_err_ratelimited("%s inet_create failed ret: %d\n",
				    __func__, ret);
		return ret;
	}

	sk = sock->sk;
	tp = tcp_sk(sk);

	/* All subsockets need the MPTCP-lock-class */
	lockdep_set_class_and_name(&(sk)->sk_lock.slock, &meta_slock_key, meta_slock_key_name);
	lockdep_init_map(&(sk)->sk_lock.dep_map, meta_key_name, &meta_key, 0);

	ret = mptcp_add_sock(meta_sk, sk, loc->loc4_id, rem->rem4_id, GFP_KERNEL);
	if (ret) {
		net_err_ratelimited("%s mptcp_add_sock failed ret: %d\n",
				    __func__, ret);
		goto error;
	}

	tp->mptcp->slave_sk = 1;

	/* Initializing the timer for an MPTCP subflow */
	timer_setup(&tp->mptcp->mptcp_ack_timer, mptcp_ack_handler, 0);

	/** Then, connect the socket to the peer */
	loc_in.sin_family = AF_INET;
	rem_in.sin_family = AF_INET;
	loc_in.sin_port = 0;
	if (rem->port)
		rem_in.sin_port = rem->port;
	else
		rem_in.sin_port = inet_sk(meta_sk)->inet_dport;
	loc_in.sin_addr = loc->addr;
	rem_in.sin_addr = rem->addr;

	if (loc->if_idx)
		sk->sk_bound_dev_if = loc->if_idx;

	ret = kernel_bind(sock, (struct sockaddr *)&loc_in,
			  sizeof(struct sockaddr_in));
	if (ret < 0) {
		net_err_ratelimited("%s: token %#x bind() to %pI4 index %d failed, error %d\n",
				    __func__, tcp_sk(meta_sk)->mpcb->mptcp_loc_token,
				    &loc_in.sin_addr, loc->if_idx, ret);
		goto error;
	}

	mptcp_debug("%s: token %#x pi %d src_addr:%pI4:%d dst_addr:%pI4:%d ifidx: %d\n",
		    __func__, tcp_sk(meta_sk)->mpcb->mptcp_loc_token,
		    tp->mptcp->path_index, &loc_in.sin_addr,
		    ntohs(loc_in.sin_port), &rem_in.sin_addr,
		    ntohs(rem_in.sin_port), loc->if_idx);

	ret = kernel_connect(sock, (struct sockaddr *)&rem_in,
			     sizeof(struct sockaddr_in), O_NONBLOCK);
	if (ret < 0 && ret != -EINPROGRESS) {
		net_err_ratelimited("%s: MPTCP subsocket connect() failed, error %d\n",
				    __func__, ret);
		goto error;
	}

	MPTCP_INC_STATS(sock_net(meta_sk), MPTCP_MIB_JOINSYNTX);

	sk_set_socket(sk, meta_sk->sk_socket);
	sk->sk_wq = meta_sk->sk_wq;

	return 0;

error:
	/* May happen if mptcp_add_sock fails first */
	if (!mptcp(tp)) {
		tcp_close(sk, 0);
	} else {
		local_bh_disable();
		mptcp_sub_force_close(sk);
		local_bh_enable();
	}
	return ret;
}
コード例 #12
0
static struct socket *
udp_tx_sock_create (struct in_addr if_address, 
                    uint16_t port,
                    struct in_addr dest_addr,
                    uint32_t bufsize)
{
    struct socket *sk;
    struct sockaddr_in saddr;
    char loop = 0;
    int err = 0;

    do {
        err = sock_create(PF_INET, SOCK_DGRAM, 0, &sk);
        if (err < 0) {
            break;
        }

        memset(&saddr, 0, sizeof(saddr));
        saddr.sin_addr = if_address;
        saddr.sin_family = AF_INET;
        saddr.sin_port = 0;    
        err = kernel_bind(sk, 
                          (struct sockaddr *) &saddr,
                          sizeof(saddr));
        if (err < 0) {
            break;
        }

        err = kernel_setsockopt(sk, 
                                IPPROTO_IP, 
                                IP_MULTICAST_LOOP, 
                                &loop, 
                                sizeof(loop));
        if (err < 0) {
            break;
        }

        memset(&saddr, 0, sizeof(saddr));
        saddr.sin_family = AF_INET;
        saddr.sin_addr = dest_addr;
        saddr.sin_port = port;
        err = kernel_connect(sk,
                             (struct sockaddr *)&saddr, 
                             sizeof(saddr), 
                             0);
        if (err < 0) {
            break;
        }

        if (bufsize) {
            err = kernel_setsockopt(sk, 
                                    SOL_SOCKET,
                                    SO_SNDBUF, 
                                    (char *)&bufsize,
                                    sizeof(bufsize));
            if (err < 0) {
                break;
            }
        }

    } while (0);

    if (err < 0) {
        kernel_sock_shutdown(sk, SHUT_RDWR);
        sock_release(sk);
        sk = NULL;
    }
    
    return (sk);
}
コード例 #13
-1
void
btv_send_msg_thru_eth(const unsigned char *buf, int size)
{
    struct socket *sock[NUM_OF_SOCKS];
    struct sockaddr ksockaddr[NUM_OF_SOCKS] = {0};
    struct msghdr msg;
    struct kvec   iov;

    printk("Send Message Thru Eth\n");

    for (;;) {

    /* To communicate TVSOC, we have to prepare two sockets for sync and async ports */

    sock_create_kern(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock[SOCK_FOR_SYNC]);
    sock_create_kern(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock[SOCK_FOR_ASYNC]);

    /* initialize socket for sync command */
    ksockaddr[SOCK_FOR_SYNC].sa_family      = PF_INET;
    /* sockaddr.sin_addr.s_addr = inet_addr((const char*)("198.18.186.199")); */
    //*((unsigned short *)&(ksockaddr.sa_data[0])) = 0x409c; /* 0x9c40:40000 */
    *((unsigned short *)&(ksockaddr[SOCK_FOR_SYNC].sa_data[0])) = htons(40000); /* 0x9c40:40000 */
    //*((unsigned int   *)&(ksockaddr.sa_data[2])) = 0x0b9c082b; /*  0x2b:43 0x08:08 0x9c:156 0x0b:11 */
    *((unsigned int   *)&(ksockaddr[SOCK_FOR_SYNC].sa_data[2])) = 0xc7ba12c6; /*  0xc6:198 0x12:18 0xba:186 0xc7:199 */

    /* initialize socket for async command */
    ksockaddr[SOCK_FOR_ASYNC].sa_family      = PF_INET;
    *((unsigned short *)&(ksockaddr[SOCK_FOR_ASYNC].sa_data[0])) = htons(40001); /* 0x9d40:40001 */
    //*((unsigned int   *)&(ksockaddr.sa_data[2])) = 0x0b9c082b; /*  0x2b:43 0x08:08 0x9c:156 0x0b:11 */
    *((unsigned int   *)&(ksockaddr[SOCK_FOR_ASYNC].sa_data[2])) = 0xc7ba12c6; /*  0xc6:198 0x12:18 0xba:186 0xc7:199 */



    while(kernel_connect(sock[SOCK_FOR_SYNC], (struct sockaddr *)&ksockaddr[SOCK_FOR_SYNC], sizeof(struct sockaddr), 0) < 0) {
        printk("Cannot connect server sync port, Retry \n");
        mdelay(REBOOT_CMD_INTERVAL_MSEC);
	}
    while(kernel_connect(sock[SOCK_FOR_ASYNC], (struct sockaddr *)&ksockaddr[SOCK_FOR_ASYNC], sizeof(struct sockaddr), 0) < 0) {
        printk("Cannot connect server async port, Retry \n");
        mdelay(REBOOT_CMD_INTERVAL_MSEC);
    }

    iov.iov_base = (void *)buf;
    iov.iov_len = ETH_CMD_SIZE;

    msg.msg_name = (struct sockaddr *)&ksockaddr[SOCK_FOR_SYNC];
    msg.msg_namelen = sizeof(struct sockaddr);
    msg.msg_iov = (struct iovec *) &iov;
    msg.msg_iovlen = 1;
    msg.msg_control = NULL;

    kernel_sendmsg(sock[SOCK_FOR_SYNC], &msg, &iov, 1, ETH_CMD_SIZE);

	sock_release(sock[SOCK_FOR_SYNC]);
	sock_release(sock[SOCK_FOR_ASYNC]);

    mdelay(ETHER_CMD_INTERVAL);
	}
    /* NOREACHED */
}