From 461cf0c571022ff1e56e467100bd98c30ca53c1b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 11 Dec 2015 18:20:54 +0100 Subject: [PATCH] platform: factor out completing and sending netlink message --- src/platform/nm-linux-platform.c | 70 ++++++++++++++------------------ 1 file changed, 31 insertions(+), 39 deletions(-) diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index ba05cfbce3..2cfbc61f42 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -2279,23 +2279,6 @@ _nl_sock_flush_data (struct nl_sock *sk) return nle; } -static void -_nl_msg_set_seq (struct nl_sock *sk, struct nl_msg *msg, guint32 *out_seq) -{ - guint32 seq; - - /* choose our own sequence number, because libnl does not ensure that - * it isn't zero -- which would confuse our checking for outstanding - * messages. */ - seq = nl_socket_use_seq (sk); - if (seq == 0) - seq = nl_socket_use_seq (sk); - - nlmsg_hdr (msg)->nlmsg_seq = seq; - if (out_seq) - *out_seq = seq; -} - /******************************************************************/ static int _support_kernel_extended_ifa_flags = -1; @@ -3027,14 +3010,35 @@ cache_update_netlink (NMPlatform *platform, NMPObject *obj, NMPObject **out_obj_ /******************************************************************/ -static void -_new_sequence_number (NMPlatform *platform, guint32 seq) +static int +_nl_send_auto_with_seq (NMPlatform *platform, struct nl_msg *nlmsg) { NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform); + guint32 seq; + int nle; - _LOGt ("_new_sequence_number(): new sequence number %u", seq); + /* complete the message, by choosing our own sequence number, because libnl + * does not ensure that it isn't zero -- which would confuse our checking for + * outstanding messages. */ + seq = nl_socket_use_seq (priv->nlh_event); + if (seq == 0) + seq = nl_socket_use_seq (priv->nlh_event); - priv->nlh_seq_expect = seq; + nlmsg_hdr (nlmsg)->nlmsg_seq = seq; + + nle = nl_send_auto (priv->nlh_event, nlmsg); + + if (nle >= 0) { + _LOGt ("sequence-number: new %u%s", + seq, + priv->nlh_seq_expect + ? nm_sprintf_bufa (100, " (replaces %u)", priv->nlh_seq_expect) + : ""); + priv->nlh_seq_expect = seq; + } else + _LOGD ("failed sending message: %s (%d)", nl_geterror (nle), nle); + + return nle; } static void @@ -3042,8 +3046,6 @@ do_request_link (NMPlatform *platform, int ifindex, const char *name, gboolean h { NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform); nm_auto_nlmsg struct nl_msg *nlmsg = NULL; - int nle; - guint32 seq; if (name && !name[0]) name = NULL; @@ -3065,13 +3067,8 @@ do_request_link (NMPlatform *platform, int ifindex, const char *name, gboolean h name, 0, 0); - if (nlmsg) { - _nl_msg_set_seq (priv->nlh_event, nlmsg, &seq); - - nle = nl_send_auto (priv->nlh_event, nlmsg); - if (nle >= 0) - _new_sequence_number (platform, seq); - } + if (nlmsg) + _nl_send_auto_with_seq (platform, nlmsg); event_handler_read_netlink_all (platform, TRUE); @@ -3091,7 +3088,6 @@ static void do_request_all (NMPlatform *platform, DelayedActionType action_type, gboolean handle_delayed_action) { NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform); - guint32 seq; DelayedActionType iflags; nm_assert (!NM_FLAGS_ANY (action_type, ~DELAYED_ACTION_TYPE_REFRESH_ALL)); @@ -3135,11 +3131,7 @@ do_request_all (NMPlatform *platform, DelayedActionType action_type, gboolean ha if (nle < 0) goto next; - _nl_msg_set_seq (priv->nlh_event, nlmsg, &seq); - - nle = nl_send_auto (priv->nlh_event, nlmsg); - if (nle >= 0) - _new_sequence_number (platform, seq); + _nl_send_auto_with_seq (platform, nlmsg); } next: ; @@ -3167,13 +3159,13 @@ event_seq_check (struct nl_msg *msg, gpointer user_data) priv->nlh_seq_last = hdr->nlmsg_seq; if (priv->nlh_seq_expect == 0) - _LOGt ("event_seq_check(): seq %u received (not waited)", hdr->nlmsg_seq); + _LOGt ("sequence-number: seq %u received (not waited)", hdr->nlmsg_seq); else if (hdr->nlmsg_seq == priv->nlh_seq_expect) { - _LOGt ("event_seq_check(): seq %u received", hdr->nlmsg_seq); + _LOGt ("sequence-number: seq %u received", hdr->nlmsg_seq); priv->nlh_seq_expect = 0; } else - _LOGt ("event_seq_check(): seq %u received (wait for %u)", hdr->nlmsg_seq, priv->nlh_seq_last); + _LOGt ("sequence-number: seq %u received (wait for %u)", hdr->nlmsg_seq, priv->nlh_seq_last); return NL_OK; }