diff options
author | lutzbichler <52852266+lutzbichler@users.noreply.github.com> | 2022-03-15 07:10:59 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-15 07:10:59 +0100 |
commit | 01faa10d1c64254f394857cf9fb9a1e90d2a442e (patch) | |
tree | 5c1f0d418b75d5f20fd09f57be5930201a45c390 | |
parent | 790e0cfc2d1f8105caf5ebb2edeede6b1cb7cac9 (diff) | |
parent | a268e2d68d30ea9b09834dbaca60530b4314774c (diff) | |
download | vSomeIP-01faa10d1c64254f394857cf9fb9a1e90d2a442e.tar.gz |
Merge pull request #283 from phiwer/dev/retry_netlink
Retry failed netlink operations
-rw-r--r-- | implementation/endpoints/src/netlink_connector.cpp | 37 |
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 { |