summaryrefslogtreecommitdiff
path: root/src/platform/nmp-object.c
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-02-14 13:08:12 +0100
committerThomas Haller <thaller@redhat.com>2019-03-04 14:28:19 +0100
commitf2deacc7aa13e8730c94471a973a0468af3daa11 (patch)
treed2733aa273c83c4ee714d691aadb0687aea00bd3 /src/platform/nmp-object.c
parent169eb23299595fdb96445c8661ba4d6123298dbc (diff)
downloadNetworkManager-th/routing-rule.tar.gz
platform: add support for routing-ruleth/routing-rule
https://bugzilla.redhat.com/show_bug.cgi?id=1652653
Diffstat (limited to 'src/platform/nmp-object.c')
-rw-r--r--src/platform/nmp-object.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/platform/nmp-object.c b/src/platform/nmp-object.c
index 0b5a0dbd80..91195b65eb 100644
--- a/src/platform/nmp-object.c
+++ b/src/platform/nmp-object.c
@@ -427,6 +427,25 @@ _idx_obj_part (const DedupMultiIdxType *idx_type,
}
return 1;
+ case NMP_CACHE_ID_TYPE_OBJECT_BY_ADDR_FAMILY:
+ obj_type = NMP_OBJECT_GET_TYPE (obj_a);
+ /* currently, only routing rules are supported for this cache-id-type. */
+ if ( obj_type != NMP_OBJECT_TYPE_ROUTING_RULE
+ || !NM_IN_SET (obj_a->routing_rule.addr_family, AF_INET, AF_INET6)) {
+ if (h)
+ nm_hash_update_val (h, obj_a);
+ return 0;
+ }
+ if (obj_b) {
+ return NMP_OBJECT_GET_TYPE (obj_b) == NMP_OBJECT_TYPE_ROUTING_RULE
+ && obj_a->routing_rule.addr_family == obj_b->routing_rule.addr_family;
+ }
+ if (h) {
+ nm_hash_update_vals (h, idx_type->cache_id_type,
+ obj_a->routing_rule.addr_family);
+ }
+ return 1;
+
case NMP_CACHE_ID_TYPE_NONE:
case __NMP_CACHE_ID_TYPE_MAX:
break;
@@ -1359,6 +1378,10 @@ _vt_cmd_plobj_id_copy (ip6_route, NMPlatformIP6Route, {
*dst = *src;
nm_assert (nm_platform_ip6_route_cmp (dst, src, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) == 0);
});
+_vt_cmd_plobj_id_copy (routing_rule, NMPlatformRoutingRule, {
+ *dst = *src;
+ nm_assert (nm_platform_routing_rule_cmp (dst, src, NM_PLATFORM_ROUTING_RULE_CMP_TYPE_ID) == 0);
+});
/* Uses internally nmp_object_copy(), hence it also violates the const
* promise for @obj.
@@ -1459,6 +1482,12 @@ _vt_cmd_plobj_id_cmp_ip6_route (const NMPlatformObject *obj1, const NMPlatformOb
return nm_platform_ip6_route_cmp ((NMPlatformIP6Route *) obj1, (NMPlatformIP6Route *) obj2, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID);
}
+static int
+_vt_cmd_plobj_id_cmp_routing_rule (const NMPlatformObject *obj1, const NMPlatformObject *obj2)
+{
+ return nm_platform_routing_rule_cmp ((NMPlatformRoutingRule *) obj1, (NMPlatformRoutingRule *) obj2, NM_PLATFORM_ROUTING_RULE_CMP_TYPE_ID);
+}
+
void
nmp_object_id_hash_update (const NMPObject *obj, NMHashState *h)
{
@@ -1524,6 +1553,9 @@ _vt_cmd_plobj_id_hash_update (ip4_route, NMPlatformIP4Route, {
_vt_cmd_plobj_id_hash_update (ip6_route, NMPlatformIP6Route, {
nm_platform_ip6_route_hash_update (obj, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID, h);
})
+_vt_cmd_plobj_id_hash_update (routing_rule, NMPlatformRoutingRule, {
+ nm_platform_routing_rule_hash_update (obj, NM_PLATFORM_ROUTING_RULE_CMP_TYPE_ID, h);
+})
_vt_cmd_plobj_id_hash_update (qdisc, NMPlatformQdisc, {
nm_hash_update_vals (h,
obj->ifindex,
@@ -1547,6 +1579,12 @@ _vt_cmd_plobj_hash_update_ip6_route (const NMPlatformObject *obj, NMHashState *h
return nm_platform_ip6_route_hash_update ((const NMPlatformIP6Route *) obj, NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL, h);
}
+static void
+_vt_cmd_plobj_hash_update_routing_rule (const NMPlatformObject *obj, NMHashState *h)
+{
+ return nm_platform_routing_rule_hash_update ((const NMPlatformRoutingRule *) obj, NM_PLATFORM_ROUTING_RULE_CMP_TYPE_FULL, h);
+}
+
gboolean
nmp_object_is_alive (const NMPObject *obj)
{
@@ -1597,6 +1635,12 @@ _vt_cmd_obj_is_alive_ipx_route (const NMPObject *obj)
}
static gboolean
+_vt_cmd_obj_is_alive_routing_rule (const NMPObject *obj)
+{
+ return NM_IN_SET (obj->routing_rule.addr_family, AF_INET, AF_INET6);
+}
+
+static gboolean
_vt_cmd_obj_is_alive_qdisc (const NMPObject *obj)
{
return NMP_OBJECT_CAST_QDISC (obj)->ifindex > 0;
@@ -1663,6 +1707,12 @@ static const guint8 _supported_cache_ids_ipx_route[] = {
0,
};
+static const guint8 _supported_cache_ids_routing_rules[] = {
+ NMP_CACHE_ID_TYPE_OBJECT_TYPE,
+ NMP_CACHE_ID_TYPE_OBJECT_BY_ADDR_FAMILY,
+ 0,
+};
+
/*****************************************************************************/
static void
@@ -1940,6 +1990,7 @@ nmp_lookup_init_obj_type (NMPLookup *lookup,
case NMP_OBJECT_TYPE_IP6_ADDRESS:
case NMP_OBJECT_TYPE_IP4_ROUTE:
case NMP_OBJECT_TYPE_IP6_ROUTE:
+ case NMP_OBJECT_TYPE_ROUTING_RULE:
case NMP_OBJECT_TYPE_QDISC:
case NMP_OBJECT_TYPE_TFILTER:
_nmp_object_stackinit_from_type (&lookup->selector_obj, obj_type);
@@ -2088,6 +2139,23 @@ nmp_lookup_init_ip6_route_by_weak_id (NMPLookup *lookup,
return _L (lookup);
}
+const NMPLookup *
+nmp_lookup_init_object_by_addr_family (NMPLookup *lookup,
+ NMPObjectType obj_type,
+ int addr_family)
+{
+ NMPObject *o;
+
+ nm_assert (lookup);
+ nm_assert_addr_family (addr_family);
+ nm_assert (NM_IN_SET (obj_type, NMP_OBJECT_TYPE_ROUTING_RULE));
+
+ o = _nmp_object_stackinit_from_type (&lookup->selector_obj, obj_type);
+ NMP_OBJECT_CAST_ROUTING_RULE (o)->addr_family = addr_family;
+ lookup->cache_id_type = NMP_CACHE_ID_TYPE_OBJECT_BY_ADDR_FAMILY;
+ return _L (lookup);
+}
+
/*****************************************************************************/
GArray *
@@ -3067,6 +3135,25 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
.cmd_plobj_hash_update = _vt_cmd_plobj_hash_update_ip6_route,
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip6_route_cmp_full,
},
+ [NMP_OBJECT_TYPE_ROUTING_RULE - 1] = {
+ .parent = DEDUP_MULTI_OBJ_CLASS_INIT(),
+ .obj_type = NMP_OBJECT_TYPE_ROUTING_RULE,
+ .sizeof_data = sizeof (NMPObjectRoutingRule),
+ .sizeof_public = sizeof (NMPlatformRoutingRule),
+ .obj_type_name = "routing-rule",
+ .rtm_gettype = RTM_GETRULE,
+ .signal_type_id = NM_PLATFORM_SIGNAL_ID_ROUTING_RULE,
+ .signal_type = NM_PLATFORM_SIGNAL_ROUTING_RULE_CHANGED,
+ .supported_cache_ids = _supported_cache_ids_routing_rules,
+ .cmd_obj_is_alive = _vt_cmd_obj_is_alive_routing_rule,
+ .cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_routing_rule,
+ .cmd_plobj_id_cmp = _vt_cmd_plobj_id_cmp_routing_rule,
+ .cmd_plobj_id_hash_update = _vt_cmd_plobj_id_hash_update_routing_rule,
+ .cmd_plobj_to_string_id = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_routing_rule_to_string,
+ .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_routing_rule_to_string,
+ .cmd_plobj_hash_update = _vt_cmd_plobj_hash_update_routing_rule,
+ .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_routing_rule_cmp_full,
+ },
[NMP_OBJECT_TYPE_QDISC - 1] = {
.parent = DEDUP_MULTI_OBJ_CLASS_INIT(),
.obj_type = NMP_OBJECT_TYPE_QDISC,