summaryrefslogtreecommitdiff
path: root/app/src/sendpath.c
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2017-07-12 09:58:57 +0800
committerQiuwen Lu <[email protected]>2017-07-12 09:58:57 +0800
commitd7eeb5574c2669479b562c43dcb36e6697775ae7 (patch)
tree567077829bb10f3af3ad00a1299eb1f36e61bda0 /app/src/sendpath.c
parent2739172656216bca077605d29155181fa95628ef (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.c74
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__);