diff options
Diffstat (limited to 'stacks/lwip_stack/lwip_src/core/spl_pbuf.c')
-rw-r--r-- | stacks/lwip_stack/lwip_src/core/spl_pbuf.c | 611 |
1 files changed, 0 insertions, 611 deletions
diff --git a/stacks/lwip_stack/lwip_src/core/spl_pbuf.c b/stacks/lwip_stack/lwip_src/core/spl_pbuf.c deleted file mode 100644 index e4aa014..0000000 --- a/stacks/lwip_stack/lwip_src/core/spl_pbuf.c +++ /dev/null @@ -1,611 +0,0 @@ -/* -* -* Copyright (c) 2018 Huawei Technologies Co.,Ltd. -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at: -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -#include "spl_opt.h" - -#include "spl_def.h" -#include "spl_pbuf.h" -#include "stackx_pbuf.h" - -#include "stackx_spl_share.h" -#include "spl_api.h" - -#include "nsfw_maintain_api.h" -#include "netif/sc_dpdk.h" -#include <common_mem_mbuf.h> - -#include <string.h> -#include "nstack_log.h" -#include "nstack_securec.h" -#include "spl_instance.h" - -#include "sys.h" -#include "mem.h" -#include "memp.h" -//#include "sockets.h" -//#include <netinet/in.h> -#include <stdio.h> -#include <stdlib.h> -#ifdef HAL_LIB -#else -#include "rte_memcpy.h" -#endif -#define SIZEOF_STRUCT_PBUF LWIP_MEM_ALIGN_SIZE(sizeof(struct spl_pbuf)) -u16_t g_offSetArry[SPL_PBUF_MAX_LAYER]; - -u16_t g_offSetArry[SPL_PBUF_MAX_LAYER] = - { PBUF_TRANSPORT_HLEN + PBUF_IP_HLEN + SPL_PBUF_LINK_HLEN, - SPL_PBUF_UDP_HLEN + PBUF_IP_HLEN + SPL_PBUF_LINK_HLEN, - PBUF_IP_HLEN + SPL_PBUF_LINK_HLEN, - SPL_PBUF_LINK_HLEN, - 0 -}; - -inline struct spl_pbuf * -spl_pbuf_alloc_hugepage (spl_pbuf_layer layer, u16_t length, - spl_pbuf_type Type, u16_t proc_id, void *net_conn) -{ - struct spl_pbuf *p; - u16_t offset; - u16_t count = 0; - spl_netconn_t *conn = (spl_netconn_t *) net_conn; - - NSPOL_LOGDBG (PBUF_DEBUG | STACKX_DBG_TRACE, - "spl_pbuf_alloc_hugepage]length=%" U16_F, length); - - /* determine header offset */ - if (likely (layer < SPL_PBUF_MAX_LAYER)) - { - offset = g_offSetArry[layer]; - } - else - { - NSPOL_LOGERR ("spl_pbuf_alloc_hugepage: bad pbuf layer"); - return NULL; - } - - if (unlikely (length < offset || Type != SPL_PBUF_HUGE)) - { - NSPOL_LOGERR ("input is invalid!]length=%u, Type = %d", length, Type); - return NULL; - } - - p = spl_mbuf_malloc (length, SPL_PBUF_HUGE, &count); - - if (p == NULL) - { - /* last_log_prt_time and unprint_log_count indeed have multi-thread issue, - * but their values don't have precision requirement. No risk. */ - NS_LOG_CTRL (LOG_CTRL_HUGEPAGE_ALLOC_FAIL, STACKX, "NSLWIP", NSLOG_ERR, - "pbuf_alloc_huge: Could not allocate PBUF for SPL_PBUF_HUGE"); - - return NULL; - } - - if (conn) - { - p->conn_a = ADDR_LTOSH (conn); - } - else - { - p->conn_a = 0; - } - - p->tot_len -= offset; - p->len -= offset; - p->next_a = 0; - - p->payload_a = p->payload_a + offset; - - p->proto_type = SPL_PBUF_PROTO_NONE; - - NSPOL_LOGDBG (PBUF_DEBUG | STACKX_DBG_TRACE, - "pbuf_alloc]length=%" U16_F ",p=%p", length, (void *) p); - return p; -} - -inline int -spl_pbuf_internal_copy (struct spl_pbuf *dst, struct spl_pbuf *src) -{ - u32_t dst_len = dst->len; - u32_t src_len = src->len; - u32_t dst_pos = 0; - u32_t src_pos = 0; - while (dst != NULL && src != NULL) - { - if (dst_len > src_len) - { - if (NULL == - common_memcpy (PTR_SHTOL (char *, dst->payload_a) + dst_pos, - PTR_SHTOL (char *, src->payload_a) + src_pos, - src_len)) - { - NSPOL_LOGERR ("rte_memcpy error"); - return -1; - } - - dst_len -= src_len; - dst_pos += src_len; - src = ADDR_SHTOL (src->next_a); - src_len = src != NULL ? src->len : 0; - src_pos = 0; - } - else if (dst_len < src_len) - { - if (NULL == - common_memcpy (PTR_SHTOL (char *, dst->payload_a) + dst_pos, - PTR_SHTOL (char *, src->payload_a) + src_pos, - dst_len)) - { - NSPOL_LOGERR ("rte_memcpy error"); - return -1; - } - - src_len -= dst_len; - src_pos += dst_len; - dst = ADDR_SHTOL (dst->next_a); - dst_len = dst != NULL ? dst->len : 0; - dst_pos = 0; - } - else - { - if (NULL == - common_memcpy (PTR_SHTOL (char *, dst->payload_a) + dst_pos, - PTR_SHTOL (char *, src->payload_a) + src_pos, - dst_len)) - { - NSPOL_LOGERR ("rte_memcpy error"); - return -1; - } - - src = ADDR_SHTOL (src->next_a); - src_len = src != NULL ? src->len : 0; - src_pos = 0; - dst = ADDR_SHTOL (dst->next_a); - dst_len = dst != NULL ? dst->len : 0; - dst_pos = 0; - } - } - return 0; -} - -void -spl_pbuf_realloc (struct spl_pbuf *p, u32_t new_len) -{ - if (NULL != p && p->type == SPL_PBUF_HUGE) - { - p->tot_len = new_len; - p->len = new_len; - return; - } -} - -void -spl_pbuf_free (struct spl_pbuf *p) -{ - struct spl_pbuf *q; - u8_t count = 0; - - NSPOL_LOGINF (PBUF_DEBUG, "Freeing PBF %p", p); - - if (unlikely (p == NULL || p->type != SPL_PBUF_HUGE)) - { - NSPOL_LOGDBG (PBUF_DEBUG | STACKX_DBG_LEVEL_SERIOUS, - "input param illegal]p=%p, type=%d", p, p ? p->type : -1); - return; - } - - (void) count; - - /* de-allocate all consecutive pbufs from the head of the chain that - * obtain a zero reference count after decrementing*/ - do - { - /* remember next pbuf in chain for next iteration */ - NSPOL_LOGDBG (PBUF_DEBUG | STACKX_DBG_TRACE, - "spl_pbuf_free: deallocating]buf=%p", (void *) p); - q = (struct spl_pbuf *) ADDR_SHTOL (p->next_a); - if (res_free (&p->res_chk)) - { - //NSPOL_LOGERR("res_free failed]p=%p", p); - } - - count++; - { - pbuf_set_recycle_flg (p, MBUF_UNUSED); /* release buf hold by app on abnormal exit */ - spl_mbuf_free ((char *) p - sizeof (struct common_mem_mbuf)); - p->res_chk.u8Reserve |= PBUF_FREE_FLAG; - } - - /* proceed to next pbuf */ - p = q; - } - while (p != NULL); - - /* return number of de-allocated pbufs */ - return; -} - -void -spl_pbuf_cat (struct spl_pbuf *h, struct spl_pbuf *t) -{ - struct spl_pbuf *p; - - if (h == NULL || t == NULL) - { - NSPOL_LOGERR ("pbuf_cat: h=NULL||t=NULL!!"); - return; - } - - for (p = h; p->next_a != 0; p = PTR_SHTOL (struct spl_pbuf *, p->next_a)) - { - /* add total length of second chain to all totals of first chain */ - p->tot_len += t->tot_len; - } - - if (0 != p->next_a) - { - NSPOL_LOGERR - ("pbuf_cat: p is not the last pbuf of the first chain, p->next_a != 0"); - return; - } - - /* add total length of second chain to last pbuf total of first chain */ - p->tot_len += t->tot_len; - - /* chain last pbuf of head (p) with first of tail (t) */ - p->next_a = (uint64_t) ADDR_LTOSH_EXT (t); - - /* p->next now references t, but the caller will drop its reference to t, - * so netto there is no change to the reference count of t. - */ -} - -err_t -spl_pbuf_copy (struct spl_pbuf * p_to, struct spl_pbuf * p_from) -{ - u32_t offset_to = 0; - u32_t offset_from = 0; - u32_t len = 0; - NSPOL_LOGDBG (PBUF_DEBUG | STACKX_DBG_TRACE, "pbuf_copy]p_to=%p,p_from=%p", - (void *) p_to, (void *) p_from); - - if (! - ((p_to != NULL) && (p_from != NULL) - && (p_to->tot_len >= p_from->tot_len))) - { - NSPOL_LOGERR ("pbuf_copy: target not big enough to hold source"); - return ERR_ARG; - } - - do - { - if (p_to == NULL) - { - NSPOL_LOGERR ("pbuf_copy: target pbuf not exist: p_to == NULL!!"); - return ERR_ARG; - } - - if ((p_to->len - offset_to) >= (p_from->len - offset_from)) - { - - len = p_from->len - offset_from; - } - else - { - - len = p_to->len - offset_to; - } - - if (EOK != - MEMMOVE_S ((u8_t *) ADDR_SHTOL (p_to->payload_a) + offset_to, len, - (u8_t *) ADDR_SHTOL (p_from->payload_a) + offset_from, - len)) - { - NSPOL_LOGERR ("MEMMOVE_S failed"); - return ERR_MEM; - } - - offset_to += len; - offset_from += len; - if (offset_to > p_to->len) - { - NSPOL_LOGERR - ("pbuf_copy: target offset not match: offset_to > p_to->len."); - return ERR_VAL; - } - if (offset_to == p_to->len) - { - offset_to = 0; - p_to = (struct spl_pbuf *) ADDR_SHTOL (p_to->next_a); - } - - if (offset_from >= p_from->len) - { - /* on to next p_from (if any) */ - NSPOL_LOGDBG (PBUF_DEBUG | STACKX_DBG_TRACE, - "pbuf_copy: source offset not match: offset_from >= p_from->len"); - offset_from = 0; - p_from = (struct spl_pbuf *) ADDR_SHTOL (p_from->next_a); - } - - if ((p_from != NULL) && (p_from->len == p_from->tot_len)) - { - if ((p_from->next_a != 0)) - { - NSPOL_LOGERR ("pbuf_copy() does not allow packet queues!"); - return ERR_VAL; - } - } - - if ((p_to != NULL) && (p_to->len == p_to->tot_len)) - { - /* don't copy more than one packet! */ - if ((p_to->next_a != 0)) - { - NSPOL_LOGERR ("pbuf_copy() does not allow packet queues!"); - return ERR_VAL; - } - } - } - while (p_from); - - NSPOL_LOGDBG (PBUF_DEBUG | STACKX_DBG_TRACE, - "pbuf_copy: end of chain reached."); - return ERR_OK; -} - -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; - u32_t offset_from = 0; - u32_t len = 0; - - NSPOL_LOGINF (NETIF_DEBUG, "splpbuf_to_pbuf_copy"); - - if (! - ((p_to != NULL) && (p_from != NULL) - && (p_to->tot_len >= p_from->tot_len))) - { - NSPOL_LOGERR - ("splpbuf_to_pbuf_copy: target not big enough to hold source"); - return ERR_ARG; - } - NSPOL_LOGINF (PBUF_DEBUG, - "splpbuf_to_pbuf_copy]p_to=%p [type %d tot_len %d], p_from=%p [type %d tot_len %d]", - (void *) p_to, p_to->type, p_to->tot_len, (void *) p_from, - p_from->type, p_from->tot_len); - do - { - NSPOL_LOGINF (NETIF_DEBUG, "copying...."); - if (p_to == NULL) - { - NSPOL_LOGERR - ("splpbuf_to_pbuf_copy: target not big enough to hold source p_to len [%d] p_from len [%d]", - p_to->tot_len, p_from->tot_len); - return ERR_ARG; - } - - if ((p_to->len - offset_to) >= (p_from->len - offset_from)) - { - - len = p_from->len - offset_from; - } - else - { - - len = p_to->len - offset_to; - } - - if (EOK != MEMMOVE_S ((u8_t *) p_to->payload + offset_to, - len, - (u8_t *) ADDR_SHTOL (p_from->payload_a) + - offset_from, len)) - { - NSPOL_LOGERR ("MEMMOVE_S failed"); - return ERR_MEM; - } - - offset_to += len; - offset_from += len; - if (offset_to > p_to->len) - { - NSPOL_LOGERR - ("splpbuf_to_pbuf_copy: target offset not match: offset_to > p_to->len."); - return ERR_VAL; - } - if (offset_to == p_to->len) - { - offset_to = 0; - p_to = p_to->next; - - NSPOL_LOGINF (NETIF_DEBUG, - "splpbuf_to_pbuf_copy: p_to next %p", p_to); - } - - if (offset_from >= p_from->len) - { - /* on to next p_from (if any) */ - NSPOL_LOGINF (NETIF_DEBUG, - "splpbuf_to_pbuf_copy: source offset not match: offset_from >= p_from->len"); - offset_from = 0; - p_from = (struct spl_pbuf *) ADDR_SHTOL (p_from->next_a); - NSPOL_LOGINF (NETIF_DEBUG, - "splpbuf_to_pbuf_copy: pfrom next %p", p_from); - } - - if ((p_from != NULL) && (p_from->len == p_from->tot_len)) - { - if ((p_from->next_a != 0)) - { - NSPOL_LOGERR - ("splpbuf_to_pbuf_copy() does not allow packet queues!"); - return ERR_VAL; - } - } - - if ((p_to != NULL) && (p_to->len == p_to->tot_len)) - { - /* don't copy more than one packet! */ - if ((p_to->next != NULL)) - { - NSPOL_LOGERR - ("splpbuf_to_pbuf_copy() does not allow packet queues!"); - return ERR_VAL; - } - } - } - while (p_from); - - NSPOL_LOGDBG (NETIF_DEBUG, "splpbuf_to_pbuf_copy: end of chain reached."); - return ERR_OK; -} - -err_t -pbuf_to_splpbuf_copy (struct spl_pbuf * p_to, struct pbuf * p_from) -{ - int offset = 0; - void *data = NULL; - - do - { - data = (u8_t *) (p_to->payload_a) + offset; - memcpy (data, (u8_t *) p_from->payload, p_from->len); - offset = offset + p_from->len; - if (offset >= 2048) - { - NSPOL_LOGERR ("More thank 2K size"); - return ERR_MEM; - } - p_from = p_from->next; - } - while (p_from != NULL); - - return ERR_OK; -} - -struct pbuf * -spl_convert_spl_pbuf_to_pbuf (struct spl_pbuf *p_from) -{ - struct pbuf *p_to = NULL; - - p_to = pbuf_alloc (PBUF_RAW, p_from->tot_len, PBUF_POOL); - if (p_to) - { - splpbuf_to_pbuf_copy (p_to, p_from); - } - return p_to; -} - -spl_pbuf_layer -get_pbuf_layer_from_pbuf_payload (struct pbuf * buf) -{ - - struct eth_hdr *ethhdr; - spl_pbuf_layer layer = SPL_PBUF_TRANSPORT; - u16_t type; - - if (buf->len <= SIZEOF_ETH_HDR) - { - NSPOL_LOGINF (PBUF_DEBUG, - "get_pbuf_layer_from_payload failed. length is wrong"); - return layer; - } - ethhdr = (struct eth_hdr *) buf->payload; - type = spl_htons (ethhdr->type); - - NSPOL_LOGINF (PBUF_DEBUG, "packet type %x", type); - - switch (type) - { - case ETHTYPE_IP: - layer = SPL_PBUF_IP; - break; - case ETHTYPE_ARP: - layer = SPL_PBUF_LINK; - break; - default: - layer = SPL_PBUF_TRANSPORT; - break; - } - - return layer; -} - -void -print_pbuf_payload_info (struct pbuf *buf, bool send) -{ - - struct eth_hdr *ethhdr; - u16_t type; - - if (buf->len <= SIZEOF_ETH_HDR) - { - NSPOL_LOGINF (PBUF_DEBUG, - "get_pbuf_layer_from_payload failed. length is wrong"); - return; - } - ethhdr = (struct eth_hdr *) buf->payload; - type = spl_htons (ethhdr->type); - - if (send) - { - NSPOL_LOGINF (PBUF_DEBUG, "send packet start type %x len %d *****", - type, buf->len); - } - else - { - NSPOL_LOGINF (PBUF_DEBUG, - "receive packet start type %x len %d ########", type, - buf->len); - } - - switch (type) - { - case ETHTYPE_IP: - NSPOL_LOGINF (TCPIP_DEBUG, "ip packet len %d tot len %d type %x", - buf->len, buf->tot_len, type); - struct ip_hdr *ip = - (struct ip_hdr *) ((char *) buf->payload + SIZEOF_ETH_HDR); - NSPOL_LOGINF (PBUF_DEBUG, "ip packet src %x dest %x proto %d", ip->src, - ip->dest, ip->_proto); - break; - case ETHTYPE_ARP: - NSPOL_LOGINF (TCPIP_DEBUG, "arp packet len %d tot len %d type %x", - buf->len, buf->tot_len, type); - break; - default: - NSPOL_LOGINF (TCPIP_DEBUG, "other packet len %d tot len %d type %x", - buf->len, buf->tot_len, type); - break; - } - return; -} |