Skip to content

Commit a63c90c

Browse files
committed
Merge pull request #207 from mtomaschewski/nanny
Nanny fixes and a device mach with identify capabilities
2 parents 058f194 + 1b3f254 commit a63c90c

File tree

5 files changed

+145
-32
lines changed

5 files changed

+145
-32
lines changed

include/wicked/fsm.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,9 @@ extern inline ni_bool_t ni_ifworker_state_in_range(const ni_uint_range_t *, cons
277277
extern const char * ni_ifworker_state_name(unsigned int state);
278278
extern ni_bool_t ni_ifworker_state_from_name(const char *, unsigned int *);
279279
extern ni_fsm_require_t * ni_ifworker_reachability_check_new(xml_node_t *);
280+
extern ni_bool_t ni_ifworker_match_netdev_name(const ni_ifworker_t *, const char *);
281+
extern ni_bool_t ni_ifworker_match_netdev_alias(const ni_ifworker_t *, const char *);
282+
extern ni_bool_t ni_ifworker_match_netdev_ifindex(const ni_ifworker_t *, unsigned int);
280283
extern ni_bool_t ni_ifworker_match_alias(const ni_ifworker_t *, const char *);
281284
extern void ni_ifworker_set_config(ni_ifworker_t *, xml_node_t *, const char *);
282285
extern ni_bool_t ni_ifworker_check_config(const ni_ifworker_t *, const xml_node_t *, const char *);

nanny/main.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -328,11 +328,12 @@ ni_nanny_netif_state_change_signal_receive(ni_dbus_connection_t *conn, ni_dbus_m
328328
return;
329329
}
330330

331-
ni_debug_nanny("%s: received signal %s; state=%s, policy=%s%s",
331+
ni_debug_nanny("%s: received signal %s; state=%s, policy=%s%s%s",
332332
w->name, signal_name,
333333
ni_managed_state_to_string(mdev->state),
334334
mdev->selected_policy? ni_fsm_policy_name(mdev->selected_policy->fsm_policy): "<none>",
335-
mdev->monitor? ", user controlled" : "");
335+
mdev->allowed? ", user control allowed" : "",
336+
mdev->monitor? ", monitored" : "");
336337

337338
switch (event) {
338339
case NI_EVENT_LINK_DOWN:

nanny/nanny.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -324,15 +324,15 @@ ni_nanny_register_device(ni_nanny_t *mgr, ni_ifworker_t *w)
324324
break;
325325
}
326326

327-
mdev->allowed = TRUE;
327+
mdev->allowed = FALSE;
328328
if (match->auto_enable)
329329
mdev->monitor = TRUE;
330330
}
331331

332332
ni_debug_nanny("new device %s, class %s%s%s", w->name,
333333
mdev->object->class->name,
334334
mdev->allowed? ", user control allowed" : "",
335-
mdev->monitor? ", auto-enabled" : "");
335+
mdev->monitor? ", monitored (auto-enabled)" : "");
336336

337337
if (mdev->monitor)
338338
ni_nanny_schedule_recheck(mgr, w);
@@ -640,7 +640,7 @@ ni_objectmodel_nanny_create_policy(ni_dbus_object_t *object, const ni_dbus_metho
640640

641641
do {
642642
snprintf(namebuf, sizeof(namebuf), "policy%u", counter++);
643-
} while (ni_fsm_policy_by_name(mgr->fsm, namebuf) == NULL);
643+
} while (ni_fsm_policy_by_name(mgr->fsm, namebuf) && counter);
644644
name = namebuf;
645645
}
646646

src/fsm-policy.c

Lines changed: 60 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,37 +1180,71 @@ ni_ifcondition_sharable(xml_node_t *node)
11801180

11811181
/*
11821182
* <device>...</device>
1183+
* <device:name>...</device:name>
1184+
* <device:alias>...</device:alias>
1185+
* <device:ifindex>...</device:ifindex>
11831186
*/
11841187
static ni_bool_t
1185-
__ni_fsm_policy_match_device_check(const ni_ifcondition_t *cond, ni_ifworker_t *w)
1188+
__ni_fsm_policy_match_device_name_check(const ni_ifcondition_t *cond, ni_ifworker_t *w)
11861189
{
1187-
ni_warn("<device> condition not implemented yet");
1188-
return FALSE;
1190+
return ni_ifworker_match_netdev_name(w, cond->args.string);
11891191
}
1190-
1191-
static ni_ifcondition_t *
1192-
ni_ifcondition_device(xml_node_t *node)
1192+
static ni_bool_t
1193+
__ni_fsm_policy_match_device_alias_check(const ni_ifcondition_t *cond, ni_ifworker_t *w)
11931194
{
1194-
ni_ifcondition_t *result;
1195+
return ni_ifworker_match_netdev_alias(w, cond->args.string);
1196+
}
1197+
static ni_bool_t
1198+
__ni_fsm_policy_match_device_ifindex_check(const ni_ifcondition_t *cond, ni_ifworker_t *w)
1199+
{
1200+
unsigned int ifindex;
11951201

1196-
result = ni_ifcondition_new(__ni_fsm_policy_match_device_check);
1197-
result->args.device.node = node;
1198-
return result;
1202+
if (ni_parse_uint(cond->args.string, &ifindex, 10) < 0 || !ifindex)
1203+
return FALSE;
1204+
return ni_ifworker_match_netdev_ifindex(w, ifindex);
11991205
}
12001206

1201-
/*
1202-
* <device-alias>foobidoo</device-alias>
1203-
*/
1204-
static ni_bool_t
1205-
__ni_fsm_policy_match_device_alias_check(const ni_ifcondition_t *cond, ni_ifworker_t *w)
1207+
static ni_ifcondition_t *
1208+
ni_ifcondition_device_element(xml_node_t *node, const char *name)
12061209
{
1207-
return ni_ifworker_match_alias(w, cond->args.string);
1210+
if (ni_string_eq(name, "name")) {
1211+
return ni_ifcondition_new_cdata(__ni_fsm_policy_match_device_name_check, node);
1212+
}
1213+
if (ni_string_eq(name, "alias")) {
1214+
return ni_ifcondition_new_cdata(__ni_fsm_policy_match_device_alias_check, node);
1215+
}
1216+
if (ni_string_eq(name, "ifindex")) {
1217+
return ni_ifcondition_new_cdata(__ni_fsm_policy_match_device_ifindex_check, node);
1218+
}
1219+
ni_error("%s: unknown device condition <%s>", xml_node_location(node), name);
1220+
return NULL;
12081221
}
12091222

12101223
static ni_ifcondition_t *
1211-
ni_ifcondition_device_alias(xml_node_t *node)
1224+
ni_ifcondition_device(xml_node_t *node)
12121225
{
1213-
return ni_ifcondition_new_cdata(__ni_fsm_policy_match_device_alias_check, node);
1226+
ni_ifcondition_t *result = NULL;
1227+
1228+
if (!node->children && node->cdata)
1229+
return ni_ifcondition_new_cdata(__ni_fsm_policy_match_device_name_check, node);
1230+
1231+
for (node = node->children; node; node = node->next) {
1232+
ni_ifcondition_t *cond;
1233+
1234+
cond = ni_ifcondition_device_element(node, node->name);
1235+
if (cond == NULL) {
1236+
if (result)
1237+
ni_ifcondition_free(result);
1238+
return NULL;
1239+
}
1240+
1241+
if (result == NULL)
1242+
result = cond;
1243+
else
1244+
result = ni_ifcondition_and_terms(result, cond);
1245+
}
1246+
1247+
return result;
12141248
}
12151249

12161250
/*
@@ -1468,30 +1502,30 @@ ni_ifcondition_from_xml(xml_node_t *node)
14681502
return ni_ifcondition_none(node);
14691503
if (!strcmp(node->name, "type"))
14701504
return ni_ifcondition_type(node);
1471-
if (!strcmp(node->name, "device"))
1472-
return ni_ifcondition_device(node);
14731505
if (!strcmp(node->name, "class"))
14741506
return ni_ifcondition_class(node);
14751507
if (!strcmp(node->name, "sharable"))
14761508
return ni_ifcondition_sharable(node);
14771509
if (!strcmp(node->name, "link-type"))
14781510
return ni_ifcondition_linktype(node);
1479-
if (!strcmp(node->name, "device-alias"))
1480-
return ni_ifcondition_device_alias(node);
14811511
if (!strcmp(node->name, "control-mode"))
14821512
return ni_ifcondition_control_mode(node);
14831513
if (!strcmp(node->name, "boot-stage"))
14841514
return ni_ifcondition_boot_stage(node);
14851515
if (!strcmp(node->name, "minimum-device-state"))
14861516
return ni_ifcondition_min_device_state(node);
1517+
if (!strcmp(node->name, "device"))
1518+
return ni_ifcondition_device(node);
1519+
if (!strncmp(node->name, "device:", sizeof("device:")-1))
1520+
return ni_ifcondition_device_element(node, node->name + sizeof("device:")-1);
14871521
if (!strcmp(node->name, "modem"))
14881522
return ni_ifcondition_modem(node);
1489-
if (!strncmp(node->name, "modem:", 6))
1490-
return ni_ifcondition_modem_element(node, node->name + 6);
1523+
if (!strncmp(node->name, "modem:", sizeof("modem:")-1))
1524+
return ni_ifcondition_modem_element(node, node->name + sizeof("modem:")-1);
14911525
if (!strcmp(node->name, "wireless"))
14921526
return ni_ifcondition_wireless(node);
1493-
if (!strncmp(node->name, "wireless:", 9))
1494-
return ni_ifcondition_wireless_element(node, node->name + 9);
1527+
if (!strncmp(node->name, "wireless:", sizeof("wireless:")-1))
1528+
return ni_ifcondition_wireless_element(node, node->name + sizeof("wireless:")-1);
14951529

14961530
ni_error("%s: unsupported policy conditional <%s>", xml_node_location(node), node->name);
14971531
return NULL;

src/fsm.c

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,81 @@ ni_ifworker_by_modem(ni_fsm_t *fsm, const ni_modem_t *dev)
592592
return NULL;
593593
}
594594

595+
ni_bool_t
596+
ni_ifworker_match_netdev_name(const ni_ifworker_t *w, const char *ifname)
597+
{
598+
xml_node_t *node;
599+
600+
if (!ifname)
601+
return FALSE;
602+
603+
if (w->device && ni_string_eq(w->device->name, ifname))
604+
return TRUE;
605+
606+
if (w->config.node && (node = xml_node_get_child(w->config.node, "name"))) {
607+
const char *namespace = xml_node_get_attr(node, "namespace");
608+
if (!namespace && ni_string_eq(node->cdata, ifname))
609+
return TRUE;
610+
}
611+
612+
return FALSE;
613+
}
614+
615+
static ni_bool_t
616+
__ni_ifworker_match_netdev_ifindex(unsigned int ifindex, const char *value)
617+
{
618+
unsigned int index;
619+
620+
if (ni_parse_uint(value, &index, 10) < 0 || !index)
621+
return FALSE;
622+
return ifindex == index;
623+
}
624+
625+
ni_bool_t
626+
ni_ifworker_match_netdev_ifindex(const ni_ifworker_t *w, unsigned int ifindex)
627+
{
628+
xml_node_t *node;
629+
630+
if (!ifindex)
631+
return FALSE;
632+
633+
if (w->device && w->device->link.ifindex == ifindex)
634+
return TRUE;
635+
636+
if (w->config.node && (node = xml_node_get_child(w->config.node, "name"))) {
637+
const char *namespace = xml_node_get_attr(node, "namespace");
638+
639+
if (namespace && ni_string_eq(namespace, "ifindex"))
640+
return __ni_ifworker_match_netdev_ifindex(ifindex, node->cdata);
641+
}
642+
return FALSE;
643+
}
644+
645+
ni_bool_t
646+
ni_ifworker_match_netdev_alias(const ni_ifworker_t *w, const char *ifalias)
647+
{
648+
xml_node_t *node;
649+
650+
if (!ifalias)
651+
return FALSE;
652+
653+
if (w->device && ni_string_eq(w->device->link.alias, ifalias))
654+
return TRUE;
655+
656+
if (w->config.node && (node = xml_node_get_child(w->config.node, "alias"))) {
657+
if (ni_string_eq(node->cdata, ifalias))
658+
return TRUE;
659+
}
660+
if (w->config.node && (node = xml_node_get_child(w->config.node, "name"))) {
661+
const char *namespace = xml_node_get_attr(node, "namespace");
662+
663+
if (namespace && ni_string_eq(namespace, "alias"))
664+
return ni_string_eq(node->cdata, ifalias);
665+
}
666+
667+
return FALSE;
668+
}
669+
595670
ni_bool_t
596671
ni_ifworker_match_alias(const ni_ifworker_t *w, const char *alias)
597672
{
@@ -603,7 +678,7 @@ ni_ifworker_match_alias(const ni_ifworker_t *w, const char *alias)
603678
if (w->device && ni_string_eq(w->device->link.alias, alias))
604679
return TRUE;
605680

606-
if (w->config.node && (node = xml_node_get_child(w->config.node, "alias")) != NULL) {
681+
if (w->config.node && (node = xml_node_get_child(w->config.node, "alias"))) {
607682
if (ni_string_eq(node->cdata, alias))
608683
return TRUE;
609684
}

0 commit comments

Comments
 (0)