summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlutzbichler <52852266+lutzbichler@users.noreply.github.com>2022-03-15 07:10:59 +0100
committerGitHub <noreply@github.com>2022-03-15 07:10:59 +0100
commit01faa10d1c64254f394857cf9fb9a1e90d2a442e (patch)
tree5c1f0d418b75d5f20fd09f57be5930201a45c390
parent790e0cfc2d1f8105caf5ebb2edeede6b1cb7cac9 (diff)
parenta268e2d68d30ea9b09834dbaca60530b4314774c (diff)
downloadvSomeIP-01faa10d1c64254f394857cf9fb9a1e90d2a442e.tar.gz
Merge pull request #283 from phiwer/dev/retry_netlink
Retry failed netlink operations
-rw-r--r--implementation/endpoints/src/netlink_connector.cpp37
1 files changed, 33 insertions, 4 deletions
diff --git a/implementation/endpoints/src/netlink_connector.cpp b/implementation/endpoints/src/netlink_connector.cpp
index ce82e9f..ebd432d 100644
--- a/implementation/endpoints/src/netlink_connector.cpp
+++ b/implementation/endpoints/src/netlink_connector.cpp
@@ -17,6 +17,12 @@
namespace vsomeip_v3 {
+namespace {
+ const std::uint32_t ifa_request_sequence = 1;
+ const std::uint32_t ifi_request_sequence = 2;
+ const std::uint32_t rt_request_sequence = 3;
+}
+
void netlink_connector::register_net_if_changes_handler(const net_if_changed_handler_t& _handler) {
handler_ = _handler;
}
@@ -181,9 +187,32 @@ void netlink_connector::receive_cbk(boost::system::error_code const &_error,
}
case NLMSG_ERROR: {
struct nlmsgerr *errmsg = (nlmsgerr *)NLMSG_DATA(nlh);
+ if (errmsg->error == 0) {
+ // Ack from netlink
+ break;
+ }
+
VSOMEIP_ERROR << "netlink_connector::receive_cbk received "
- "error message: " << std::dec << nlh->nlmsg_type
+ "error message: " << strerror(errmsg->error)
+ << " type " << std::dec << errmsg->msg.nlmsg_type
<< " seq " << errmsg->msg.nlmsg_seq;
+
+ std::string request_type{};
+ if (errmsg->msg.nlmsg_type == RTM_GETADDR && errmsg->msg.nlmsg_seq == ifa_request_sequence) {
+ request_type = "address request";
+ send_ifa_request();
+ } else if (errmsg->msg.nlmsg_type == RTM_GETLINK && errmsg->msg.nlmsg_seq == ifi_request_sequence) {
+ request_type = "link request";
+ send_ifi_request();
+ } else if (errmsg->msg.nlmsg_type == RTM_GETROUTE && errmsg->msg.nlmsg_seq == rt_request_sequence) {
+ request_type = "route request";
+ send_rt_request();
+ }
+
+ if (!request_type.empty()) {
+ VSOMEIP_INFO << "Retrying netlink " << request_type;
+ }
+
break;
}
case NLMSG_DONE:
@@ -251,7 +280,7 @@ void netlink_connector::send_ifa_request() {
get_address_msg.nlhdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
get_address_msg.nlhdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_ROOT;
get_address_msg.nlhdr.nlmsg_type = RTM_GETADDR;
- get_address_msg.nlhdr.nlmsg_seq = 1;
+ get_address_msg.nlhdr.nlmsg_seq = ifa_request_sequence;
if (address_.is_v4()) {
get_address_msg.addrmsg.ifa_family = AF_INET;
} else {
@@ -280,7 +309,7 @@ void netlink_connector::send_ifi_request() {
get_link_msg.nlhdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_ROOT;
get_link_msg.nlhdr.nlmsg_type = RTM_GETLINK;
get_link_msg.infomsg.ifi_family = AF_UNSPEC;
- get_link_msg.nlhdr.nlmsg_seq = 2;
+ get_link_msg.nlhdr.nlmsg_seq = ifi_request_sequence;
{
std::lock_guard<std::mutex> its_lock(socket_mutex_);
@@ -307,7 +336,7 @@ void netlink_connector::send_rt_request() {
get_route_msg.nlhdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg));
get_route_msg.nlhdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
get_route_msg.nlhdr.nlmsg_type = RTM_GETROUTE;
- get_route_msg.nlhdr.nlmsg_seq = 3;
+ get_route_msg.nlhdr.nlmsg_seq = rt_request_sequence;
if (multicast_address_.is_v6()) {
get_route_msg.routemsg.rtgen_family = AF_INET6;
} else {