summary refs log tree commit diff
path: root/src/libnm-platform/nm-platform.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libnm-platform/nm-platform.c')
-rw-r--r--src/libnm-platform/nm-platform.c121
1 files changed, 119 insertions, 2 deletions
diff --git a/src/libnm-platform/nm-platform.c b/src/libnm-platform/nm-platform.c
index dc643ed2..1c495d60 100644
--- a/src/libnm-platform/nm-platform.c
+++ b/src/libnm-platform/nm-platform.c
@@ -62,6 +62,41 @@ G_STATIC_ASSERT(sizeof(((NMPlatformLink *) NULL)->l_perm_address.data) == _NM_UT
 G_STATIC_ASSERT(sizeof(((NMPlatformLink *) NULL)->l_broadcast.data) == _NM_UTILS_HWADDR_LEN_MAX);
 
 static const char *
+_nmp_link_port_data_to_string(NMPortKind                    port_kind,
+                              const NMPlatformLinkPortData *port_data,
+                              char                         *sbuf,
+                              gsize                         sbuf_len)
+{
+    const char *sbuf0 = sbuf;
+    char        s0[120];
+
+    nm_assert(port_data);
+
+    switch (port_kind) {
+    case NM_PORT_KIND_NONE:
+        nm_strbuf_append_c(&sbuf, &sbuf_len, '\0');
+        goto out;
+    case NM_PORT_KIND_BOND:
+        nm_strbuf_append(&sbuf,
+                         &sbuf_len,
+                         "port bond queue-id %u%s",
+                         port_data->bond.queue_id,
+                         port_data->bond.prio_has || port_data->bond.prio != 0
+                             ? nm_sprintf_buf(s0,
+                                              " prio%s %u",
+                                              port_data->bond.prio_has ? "" : "?",
+                                              port_data->bond.prio)
+                             : "");
+        goto out;
+    }
+
+    nm_strbuf_append(&sbuf, &sbuf_len, "invalid-port-type %d", (int) port_kind);
+
+out:
+    return sbuf0;
+}
+
+static const char *
 _nmp_link_address_to_string(const NMPLinkAddress *addr,
                             char                  buf[static(_NM_UTILS_HWADDR_LEN_MAX * 3)])
 {
@@ -1406,7 +1441,10 @@ nm_platform_link_add(NMPlatform            *self,
 }
 
 int
-nm_platform_link_change(NMPlatform *self, NMLinkType type, int ifindex, gconstpointer extra_data)
+nm_platform_link_change_extra(NMPlatform   *self,
+                              NMLinkType    type,
+                              int           ifindex,
+                              gconstpointer extra_data)
 {
     char        buf[512];
     const char *name = nm_platform_link_get_name(self, ifindex);
@@ -1447,7 +1485,7 @@ nm_platform_link_change(NMPlatform *self, NMLinkType type, int ifindex, gconstpo
                buf;
            }));
 
-    return klass->link_change(self, type, ifindex, extra_data);
+    return klass->link_change_extra(self, type, ifindex, extra_data);
 }
 
 /**
@@ -2107,6 +2145,43 @@ nm_platform_link_set_name(NMPlatform *self, int ifindex, const char *name)
     return klass->link_set_name(self, ifindex, name);
 }
 
+gboolean
+nm_platform_link_change(NMPlatform *self, int ifindex, NMPlatformLinkBondPort *bond_port)
+{
+    char sbuf_prio[100];
+
+    _CHECK_SELF(self, klass, FALSE);
+
+    g_return_val_if_fail(ifindex >= 0, FALSE);
+
+    if (_LOGD_ENABLED()) {
+        nm_auto_free_gstring GString *str = g_string_new("");
+
+        if (bond_port) {
+            nm_assert(bond_port->prio_has || bond_port->prio == 0);
+            g_string_append_printf(str,
+                                   "bond-port queue-id %d %s",
+                                   bond_port->queue_id,
+                                   bond_port->prio_has || bond_port->prio != 0
+                                       ? nm_sprintf_buf(sbuf_prio,
+                                                        "prio%s %" G_GINT32_FORMAT,
+                                                        !bond_port->prio_has ? "?" : "",
+                                                        bond_port->prio)
+                                       : "");
+        }
+
+        if (str->len > 0 && str->str[str->len - 1] == ' ')
+            g_string_truncate(str, str->len - 1);
+
+        _LOG3D("link: change: %s", str->str);
+    }
+
+    return klass->link_change(self,
+                              ifindex,
+                              bond_port ? NM_PORT_KIND_BOND : NM_PORT_KIND_NONE,
+                              (const NMPlatformLinkPortData *) bond_port);
+}
+
 /**
  * nm_platform_link_get_physical_port_id:
  * @self: platform instance
@@ -5893,6 +5968,7 @@ nm_platform_link_to_string(const NMPlatformLink *link, char *buf, gsize len)
     char       *s;
     gsize       l;
     char        str_addrmode[30];
+    char        str_port_data[200];
     char        str_address[_NM_UTILS_HWADDR_LEN_MAX * 3];
     char        str_perm_address[_NM_UTILS_HWADDR_LEN_MAX * 3];
     char        str_broadcast[_NM_UTILS_HWADDR_LEN_MAX * 3];
@@ -5936,6 +6012,11 @@ nm_platform_link_to_string(const NMPlatformLink *link, char *buf, gsize len)
     _nmp_link_address_to_string(&link->l_perm_address, str_perm_address);
     _nmp_link_address_to_string(&link->l_broadcast, str_broadcast);
 
+    _nmp_link_port_data_to_string(link->port_kind,
+                                  &link->port_data,
+                                  str_port_data,
+                                  sizeof(str_port_data));
+
     str_link_type = nm_link_type_to_string(link->type);
 
     g_snprintf(
@@ -5957,6 +6038,7 @@ nm_platform_link_to_string(const NMPlatformLink *link, char *buf, gsize len)
         "%s%s"    /* l_broadcast */
         "%s%s"    /* inet6_token */
         "%s%s"    /* driver */
+        "%s%s"    /* port_data */
         " rx:%" G_GUINT64_FORMAT ",%" G_GUINT64_FORMAT " tx:%" G_GUINT64_FORMAT
         ",%" G_GUINT64_FORMAT,
         link->ifindex,
@@ -5989,6 +6071,7 @@ nm_platform_link_to_string(const NMPlatformLink *link, char *buf, gsize len)
             : "",
         link->driver ? " driver " : "",
         link->driver ?: "",
+        NM_PRINT_FMT_QUOTED2(str_port_data[0] != '\0', " ", str_port_data, ""),
         link->rx_packets,
         link->rx_bytes,
         link->tx_packets,
@@ -7821,6 +7904,7 @@ nm_platform_link_hash_update(const NMPlatformLink *obj, NMHashState *h)
                         obj->arptype,
                         obj->inet6_addr_gen_mode_inv,
                         obj->inet6_token,
+                        obj->port_kind,
                         obj->rx_packets,
                         obj->rx_bytes,
                         obj->tx_packets,
@@ -7839,6 +7923,20 @@ nm_platform_link_hash_update(const NMPlatformLink *obj, NMHashState *h)
     nm_hash_update_mem(h,
                        obj->l_broadcast.data,
                        NM_MIN(obj->l_broadcast.len, sizeof(obj->l_broadcast.data)));
+
+    switch (obj->port_kind) {
+    case NM_PORT_KIND_NONE:
+        break;
+    case NM_PORT_KIND_BOND:
+        nm_platform_link_bond_port_hash_update(&obj->port_data.bond, h);
+        break;
+    }
+}
+
+void
+nm_platform_link_bond_port_hash_update(const NMPlatformLinkBondPort *obj, NMHashState *h)
+{
+    nm_hash_update_vals(h, obj->prio, obj->queue_id, NM_HASH_COMBINE_BOOLS(guint8, obj->prio_has));
 }
 
 int
@@ -7868,6 +7966,14 @@ nm_platform_link_cmp(const NMPlatformLink *a, const NMPlatformLink *b)
     if (a->l_broadcast.len)
         NM_CMP_FIELD_MEMCMP_LEN(a, b, l_broadcast.data, a->l_broadcast.len);
     NM_CMP_FIELD_MEMCMP(a, b, inet6_token);
+    NM_CMP_FIELD(a, b, port_kind);
+    switch (a->port_kind) {
+    case NM_PORT_KIND_NONE:
+        break;
+    case NM_PORT_KIND_BOND:
+        NM_CMP_RETURN(nm_platform_link_bond_port_cmp(&a->port_data.bond, &b->port_data.bond));
+        break;
+    }
     NM_CMP_FIELD(a, b, rx_packets);
     NM_CMP_FIELD(a, b, rx_bytes);
     NM_CMP_FIELD(a, b, tx_packets);
@@ -7948,6 +8054,17 @@ nm_platform_lnk_bond_hash_update(const NMPlatformLnkBond *obj, NMHashState *h)
 }
 
 int
+nm_platform_link_bond_port_cmp(const NMPlatformLinkBondPort *a, const NMPlatformLinkBondPort *b)
+{
+    NM_CMP_SELF(a, b);
+    NM_CMP_FIELD(a, b, queue_id);
+    NM_CMP_FIELD(a, b, prio);
+    NM_CMP_FIELD_BOOL(a, b, prio_has);
+
+    return 0;
+}
+
+int
 nm_platform_lnk_bond_cmp(const NMPlatformLnkBond *a, const NMPlatformLnkBond *b)
 {
     NM_CMP_SELF(a, b);