platform: add support for queueing disciplines
This commit is contained in:
@@ -250,27 +250,30 @@ enum {
|
||||
DELAYED_ACTION_IDX_REFRESH_ALL_IP6_ADDRESSES,
|
||||
DELAYED_ACTION_IDX_REFRESH_ALL_IP4_ROUTES,
|
||||
DELAYED_ACTION_IDX_REFRESH_ALL_IP6_ROUTES,
|
||||
DELAYED_ACTION_IDX_REFRESH_ALL_QDISCS,
|
||||
_DELAYED_ACTION_IDX_REFRESH_ALL_NUM,
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
DELAYED_ACTION_TYPE_NONE = 0,
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_LINKS = (1LL << DELAYED_ACTION_IDX_REFRESH_ALL_LINKS),
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ADDRESSES = (1LL << DELAYED_ACTION_IDX_REFRESH_ALL_IP4_ADDRESSES),
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES = (1LL << DELAYED_ACTION_IDX_REFRESH_ALL_IP6_ADDRESSES),
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES = (1LL << DELAYED_ACTION_IDX_REFRESH_ALL_IP4_ROUTES),
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES = (1LL << DELAYED_ACTION_IDX_REFRESH_ALL_IP6_ROUTES),
|
||||
DELAYED_ACTION_TYPE_REFRESH_LINK = (1LL << 5),
|
||||
DELAYED_ACTION_TYPE_MASTER_CONNECTED = (1LL << 6),
|
||||
DELAYED_ACTION_TYPE_READ_NETLINK = (1LL << 7),
|
||||
DELAYED_ACTION_TYPE_WAIT_FOR_NL_RESPONSE = (1LL << 8),
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_LINKS = (1LL << /* 0 */ DELAYED_ACTION_IDX_REFRESH_ALL_LINKS),
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ADDRESSES = (1LL << /* 1 */ DELAYED_ACTION_IDX_REFRESH_ALL_IP4_ADDRESSES),
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES = (1LL << /* 2 */ DELAYED_ACTION_IDX_REFRESH_ALL_IP6_ADDRESSES),
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES = (1LL << /* 3 */ DELAYED_ACTION_IDX_REFRESH_ALL_IP4_ROUTES),
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES = (1LL << /* 4 */ DELAYED_ACTION_IDX_REFRESH_ALL_IP6_ROUTES),
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_QDISCS = (1LL << /* 5 */ DELAYED_ACTION_IDX_REFRESH_ALL_QDISCS),
|
||||
DELAYED_ACTION_TYPE_REFRESH_LINK = (1LL << 6),
|
||||
DELAYED_ACTION_TYPE_MASTER_CONNECTED = (1LL << 10),
|
||||
DELAYED_ACTION_TYPE_READ_NETLINK = (1LL << 11),
|
||||
DELAYED_ACTION_TYPE_WAIT_FOR_NL_RESPONSE = (1LL << 12),
|
||||
__DELAYED_ACTION_TYPE_MAX,
|
||||
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL = DELAYED_ACTION_TYPE_REFRESH_ALL_LINKS |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ADDRESSES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES,
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_QDISCS,
|
||||
|
||||
DELAYED_ACTION_TYPE_MAX = __DELAYED_ACTION_TYPE_MAX -1,
|
||||
} DelayedActionType;
|
||||
@@ -970,6 +973,8 @@ _nl_nlmsghdr_to_str (const struct nlmsghdr *hdr, char *buf, gsize len)
|
||||
case RTM_DELADDR: s = "RTM_DELADDR"; break;
|
||||
case RTM_NEWROUTE: s = "RTM_NEWROUTE"; break;
|
||||
case RTM_DELROUTE: s = "RTM_DELROUTE"; break;
|
||||
case RTM_NEWQDISC: s = "RTM_NEWQDISC"; break;
|
||||
case RTM_DELQDISC: s = "RTM_DELQDISC"; break;
|
||||
case NLMSG_NOOP: s = "NLMSG_NOOP"; break;
|
||||
case NLMSG_ERROR: s = "NLMSG_ERROR"; break;
|
||||
case NLMSG_DONE: s = "NLMSG_DONE"; break;
|
||||
@@ -1016,6 +1021,7 @@ _nl_nlmsghdr_to_str (const struct nlmsghdr *hdr, char *buf, gsize len)
|
||||
case RTM_NEWLINK:
|
||||
case RTM_NEWADDR:
|
||||
case RTM_NEWROUTE:
|
||||
case RTM_NEWQDISC:
|
||||
_F (NLM_F_REPLACE, "replace");
|
||||
_F (NLM_F_EXCL, "excl");
|
||||
_F (NLM_F_CREATE, "create");
|
||||
@@ -1024,6 +1030,7 @@ _nl_nlmsghdr_to_str (const struct nlmsghdr *hdr, char *buf, gsize len)
|
||||
case RTM_GETLINK:
|
||||
case RTM_GETADDR:
|
||||
case RTM_GETROUTE:
|
||||
case RTM_DELQDISC:
|
||||
_F (NLM_F_DUMP, "dump");
|
||||
_F (NLM_F_ROOT, "root");
|
||||
_F (NLM_F_MATCH, "match");
|
||||
@@ -2327,6 +2334,40 @@ errout:
|
||||
return obj_result;
|
||||
}
|
||||
|
||||
static NMPObject *
|
||||
_new_from_nl_qdisc (struct nlmsghdr *nlh, gboolean id_only)
|
||||
{
|
||||
NMPObject *obj = NULL;
|
||||
const struct tcmsg *tcm;
|
||||
struct nlattr *tb[TCA_MAX + 1];
|
||||
int err;
|
||||
static const struct nla_policy policy[TCA_MAX + 1] = {
|
||||
[TCA_KIND] = { .type = NLA_STRING },
|
||||
};
|
||||
|
||||
if (!nlmsg_valid_hdr (nlh, sizeof (*tcm)))
|
||||
return NULL;
|
||||
tcm = nlmsg_data (nlh);
|
||||
|
||||
err = nlmsg_parse (nlh, sizeof (*tcm), tb, TCA_MAX, policy);
|
||||
if (err < 0)
|
||||
return NULL;
|
||||
|
||||
if (!tb[TCA_KIND])
|
||||
return NULL;
|
||||
|
||||
obj = nmp_object_new (NMP_OBJECT_TYPE_QDISC, NULL);
|
||||
|
||||
obj->qdisc.kind = g_intern_string (nla_get_string (tb[TCA_KIND]));
|
||||
obj->qdisc.ifindex = tcm->tcm_ifindex;
|
||||
obj->qdisc.addr_family = tcm->tcm_family;
|
||||
obj->qdisc.handle = tcm->tcm_handle;
|
||||
obj->qdisc.parent = tcm->tcm_parent;
|
||||
obj->qdisc.info = tcm->tcm_info;
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* nmp_object_new_from_nl:
|
||||
* @platform: (allow-none): for creating certain objects, the constructor wants to check
|
||||
@@ -2363,6 +2404,10 @@ nmp_object_new_from_nl (NMPlatform *platform, const NMPCache *cache, struct nl_m
|
||||
case RTM_DELROUTE:
|
||||
case RTM_GETROUTE:
|
||||
return _new_from_nl_route (msghdr, id_only);
|
||||
case RTM_NEWQDISC:
|
||||
case RTM_DELQDISC:
|
||||
case RTM_GETQDISC:
|
||||
return _new_from_nl_qdisc (msghdr, id_only);
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
@@ -2816,6 +2861,35 @@ nla_put_failure:
|
||||
g_return_val_if_reached (NULL);
|
||||
}
|
||||
|
||||
static struct nl_msg *
|
||||
_nl_msg_new_qdisc (int nlmsg_type,
|
||||
int nlmsg_flags,
|
||||
const NMPlatformQdisc *qdisc)
|
||||
{
|
||||
struct nl_msg *msg;
|
||||
struct tcmsg tcm = {
|
||||
.tcm_family = qdisc->addr_family,
|
||||
.tcm_ifindex = qdisc->ifindex,
|
||||
.tcm_handle = qdisc->handle,
|
||||
.tcm_parent = qdisc->parent,
|
||||
.tcm_info = qdisc->info,
|
||||
};
|
||||
|
||||
msg = nlmsg_alloc_simple (nlmsg_type, nlmsg_flags);
|
||||
if (!msg)
|
||||
return NULL;
|
||||
|
||||
if (nlmsg_append (msg, &tcm, sizeof (tcm), NLMSG_ALIGNTO) < 0)
|
||||
goto nla_put_failure;
|
||||
|
||||
NLA_PUT_STRING (msg, TCA_KIND, qdisc->kind);
|
||||
|
||||
return msg;
|
||||
nla_put_failure:
|
||||
nlmsg_free (msg);
|
||||
g_return_val_if_reached (NULL);
|
||||
}
|
||||
|
||||
/******************************************************************
|
||||
* NMPlatform types and functions
|
||||
******************************************************************/
|
||||
@@ -3217,6 +3291,7 @@ _NM_UTILS_LOOKUP_DEFINE (static, delayed_action_refresh_from_object_type, NMPObj
|
||||
NM_UTILS_LOOKUP_ITEM (NMP_OBJECT_TYPE_IP6_ADDRESS, DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES),
|
||||
NM_UTILS_LOOKUP_ITEM (NMP_OBJECT_TYPE_IP4_ROUTE, DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES),
|
||||
NM_UTILS_LOOKUP_ITEM (NMP_OBJECT_TYPE_IP6_ROUTE, DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES),
|
||||
NM_UTILS_LOOKUP_ITEM (NMP_OBJECT_TYPE_QDISC, DELAYED_ACTION_TYPE_REFRESH_ALL_QDISCS),
|
||||
NM_UTILS_LOOKUP_ITEM_IGNORE_OTHER (),
|
||||
);
|
||||
|
||||
@@ -3227,6 +3302,7 @@ _NM_UTILS_LOOKUP_DEFINE (static, delayed_action_refresh_to_object_type, DelayedA
|
||||
NM_UTILS_LOOKUP_ITEM (DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES, NMP_OBJECT_TYPE_IP6_ADDRESS),
|
||||
NM_UTILS_LOOKUP_ITEM (DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES, NMP_OBJECT_TYPE_IP4_ROUTE),
|
||||
NM_UTILS_LOOKUP_ITEM (DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES, NMP_OBJECT_TYPE_IP6_ROUTE),
|
||||
NM_UTILS_LOOKUP_ITEM (DELAYED_ACTION_TYPE_REFRESH_ALL_QDISCS, NMP_OBJECT_TYPE_QDISC),
|
||||
NM_UTILS_LOOKUP_ITEM_IGNORE_OTHER (),
|
||||
);
|
||||
|
||||
@@ -3237,6 +3313,7 @@ _NM_UTILS_LOOKUP_DEFINE (static, delayed_action_refresh_all_to_idx, DelayedActio
|
||||
NM_UTILS_LOOKUP_ITEM (DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES, DELAYED_ACTION_IDX_REFRESH_ALL_IP6_ADDRESSES),
|
||||
NM_UTILS_LOOKUP_ITEM (DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES, DELAYED_ACTION_IDX_REFRESH_ALL_IP4_ROUTES),
|
||||
NM_UTILS_LOOKUP_ITEM (DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES, DELAYED_ACTION_IDX_REFRESH_ALL_IP6_ROUTES),
|
||||
NM_UTILS_LOOKUP_ITEM (DELAYED_ACTION_TYPE_REFRESH_ALL_QDISCS, DELAYED_ACTION_IDX_REFRESH_ALL_QDISCS),
|
||||
NM_UTILS_LOOKUP_ITEM_IGNORE_OTHER (),
|
||||
);
|
||||
|
||||
@@ -3247,6 +3324,7 @@ NM_UTILS_LOOKUP_STR_DEFINE_STATIC (delayed_action_to_string, DelayedActionType,
|
||||
NM_UTILS_LOOKUP_STR_ITEM (DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES, "refresh-all-ip6-addresses"),
|
||||
NM_UTILS_LOOKUP_STR_ITEM (DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES, "refresh-all-ip4-routes"),
|
||||
NM_UTILS_LOOKUP_STR_ITEM (DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES, "refresh-all-ip6-routes"),
|
||||
NM_UTILS_LOOKUP_STR_ITEM (DELAYED_ACTION_TYPE_REFRESH_ALL_QDISCS, "refresh-all-qdiscs"),
|
||||
NM_UTILS_LOOKUP_STR_ITEM (DELAYED_ACTION_TYPE_REFRESH_LINK, "refresh-link"),
|
||||
NM_UTILS_LOOKUP_STR_ITEM (DELAYED_ACTION_TYPE_MASTER_CONNECTED, "master-connected"),
|
||||
NM_UTILS_LOOKUP_STR_ITEM (DELAYED_ACTION_TYPE_READ_NETLINK, "read-netlink"),
|
||||
@@ -3684,7 +3762,7 @@ cache_on_change (NMPlatform *platform,
|
||||
{
|
||||
int ifindex = 0;
|
||||
|
||||
/* if we remove a link (from netlink), we must refresh the addresses and routes */
|
||||
/* if we remove a link (from netlink), we must refresh the addresses, routes and qdiscs */
|
||||
if ( cache_op == NMP_CACHE_OPS_REMOVED
|
||||
&& obj_old /* <-- nonsensical, make coverity happy */)
|
||||
ifindex = obj_old->link.ifindex;
|
||||
@@ -3699,7 +3777,8 @@ cache_on_change (NMPlatform *platform,
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ADDRESSES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES,
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_QDISCS,
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
@@ -4022,9 +4101,6 @@ do_request_all_no_delayed_actions (NMPlatform *platform, DelayedActionType actio
|
||||
NMPObjectType obj_type = delayed_action_refresh_to_object_type (iflags);
|
||||
const NMPClass *klass = nmp_class_from_type (obj_type);
|
||||
nm_auto_nlmsg struct nl_msg *nlmsg = NULL;
|
||||
struct rtgenmsg gmsg = {
|
||||
.rtgen_family = klass->addr_family,
|
||||
};
|
||||
int nle;
|
||||
gint *out_refresh_all_in_progess;
|
||||
|
||||
@@ -4051,7 +4127,17 @@ do_request_all_no_delayed_actions (NMPlatform *platform, DelayedActionType actio
|
||||
if (!nlmsg)
|
||||
continue;
|
||||
|
||||
nle = nlmsg_append (nlmsg, &gmsg, sizeof (gmsg), NLMSG_ALIGNTO);
|
||||
if (klass->obj_type == NMP_OBJECT_TYPE_QDISC) {
|
||||
struct tcmsg tcmsg = {
|
||||
.tcm_family = AF_UNSPEC,
|
||||
};
|
||||
nle = nlmsg_append (nlmsg, &tcmsg, sizeof (tcmsg), NLMSG_ALIGNTO);
|
||||
} else {
|
||||
struct rtgenmsg gmsg = {
|
||||
.rtgen_family = klass->addr_family,
|
||||
};
|
||||
nle = nlmsg_append (nlmsg, &gmsg, sizeof (gmsg), NLMSG_ALIGNTO);
|
||||
}
|
||||
if (nle < 0)
|
||||
continue;
|
||||
|
||||
@@ -4173,6 +4259,7 @@ event_valid_msg (NMPlatform *platform, struct nl_msg *msg, gboolean handle_event
|
||||
case RTM_NEWADDR:
|
||||
case RTM_NEWLINK:
|
||||
case RTM_NEWROUTE:
|
||||
case RTM_NEWQDISC:
|
||||
is_dump = delayed_action_refresh_all_in_progress (platform,
|
||||
delayed_action_refresh_from_object_type (NMP_OBJECT_GET_TYPE (obj)));
|
||||
break;
|
||||
@@ -4196,6 +4283,7 @@ event_valid_msg (NMPlatform *platform, struct nl_msg *msg, gboolean handle_event
|
||||
case RTM_NEWLINK:
|
||||
case RTM_NEWADDR:
|
||||
case RTM_GETLINK:
|
||||
case RTM_NEWQDISC:
|
||||
cache_op = nmp_cache_update_netlink (cache, obj, is_dump, &obj_old, &obj_new);
|
||||
if (cache_op != NMP_CACHE_OPS_UNCHANGED) {
|
||||
cache_on_change (platform, cache_op, obj_old, obj_new);
|
||||
@@ -4289,13 +4377,13 @@ event_valid_msg (NMPlatform *platform, struct nl_msg *msg, gboolean handle_event
|
||||
case RTM_DELLINK:
|
||||
case RTM_DELADDR:
|
||||
case RTM_DELROUTE:
|
||||
case RTM_DELQDISC:
|
||||
cache_op = nmp_cache_remove_netlink (cache, obj, &obj_old, &obj_new);
|
||||
if (cache_op != NMP_CACHE_OPS_UNCHANGED) {
|
||||
cache_on_change (platform, cache_op, obj_old, obj_new);
|
||||
nm_platform_cache_update_emit_signal (platform, cache_op, obj_old, obj_new);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -6153,6 +6241,9 @@ object_delete (NMPlatform *platform,
|
||||
case NMP_OBJECT_TYPE_IP6_ROUTE:
|
||||
nlmsg = _nl_msg_new_route (RTM_DELROUTE, 0, obj);
|
||||
break;
|
||||
case NMP_OBJECT_TYPE_QDISC:
|
||||
nlmsg = _nl_msg_new_qdisc (RTM_DELQDISC, 0, NMP_OBJECT_CAST_QDISC (obj));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -6243,6 +6334,45 @@ ip_route_get (NMPlatform *platform,
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static NMPlatformError
|
||||
qdisc_add (NMPlatform *platform,
|
||||
NMPNlmFlags flags,
|
||||
const NMPlatformQdisc *qdisc)
|
||||
{
|
||||
WaitForNlResponseResult seq_result = WAIT_FOR_NL_RESPONSE_RESULT_UNKNOWN;
|
||||
int nle;
|
||||
char s_buf[256];
|
||||
nm_auto_nlmsg struct nl_msg *msg = NULL;
|
||||
|
||||
msg = _nl_msg_new_qdisc (RTM_NEWQDISC, flags, qdisc);
|
||||
|
||||
event_handler_read_netlink (platform, FALSE);
|
||||
|
||||
nle = _nl_send_nlmsg (platform, msg, &seq_result, DELAYED_ACTION_RESPONSE_TYPE_VOID, NULL);
|
||||
if (nle < 0) {
|
||||
_LOGE ("do-add-qdisc: failed sending netlink request \"%s\" (%d)",
|
||||
nl_geterror (nle), -nle);
|
||||
return NM_PLATFORM_ERROR_NETLINK;
|
||||
}
|
||||
|
||||
delayed_action_handle_all (platform, FALSE);
|
||||
|
||||
nm_assert (seq_result);
|
||||
|
||||
_NMLOG (seq_result == WAIT_FOR_NL_RESPONSE_RESULT_RESPONSE_OK
|
||||
? LOGL_DEBUG
|
||||
: LOGL_WARN,
|
||||
"do-add-qdisc: %s",
|
||||
wait_for_nl_response_to_string (seq_result, s_buf, sizeof (s_buf)));
|
||||
|
||||
if (seq_result == WAIT_FOR_NL_RESPONSE_RESULT_RESPONSE_OK)
|
||||
return NM_PLATFORM_ERROR_SUCCESS;
|
||||
|
||||
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#define EVENT_CONDITIONS ((GIOCondition) (G_IO_IN | G_IO_PRI))
|
||||
#define ERROR_CONDITIONS ((GIOCondition) (G_IO_ERR | G_IO_NVAL))
|
||||
#define DISCONNECT_CONDITIONS ((GIOCondition) (G_IO_HUP))
|
||||
@@ -6524,7 +6654,8 @@ event_handler_read_netlink (NMPlatform *platform, gboolean wait_for_acks)
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ADDRESSES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES,
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_QDISCS,
|
||||
NULL);
|
||||
break;
|
||||
default:
|
||||
@@ -6784,6 +6915,7 @@ constructed (GObject *_object)
|
||||
RTNLGRP_LINK,
|
||||
RTNLGRP_IPV4_IFADDR, RTNLGRP_IPV6_IFADDR,
|
||||
RTNLGRP_IPV4_ROUTE, RTNLGRP_IPV6_ROUTE,
|
||||
RTNLGRP_TC,
|
||||
0);
|
||||
g_assert (!nle);
|
||||
_LOGD ("Netlink socket for events established: port=%u, fd=%d", nl_socket_get_local_port (priv->nlh), nl_socket_get_fd (priv->nlh));
|
||||
@@ -6808,7 +6940,8 @@ constructed (GObject *_object)
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ADDRESSES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES,
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES |
|
||||
DELAYED_ACTION_TYPE_REFRESH_ALL_QDISCS,
|
||||
NULL);
|
||||
|
||||
delayed_action_handle_all (platform, FALSE);
|
||||
@@ -6974,6 +7107,8 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass)
|
||||
platform_class->ip_route_add = ip_route_add;
|
||||
platform_class->ip_route_get = ip_route_get;
|
||||
|
||||
platform_class->qdisc_add = qdisc_add;
|
||||
|
||||
platform_class->check_kernel_support = check_kernel_support;
|
||||
|
||||
platform_class->process_events = process_events;
|
||||
|
Reference in New Issue
Block a user