diff options
Diffstat (limited to 'stacks')
-rw-r--r-- | stacks/lwip_stack/app_conf/module_config.json | 2 | ||||
-rw-r--r-- | stacks/lwip_stack/app_conf/rd_config.json | 10 | ||||
-rw-r--r-- | stacks/lwip_stack/lwip_src/api/spl_api_msg.c | 96 | ||||
-rw-r--r-- | stacks/lwip_stack/lwip_src/core/spl_pbuf.c | 14 | ||||
-rw-r--r-- | stacks/lwip_stack/lwip_src/include/stackx/spl_pbuf.h | 3 | ||||
-rw-r--r-- | stacks/lwip_stack/lwip_src/socket/stackx_event.c | 117 | ||||
-rw-r--r-- | stacks/lwip_stack/lwip_src/socket/stackx_protocol_api.c | 2 | ||||
-rw-r--r-- | stacks/lwip_stack/src/sbr/sbr_protocol_api.h | 2 | ||||
-rw-r--r-- | stacks/lwip_stack/src/sbr/sbr_socket.c | 2 | ||||
-rw-r--r-- | stacks/rsocket/config/rd_config.json | 2 | ||||
-rw-r--r-- | stacks/vpp/configure/rd_config.json | 10 |
11 files changed, 218 insertions, 42 deletions
diff --git a/stacks/lwip_stack/app_conf/module_config.json b/stacks/lwip_stack/app_conf/module_config.json index a179ad4..f1b3458 100644 --- a/stacks/lwip_stack/app_conf/module_config.json +++ b/stacks/lwip_stack/app_conf/module_config.json @@ -13,7 +13,7 @@ "stackid": "0", }, { - "stack_name": "stackx", + "stack_name": "lwip", "function_name": "nstack_stack_register", "libname": "libnstack.so", "loadtype": "dynmic", diff --git a/stacks/lwip_stack/app_conf/rd_config.json b/stacks/lwip_stack/app_conf/rd_config.json index 38374bc..3109bcd 100644 --- a/stacks/lwip_stack/app_conf/rd_config.json +++ b/stacks/lwip_stack/app_conf/rd_config.json @@ -2,25 +2,25 @@ "ip_route": [ { "subnet": "192.168.1.1/24", - "type": "nstack-dpdk", + "stack_name": "lwip", }, { "subnet": "192.167.1.1/24", - "type": "nstack-kernel", + "stack_name": "kernel", }, { "subnet": "192.166.1.1/24", - "type": "nstack-kernel", + "stack_name": "kernel", } ], "prot_route": [ { "proto_type": "1", - "type": "nstack-dpdk", + "stack_name": "lwip", }, { "proto_type": "2", - "type": "nstack-kernel", + "stack_name": "kernel", } ], } diff --git a/stacks/lwip_stack/lwip_src/api/spl_api_msg.c b/stacks/lwip_stack/lwip_src/api/spl_api_msg.c index 0986ed4..1c9bf92 100644 --- a/stacks/lwip_stack/lwip_src/api/spl_api_msg.c +++ b/stacks/lwip_stack/lwip_src/api/spl_api_msg.c @@ -414,7 +414,7 @@ spl_recv_udp (void *arg, struct udp_pcb *pcb, struct pbuf *p, { struct spl_netbuf *buf; spl_netconn_t *conn = (spl_netconn_t *) arg; - struct spl_pbuf *spb = NULL; //?? + struct spl_pbuf *spl_pb = NULL; //?? if (NULL == pcb) { @@ -432,12 +432,28 @@ spl_recv_udp (void *arg, struct udp_pcb *pcb, struct pbuf *p, /* //@TODO: malloc and Copy splbuf */ struct common_pcb *cpcb = (struct common_pcb *) (conn->comm_pcb_data); - buf = (struct spl_netbuf *) ((char *) p + sizeof (struct spl_pbuf)); - buf->p = spb; + u16_t proc_id = spl_get_lcore_id (); + + spl_pb = spl_pbuf_alloc_hugepage (SPL_PBUF_TRANSPORT, + p->tot_len + + g_offSetArry[SPL_PBUF_TRANSPORT], + SPL_PBUF_HUGE, proc_id, conn); + + if (!spl_pb) + { + NSPOL_LOGINF (TCP_DEBUG, "spl_pbuf_alloc_hugepage Failed!!!"); + return; + } + + pbuf_to_splpbuf_copy (spl_pb, p); + pbuf_free (p); + + buf = (struct spl_netbuf *) ((char *) spl_pb + sizeof (struct spl_pbuf)); + buf->p = spl_pb; spl_ip_addr_set (&buf->addr, ipaddr); buf->port = port; - err_t ret = sp_enqueue (cpcb, (void *) p); + err_t ret = sp_enqueue (cpcb, (void *) spl_pb); if (ret != ERR_OK) { NSPOL_LOGDBG (UDP_DEBUG, "mbox post failed"); @@ -1808,6 +1824,56 @@ do_listen (struct common_pcb *cpcb, msg_listen * lmsg) } /** + * Send some data on UDP pcb contained in a netconn + * Called from do_send + * + * @param msg the api_msg_msg pointing to the connection + */ +void +spl_udp_send (struct common_pcb *cpcb, msg_send_buf * smsg) +{ + struct spl_pbuf *p_from = smsg->p; + spl_netconn_t *conn = cpcb->conn; + struct udp_pcb *upcb = (struct udp_pcb *) (cpcb->conn->private_data); + data_com_msg *m = MSG_ENTRY (smsg, data_com_msg, buffer); + struct pbuf *p_to = NULL; + err_t err = ERR_OK; + + //allocate pbuf and copy spl_pbuf, send , free pbuf and spl_pbuf + do + { + p_to = pbuf_alloc (PBUF_TRANSPORT, p_from->len, PBUF_RAM); + if (NULL == p_to) + { + NSPOL_LOGERR ("pbuf is NULL]conn=%p,pcb=%p", conn, upcb); + return; + } + + err = splpbuf_to_pbuf_transport_copy (p_to, p_from); + if (err != ERR_OK) + { + SET_MSG_ERR (m, conn->last_err); + return; + } + + if (ip_addr_isany (&smsg->addr)) + { + SET_MSG_ERR (m, udp_send (upcb, p_to)); + } + else + { + SET_MSG_ERR (m, + udp_sendto (upcb, p_to, (ip_addr_t *) & smsg->addr, + smsg->port)); + } + + p_from = (struct spl_pbuf *) ADDR_SHTOL (p_from->next_a); + } + while (p_from != NULL); + +} + +/** * Send some data on a RAW or UDP pcb contained in a netconn * Called from netconn_send * @@ -1825,8 +1891,8 @@ do_send (struct common_pcb *cpcb, msg_send_buf * smsg) if (SPL_ERR_IS_FATAL (conn->last_err)) { SET_MSG_ERR (m, conn->last_err); - spl_pbuf_free (p); - return; + NSPOL_LOGERR ("Invalid param]msg->conn=%p", conn); + goto err_return; } switch (SPL_NETCONNTYPE_GROUP (cpcb->type)) @@ -1840,20 +1906,8 @@ do_send (struct common_pcb *cpcb, msg_send_buf * smsg) ss_set_local_ip (conn, smsg->local_ip.addr); } - //spl_ip_addr_t *destIP = &smsg->addr; + spl_udp_send (cpcb, smsg); - //@TODO udp send need to update like TCP. copy pbuf here. Once testing done for TCP we'll update it here. - if (ip_addr_isany (&smsg->addr)) - { - //SET_MSG_ERR(m, udp_send(upcb, p)); - /* destIP.addr == IPADDR_ANY means it is from stackx_send - and the destination is stored in remote_ip and remote port */ - //destIP = &upcb->remote_ip; - } - else - { - //SET_MSG_ERR(m, udp_sendto(upcb, p, &smsg->addr, smsg->port)); - } break; } @@ -1862,6 +1916,10 @@ do_send (struct common_pcb *cpcb, msg_send_buf * smsg) break; } +err_return: + pbuf_free_safe (smsg->p); + ASYNC_MSG_FREE (m); + return; } diff --git a/stacks/lwip_stack/lwip_src/core/spl_pbuf.c b/stacks/lwip_stack/lwip_src/core/spl_pbuf.c index 03e30ed..54589e8 100644 --- a/stacks/lwip_stack/lwip_src/core/spl_pbuf.c +++ b/stacks/lwip_stack/lwip_src/core/spl_pbuf.c @@ -369,6 +369,20 @@ spl_pbuf_copy (struct spl_pbuf * p_to, struct spl_pbuf * p_from) } err_t +splpbuf_to_pbuf_transport_copy (struct pbuf * p_to, struct spl_pbuf * p_from) +{ + if (EOK != MEMMOVE_S ((u8_t *) p_to->payload, + p_to->len, (u8_t *) ADDR_SHTOL (p_from->payload_a), + p_from->len)) + { + NSPOL_LOGERR ("MEMMOVE_S failed"); + return ERR_MEM; + } + + return ERR_OK; +} + +err_t splpbuf_to_pbuf_copy (struct pbuf * p_to, struct spl_pbuf * p_from) { u32_t offset_to = 0; diff --git a/stacks/lwip_stack/lwip_src/include/stackx/spl_pbuf.h b/stacks/lwip_stack/lwip_src/include/stackx/spl_pbuf.h index 01fe242..79deace 100644 --- a/stacks/lwip_stack/lwip_src/include/stackx/spl_pbuf.h +++ b/stacks/lwip_stack/lwip_src/include/stackx/spl_pbuf.h @@ -48,6 +48,9 @@ struct spl_pbuf *spl_pbuf_alloc_hugepage (spl_pbuf_layer l, u16_t length, spl_pbuf_type type, u16_t thread_index, void *net_conn); struct pbuf *spl_convert_spl_pbuf_to_pbuf (struct spl_pbuf *p_from); +err_t +splpbuf_to_pbuf_transport_copy (struct pbuf *p_to, struct spl_pbuf *p_from); + err_t pbuf_to_splpbuf_copy (struct spl_pbuf *p_to, struct pbuf *p_from); err_t splpbuf_to_pbuf_copy (struct pbuf *p_to, struct spl_pbuf *p_from); spl_pbuf_layer get_pbuf_layer_from_pbuf_payload (struct pbuf *buf); diff --git a/stacks/lwip_stack/lwip_src/socket/stackx_event.c b/stacks/lwip_stack/lwip_src/socket/stackx_event.c index 93e47a3..1967ecc 100644 --- a/stacks/lwip_stack/lwip_src/socket/stackx_event.c +++ b/stacks/lwip_stack/lwip_src/socket/stackx_event.c @@ -17,13 +17,112 @@ #include "stackx_spl_share.h" #include "common_pal_bitwide_adjust.h" #include "stackx_event.h" -#include <netinet/in.h> - -#define FREE_FD_SET(readfd, writefd, exceptfd) {\ - if(readfd)\ - free(readfd);\ - if(writefd)\ - free(writefd);\ - if(exceptfd)\ - free(exceptfd);\ + +#define FREE_FD_SET(readfd, writefd, exceptfd) {\ +if(readfd)\ +free(readfd);\ +if(writefd)\ +free(writefd);\ +if(exceptfd)\ +free(exceptfd);\ +} + +int +lwip_try_select (int fdsize, fd_set * fdread, fd_set * fdwrite, + fd_set * fderr, struct timeval *timeout) +{ + int i; + int nready = 0; + nstack_fd_set *read_out; + nstack_fd_set *write_out; + nstack_fd_set *err_out; + nstack_fd_set *readfd = (nstack_fd_set *) fdread; + nstack_fd_set *writefd = (nstack_fd_set *) fdwrite; + nstack_fd_set *exceptfd = (nstack_fd_set *) fderr; + sbr_socket_t *sock; + spl_netconn_t *conn; + + if ((fdsize >= NSTACK_SETSIZE) || (fdsize < 0)) + { + return 0; + } + read_out = malloc (sizeof (nstack_fd_set)); + write_out = malloc (sizeof (nstack_fd_set)); + err_out = malloc (sizeof (nstack_fd_set)); + if ((!read_out) || (!write_out) || (!err_out)) + { + NSPOL_LOGERR ("malloc nstack_fd_set fail"); + FREE_FD_SET (read_out, write_out, err_out); + return -1; + } + int ret = NSTACK_FD_ZERO (read_out); + int ret1 = NSTACK_FD_ZERO (write_out); + int ret2 = NSTACK_FD_ZERO (err_out); + + if ((EOK != ret) || (EOK != ret1) || (EOK != ret2)) + { + NSPOL_LOGERR ("NSTACK_FD_ZERO fail"); + FREE_FD_SET (read_out, write_out, err_out); + return -1; + } + + for (i = 0; i < fdsize; i++) + { + if (!((readfd && NSTACK_FD_ISSET (i, readfd)) + || (writefd && NSTACK_FD_ISSET (i, writefd)) + || (exceptfd && NSTACK_FD_ISSET (i, exceptfd)))) + { + continue; + } + sock = sbr_lookup_sk (i); + if (sock == NULL) + { + errno = EBADF; + FREE_FD_SET (read_out, write_out, err_out); + return -1; + } + conn = sbr_get_conn (sock); + if (!conn) + { + errno = EBADF; + FREE_FD_SET (read_out, write_out, err_out); + return -1; + } + if (readfd && NSTACK_FD_ISSET (i, readfd) && + ((sbr_get_fd_share (sock)->lastdata != NULL) + || (conn->rcvevent > 0))) + { + NSTACK_FD_SET (i, read_out); + nready++; + } + if (writefd && NSTACK_FD_ISSET (i, writefd) && (conn->sendevent != 0)) + { + NSTACK_FD_SET (i, write_out); + nready++; + } + if (exceptfd && NSTACK_FD_ISSET (i, exceptfd) && (conn->errevent != 0)) + { + NSTACK_FD_SET (i, write_out); + nready++; + } + } + + //TODO: need to handle fd_set and nstack_fd_set memory issue + if (readfd) + { + *readfd = *read_out; + } + + if (writefd) + { + *writefd = *write_out; + } + + if (exceptfd) + { + *exceptfd = *err_out; + } + + FREE_FD_SET (read_out, write_out, err_out); + return nready; } diff --git a/stacks/lwip_stack/lwip_src/socket/stackx_protocol_api.c b/stacks/lwip_stack/lwip_src/socket/stackx_protocol_api.c index 920d73d..0be8d7b 100644 --- a/stacks/lwip_stack/lwip_src/socket/stackx_protocol_api.c +++ b/stacks/lwip_stack/lwip_src/socket/stackx_protocol_api.c @@ -56,7 +56,7 @@ sbr_init_protocol () int sbr_fork_protocol () { - pid_t pid = updata_sys_pid (); + pid_t pid = update_sys_pid (); NSSBR_LOGINF ("update pid in child]pid=%d", pid); return sbr_fork_stackx (); diff --git a/stacks/lwip_stack/src/sbr/sbr_protocol_api.h b/stacks/lwip_stack/src/sbr/sbr_protocol_api.h index 0eac1c4..95ca565 100644 --- a/stacks/lwip_stack/src/sbr/sbr_protocol_api.h +++ b/stacks/lwip_stack/src/sbr/sbr_protocol_api.h @@ -91,6 +91,8 @@ int sbr_init_protocol (); int sbr_fork_protocol (); sbr_fdopt *sbr_get_fdopt (int domain, int type, int protocol); void sbr_app_touch_in (void); /*app send its version info to nStackMain */ +int lwip_try_select (int fdsize, fd_set * fdread, fd_set * fdwrite, + fd_set * fderr, struct timeval *timeout); #ifdef __cplusplus /* *INDENT-OFF* */ diff --git a/stacks/lwip_stack/src/sbr/sbr_socket.c b/stacks/lwip_stack/src/sbr/sbr_socket.c index e088224..6f867ab 100644 --- a/stacks/lwip_stack/src/sbr/sbr_socket.c +++ b/stacks/lwip_stack/src/sbr/sbr_socket.c @@ -1065,7 +1065,7 @@ SBR_INTERCEPT (int, select, (int nfds, fd_set * readfd, fd_set * writefd, fd_set * exceptfd, struct timeval * timeout)) { - return -1; + return lwip_try_select (nfds, readfd, writefd, exceptfd, timeout); } SBR_INTERCEPT (unsigned int, ep_getevt, diff --git a/stacks/rsocket/config/rd_config.json b/stacks/rsocket/config/rd_config.json index ea1fc7b..5c6f861 100644 --- a/stacks/rsocket/config/rd_config.json +++ b/stacks/rsocket/config/rd_config.json @@ -2,7 +2,7 @@ "ip_route": [ { "subnet": "192.168.1.1/24", - "type": "nstack-rsocket", + "stack_name": "rsocket", }, ], "prot_route": [ diff --git a/stacks/vpp/configure/rd_config.json b/stacks/vpp/configure/rd_config.json index 2ea10d1..166fbec 100644 --- a/stacks/vpp/configure/rd_config.json +++ b/stacks/vpp/configure/rd_config.json @@ -2,25 +2,25 @@ "ip_route": [ { "subnet": "192.168.1.1/24", - "type": "nstack-vpp", + "stack_name": "vpp_hoststack", }, { "subnet": "10.145.240.1/24", - "type": "nstack-kernel", + "stack_name": "kernel", }, { "subnet": "192.166.1.1/24", - "type": "nstack-kernel", + "stack_name": "kernel", } ], "prot_route": [ { "proto_type": "1", - "type": "nstack-vpp", + "stack_name": "vpp_hoststack", }, { "proto_type": "2", - "type": "nstack-kernel", + "stack_name": "kernel", } ], } |