diff options
| author | Qiuwen Lu <[email protected]> | 2017-07-12 09:58:57 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2017-07-12 09:58:57 +0800 |
| commit | d7eeb5574c2669479b562c43dcb36e6697775ae7 (patch) | |
| tree | 567077829bb10f3af3ad00a1299eb1f36e61bda0 /app/src/sendpath.c | |
| parent | 2739172656216bca077605d29155181fa95628ef (diff) | |
(1)增加sendpath的Prebuild和Postbuild位置的用户回调函数功能,在sendpath的option中设置。(2)增加buffer的deep-deep克隆操作,克隆buffer全部区域和控制域。(3)修正service的monit信息刷写在获取网卡信息缓慢时没有示数的Bug。
Diffstat (limited to 'app/src/sendpath.c')
| -rw-r--r-- | app/src/sendpath.c | 74 |
1 files changed, 72 insertions, 2 deletions
diff --git a/app/src/sendpath.c b/app/src/sendpath.c index e8ca549..0fc6a38 100644 --- a/app/src/sendpath.c +++ b/app/src/sendpath.c @@ -17,6 +17,59 @@ static inline int is_same_subnet(struct in_addr a_addr, struct in_addr b_addr, s /* ======================================================================================= */ +static int sendpath_vdev_l2_construct(struct mr_sendpath * sendpath, + struct rte_mbuf * mbuf[], unsigned int nr_mbuf) +{ + struct __mr_sendpath_vdev * _sendpath = container_of(sendpath, + struct __mr_sendpath_vdev, _father); + + for (int i = 0; i < nr_mbuf; i++) + { + struct ether_hdr * ether_hdr = (struct ether_hdr *)rte_pktmbuf_prepend(mbuf[i], + sizeof(struct ether_hdr)); + + MR_VERIFY_2(ether_hdr != NULL, "Not enough space for ethernet header in mbufs. "); + ether_hdr->s_addr = _sendpath->src_eth_addr; + ether_hdr->d_addr = _sendpath->dst_eth_addr; + ether_hdr->ether_type = htons(ETHER_TYPE_IPv4); + } + + return 0; +} + +static int sendpath_vdev_option_get(struct mr_instance * instance, struct mr_sendpath * sendpath, + int opt, va_list va_list) +{ + return 0; +} + +static int sendpath_vdev_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_vdev_l2_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 void sendpath_vdev_destory(struct mr_sendpath * sendpath) { struct __mr_sendpath_vdev * _sendpath = container_of(sendpath, struct __mr_sendpath_vdev, _father); @@ -31,9 +84,16 @@ static struct mr_sendpath * sendpath_vdev_create(struct mr_instance * instance, struct __mr_sendpath_vdev * _sendpath = malloc(sizeof(struct __mr_sendpath_vdev)); memset(_sendpath, 0, sizeof(struct __mr_sendpath_vdev)); - _sendpath->_father.fn_destory = sendpath_vdev_destory; - _sendpath->_father.target_vdi = dest_vdev->vdi; + /* Parameters */ + _sendpath->_father.target_vdi = dest_vdev->vdi; _sendpath->_father.can_use = 1; + + /* Callback Functions */ + _sendpath->_father.fn_destory = sendpath_vdev_destory; + _sendpath->_father.fn_l2_construct = sendpath_vdev_l2_construct; + _sendpath->_father.fn_option_set = sendpath_vdev_option_set; + _sendpath->_father.fn_option_get = sendpath_vdev_option_get; + return &_sendpath->_father; } @@ -122,6 +182,16 @@ static int sendpath_route_option_set(struct mr_instance * instance, struct mr_se 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__); |
