diff options
| author | 陆秋文 <[email protected]> | 2024-04-01 07:59:57 +0000 |
|---|---|---|
| committer | 宋延超 <[email protected]> | 2024-04-01 07:59:57 +0000 |
| commit | 3a51336967fd8027e9ae4000bd81ce2443e9ba87 (patch) | |
| tree | ab32109085ee4ad68597f9f0ebb7bf7074c385da /app/src/sendpath.c | |
| parent | fdb63a8888c061cf6fd9887d715c487938b92703 (diff) | |
Feature retrieve object of backpressure
Diffstat (limited to 'app/src/sendpath.c')
| -rw-r--r-- | app/src/sendpath.c | 238 |
1 files changed, 1 insertions, 237 deletions
diff --git a/app/src/sendpath.c b/app/src/sendpath.c index 5306132..453be71 100644 --- a/app/src/sendpath.c +++ b/app/src/sendpath.c @@ -105,245 +105,9 @@ static struct mr_sendpath * sendpath_vdev_create(struct mr_instance * instance, return &_sendpath->_father; } -/* ======================================================================================= */ - -static void sendpath_route_destory(struct mr_sendpath * sendpath) -{ - struct __mr_sendpath_route * _sendpath = container_of(sendpath, - struct __mr_sendpath_route, _father); - - free(_sendpath); -} - -static int sendpath_route_l2_construct(struct mr_sendpath * sendpath, - struct rte_mbuf * mbuf[], unsigned int nr_mbuf) -{ - struct __mr_sendpath_route * _sendpath = container_of(sendpath, - struct __mr_sendpath_route, _father); - - for (int i = 0; i < nr_mbuf; i++) - { - struct rte_ether_hdr * ether_hdr = (struct rte_ether_hdr *)rte_pktmbuf_prepend(mbuf[i], - sizeof(struct rte_ether_hdr)); - - MR_VERIFY_2(ether_hdr != NULL, "Not enough space for ethernet header in mbufs. "); - -#if RTE_VERSION_NUM(21, 11, 0, 0) <= RTE_VERSION - ether_hdr->src_addr = _sendpath->src_eth_addr; - ether_hdr->dst_addr = _sendpath->dst_eth_addr; -#else - ether_hdr->s_addr = _sendpath->src_eth_addr; - ether_hdr->d_addr = _sendpath->dst_eth_addr; -#endif - ether_hdr->ether_type = htons(RTE_ETHER_TYPE_IPV4); - } - - return 0; -} - -static int sendpath_route_l3_construct(struct mr_sendpath * sendpath, - struct rte_mbuf * mbuf[], unsigned int nr_mbuf) -{ - struct __mr_sendpath_route * _sendpath = container_of(sendpath, - struct __mr_sendpath_route, _father); - - for (int i = 0; i < nr_mbuf; i++) - { - struct rte_ipv4_hdr * ip_hdr = rte_pktmbuf_mtod(mbuf[i], struct rte_ipv4_hdr *); - ip_hdr->src_addr = _sendpath->src_addr.s_addr; - ip_hdr->dst_addr = _sendpath->dst_addr.s_addr; - - ip_hdr->hdr_checksum = 0; - ip_hdr->hdr_checksum = rte_ipv4_cksum(ip_hdr); - } - - return 0; -} - -static int sendpath_route_requery(struct mr_sendpath * sendpath) -{ - struct mr_instance * instance = sendpath->instance; - struct __mr_sendpath_route * _sendpath = container_of(sendpath, - struct __mr_sendpath_route, _father); - - int ret = neigh_query(instance->neigh, _sendpath->target_addr, - &_sendpath->dst_eth_addr, &sendpath->target_vdi); - - if (ret < 0) - { - neigh_create_or_update(instance->neigh, _sendpath->target_addr, NULL, - sendpath->target_vdi, 0); return RT_ERR; - } - else - { - sendpath->can_use = 1; - return RT_SUCCESS; - } - - return RT_SUCCESS; -} - -static int sendpath_route_option_set(struct mr_instance * instance, struct mr_sendpath * sendpath, - int opt, va_list va_list) -{ - if (opt == MR_SENDPATH_OPT_BUILD_L2) - { - unsigned int enable = va_arg(va_list, unsigned int); - sendpath->fn_l2_construct = enable ? sendpath_route_l2_construct : NULL; - } - else if (opt == MR_SENDPATH_OPT_BUILD_L3) - { - unsigned int enable = va_arg(va_list, unsigned int); - sendpath->fn_l3_construct = enable ? sendpath_route_l3_construct : NULL; - } - else if (opt == MR_SENDPATH_OPT_HOOK_PREBUILD) - { - sendpath->fn_prebuild_hook = va_arg(va_list, void *); - sendpath->prebuild_hook_args = va_arg(va_list, void *); - } - else if (opt == MR_SENDPATH_OPT_HOOK_POSTBUILD) - { - sendpath->fn_postbuild_hook = va_arg(va_list, void *); - sendpath->postbuild_hook_args = va_arg(va_list, void *); - } - else - { - MR_ERROR("Invalided opt type in %s()", __FUNCTION__); - return -EINVAL; - } - - return 0; -} - -static int sendpath_route_option_get(struct mr_instance * instance, struct mr_sendpath * sendpath, - int opt, va_list va_list) -{ - return 0; -} - static struct mr_sendpath * sendpath_route_create(struct mr_instance * instance, int type, va_list va_list) { - struct mr_vdev * target_vdev = NULL; - struct in_addr in_addr; - - /* 对于一般的路由,传入目标地址 */ - if (type == MR_SENDPATH_ROUTE_NORMAL) - { - target_vdev = NULL; - in_addr = va_arg(va_list, struct in_addr); - } - - /* 对于指定出口设备的路由,传入(1)设备句柄(2)目标IP地址 */ - else if (type == MR_SENDPATH_ROUTE_SPEC_DEV) - { - target_vdev = va_arg(va_list, struct mr_vdev *); - in_addr = va_arg(va_list, struct in_addr); - } - else - { - assert(0); - } - - struct in_addr target_in_addr = { INADDR_NONE }; - - /* 查找合适的设备 */ - if (target_vdev != NULL) goto _build; - - for (int i = 0; i < instance->nr_vdevs; i++) - { - struct mr_vdev * vdev = &instance->vdevs[i]; - struct vdev * __vdev = vdev->vdi->vdev; - - if (!is_same_subnet(in_addr, __vdev->in_addr, __vdev->in_mask)) - continue; - - target_in_addr = in_addr; - target_vdev = vdev; - } - -_build: - - /* 没有找到设备,说明没有路由 */ - if (target_vdev == NULL) - { - char str_in_addr[MR_STRING_MAX] = { 0 }; - inet_ntop(AF_INET, &in_addr, str_in_addr, INET_ADDRSTRLEN); - - MR_ERROR("No route to address %s, creating route sendpath failed. ", - str_in_addr); return NULL; - } - - struct vdev * __target_vdev = target_vdev->vdi->vdev; - - /* 判断目标IP地址是否属于网卡所在的网段,如不在,走网关 */ - if (is_same_subnet(in_addr, __target_vdev->in_addr, __target_vdev->in_mask)) - { - target_in_addr = in_addr; - } - else - { - target_in_addr = __target_vdev->in_gateway; - } - - /* 目的地址不合法,返回 */ - if (target_in_addr.s_addr == htonl(INADDR_ANY) || - target_in_addr.s_addr == htonl(INADDR_LOOPBACK) || - target_in_addr.s_addr == htonl(INADDR_NONE)) - { - char str_target_in_addr[MR_STRING_MAX] = { 0 }; - char str_in_addr[MR_STRING_MAX] = { 0 }; - - inet_ntop(AF_INET, &target_in_addr, str_target_in_addr, INET_ADDRSTRLEN); - inet_ntop(AF_INET, &in_addr, str_in_addr, INET_ADDRSTRLEN); - - MR_WARNING("Invalid target ip address %s(or next hop address), " - "creating route sendpath for %s failed. ", str_target_in_addr, - str_in_addr); return NULL; - } - - struct __mr_sendpath_route * _sendpath = malloc(sizeof(struct __mr_sendpath_route)); - memset(_sendpath, 0, sizeof(struct __mr_sendpath_route)); - - struct mr_sendpath * sendpath = &_sendpath->_father; - - /* 填充SendPath各虚函数指针*/ - sendpath->instance = target_vdev->instance; - sendpath->target_vdi = target_vdev->vdi; - sendpath->vdev = target_vdev; - - sendpath->fn_requery = sendpath_route_requery; - sendpath->fn_l2_construct = sendpath_route_l2_construct; - sendpath->fn_l3_construct = sendpath_route_l3_construct; - sendpath->fn_l4_construct = NULL; - - sendpath->fn_option_get = sendpath_route_option_get; - sendpath->fn_option_set = sendpath_route_option_set; - sendpath->fn_destory = sendpath_route_destory; - - _sendpath->src_addr = sendpath->target_vdi->vdev->in_addr; - _sendpath->dst_addr = in_addr; - _sendpath->target_addr = target_in_addr; - rte_ether_addr_copy(&__target_vdev->ether_addr, &_sendpath->src_eth_addr); - - /* 查ARP表 */ - int ret = neigh_query(target_vdev->instance->neigh, target_in_addr, - &_sendpath->dst_eth_addr, &sendpath->target_vdi); - - /* 没有查询成功,保存起来下一次再查 */ - if (ret < 0) - { - neigh_create_or_update(target_vdev->instance->neigh, target_in_addr, - NULL, target_vdev->vdi, 0); sendpath->can_use = 0; - } - else - { - sendpath->can_use = 1; - } - - MR_DEBUG("Sendpath created: type=%d, in_addr=%u, target_in_addr=%u", type, - in_addr.s_addr, target_in_addr.s_addr); - - return sendpath; + return NULL; } /* ======================================================================================== */ |
