From cb6a1be08c8edf9d1cdebcd0bd6ed41b5b8277f8 Mon Sep 17 00:00:00 2001 From: "Anand H. Krishnan" Date: Wed, 22 Jul 2015 12:44:15 +0530 Subject: [PATCH] Process sandesh decode errors If an incoming sandesh message is not decoded by the sandesh library (because of some internal bugs/failures), such a failure needs to be communicated to agent. We now check for return value from sandesh decode and if the return value indicates a sandesh decode failure, we return from netlink 'doit' with that error, which gets passed up to the application. Change-Id: I39b2621a4ce89750160b7fac105ac2ecd24e60e0 Partial-BUG: #1466607 --- dp-core/vr_message.c | 7 ++++++- dp-core/vr_sandesh.c | 4 ++-- dpdk/vr_dpdk_netlink.c | 6 +++++- linux/vr_genetlink.c | 8 +++++++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/dp-core/vr_message.c b/dp-core/vr_message.c index 3394e8be1..d41ed927b 100644 --- a/dp-core/vr_message.c +++ b/dp-core/vr_message.c @@ -53,6 +53,8 @@ vr_mtrans_free(void *buf) int vr_message_request(struct vr_message *message) { + int ret; + if (!message_h.vm_proto) return 0; @@ -66,8 +68,11 @@ vr_message_request(struct vr_message *message) return -EBADFD; #endif - message_h.vm_proto->mproto_decode(message->vr_message_buf, + ret = message_h.vm_proto->mproto_decode(message->vr_message_buf, message->vr_message_len, NULL, NULL); + if (ret < 0) + return ret; + return 0; } diff --git a/dp-core/vr_sandesh.c b/dp-core/vr_sandesh.c index e747d20ee..254d7ed72 100644 --- a/dp-core/vr_sandesh.c +++ b/dp-core/vr_sandesh.c @@ -124,8 +124,8 @@ sandesh_proto_decode(char *buf, unsigned int len, { int ret = 0; - sandesh_decode((unsigned char *)buf, len, vr_find_sandesh_info, &ret); - return ret; + return sandesh_decode((unsigned char *)buf, len, + vr_find_sandesh_info, &ret); } static struct vr_mproto sandesh_mproto = { diff --git a/dpdk/vr_dpdk_netlink.c b/dpdk/vr_dpdk_netlink.c index 79c663deb..29b39d477 100644 --- a/dpdk/vr_dpdk_netlink.c +++ b/dpdk/vr_dpdk_netlink.c @@ -89,11 +89,15 @@ int dpdk_netlink_receive(void *usockp, char *nl_buf, unsigned int nl_len) { + int ret; struct vr_message request; request.vr_message_buf = nl_buf + HDR_LEN; request.vr_message_len = nl_len - HDR_LEN; - vr_message_request(&request); + + ret = vr_message_request(&request); + if (ret < 0) + vr_send_response(ret); dpdk_nl_process_response(usockp, (struct nlmsghdr *)nl_buf); diff --git a/linux/vr_genetlink.c b/linux/vr_genetlink.c index 1e8b87cda..23b6292fc 100644 --- a/linux/vr_genetlink.c +++ b/linux/vr_genetlink.c @@ -17,6 +17,7 @@ #include "vr_types.h" #include "vr_message.h" #include "sandesh.h" +#include "vr_response.h" static int netlink_trans_request(struct sk_buff *, struct genl_info *); @@ -81,6 +82,7 @@ static int netlink_trans_request(struct sk_buff *in_skb, struct genl_info *info) { char *buf; + int ret; unsigned int len; uint32_t multi_flag; struct nlmsghdr *rep, *nlh = info->nlhdr; @@ -97,7 +99,11 @@ netlink_trans_request(struct sk_buff *in_skb, struct genl_info *info) request.vr_message_buf = nla_data(nla); request.vr_message_len = nla_len(nla); - vr_message_request(&request); + ret = vr_message_request(&request); + if (ret < 0) { + if (vr_send_response(ret)) + return ret; + } #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0)) netlink_id = NETLINK_CB(in_skb).pid;