void socket_open(message * m) { struct sock_ops * ops; struct socket * sock; int ret = OK; switch (m->DEVICE) { case SOCK_TYPE_TCP: ops = &sock_tcp_ops; break; case SOCK_TYPE_UDP: ops = &sock_udp_ops; break; case SOCK_TYPE_IP: ops = &sock_raw_ip_ops; break; default: if (m->DEVICE - SOCK_TYPES < MAX_DEVS) { m->DEVICE -= SOCK_TYPES; nic_open(m); return; } printf("LWIP unknown socket type %d\n", m->DEVICE); send_reply_open(m, EINVAL); return; } sock = get_unused_sock(); if (!sock) { printf("LWIP : no free socket\n"); send_reply_open(m, EAGAIN); return; } sock->ops = ops; sock->select_ep = NONE; sock->recv_data_size = 0; if (sock->ops && sock->ops->open) ret = sock->ops->open(sock, m); if (ret == OK) { debug_print("new socket %ld", get_sock_num(sock)); send_reply_open(m, get_sock_num(sock)); } else { debug_print("failed %d", ret); send_reply_open(m, ret); } }
int socket_open(devminor_t minor) { struct sock_ops * ops; struct socket * sock; int ret = OK; switch (minor) { case SOCK_TYPE_TCP: ops = &sock_tcp_ops; break; case SOCK_TYPE_UDP: ops = &sock_udp_ops; break; case SOCK_TYPE_IP: ops = &sock_raw_ip_ops; break; default: if (minor - SOCK_TYPES < MAX_DEVS) return nic_open(minor - SOCK_TYPES); printf("LWIP unknown socket type %d\n", minor); return EINVAL; } sock = get_unused_sock(); if (!sock) { printf("LWIP : no free socket\n"); return EAGAIN; } sock->ops = ops; sock->select_ep = NONE; sock->recv_data_size = 0; if (sock->ops && sock->ops->open) ret = sock->ops->open(sock); if (ret == OK) { debug_print("new socket %ld", get_sock_num(sock)); ret = get_sock_num(sock); } else { debug_print("failed %d", ret); /* FIXME: shouldn't sock be freed now? */ } return ret; }