static void vif_config_add_bridge(struct blob_buf *buf, struct blob_attr *networks, bool prepare) { struct interface *iface; struct device *dev = NULL; struct blob_attr *cur; const char *network; int rem; if (!networks) return; blobmsg_for_each_attr(cur, networks, rem) { network = blobmsg_data(cur); iface = vlist_find(&interfaces, network, iface, node); if (!iface) continue; dev = iface->main_dev.dev; if (!dev) return; if (dev->type != &bridge_device_type) return; }
struct interface* interface_get(const char *name, int v6, int multicast) { char id_buf[32]; snprintf(id_buf, sizeof(id_buf), "%d_%d_%s", multicast, v6, name); struct interface *iface = vlist_find(&interfaces, id_buf, iface, node); return iface; }
static int alias_check_state(struct device *dev) { struct alias_device *alias; struct interface *iface; struct device *ndev = NULL; alias = container_of(dev, struct alias_device, dev); iface = vlist_find(&interfaces, alias->name, iface, node); if (iface && iface->state == IFS_UP) ndev = iface->l3_dev.dev; alias_set_device(alias, ndev); return 0; }
void iprule_add(struct blob_attr *attr, bool v6) { struct interface *iif = NULL, *oif = NULL; struct blob_attr *tb[__RULE_MAX], *cur; struct interface *iface; struct iprule *rule; int af = v6 ? AF_INET6 : AF_INET; blobmsg_parse(rule_attr, __RULE_MAX, tb, blobmsg_data(attr), blobmsg_data_len(attr)); rule = calloc(1, sizeof(*rule)); if (!rule) return; rule->flags = v6 ? IPRULE_INET6 : IPRULE_INET4; rule->order = iprules_counter[rule->flags]++; if ((cur = tb[RULE_INVERT]) != NULL) rule->invert = blobmsg_get_bool(cur); if ((cur = tb[RULE_INTERFACE_IN]) != NULL) { iif = vlist_find(&interfaces, blobmsg_data(cur), iface, node); if (!iif || !iif->l3_dev.dev) { DPRINTF("Failed to resolve device of network: %s\n", (char *) blobmsg_data(cur)); goto error; } memcpy(rule->in_dev, iif->l3_dev.dev->ifname, sizeof(rule->in_dev)); rule->flags |= IPRULE_IN; } if ((cur = tb[RULE_INTERFACE_OUT]) != NULL) { oif = vlist_find(&interfaces, blobmsg_data(cur), iface, node); if (!oif || !oif->l3_dev.dev) { DPRINTF("Failed to resolve device of network: %s\n", (char *) blobmsg_data(cur)); goto error; } memcpy(rule->out_dev, oif->l3_dev.dev->ifname, sizeof(rule->out_dev)); rule->flags |= IPRULE_OUT; } if ((cur = tb[RULE_SRC]) != NULL) { if (!parse_ip_and_netmask(af, blobmsg_data(cur), &rule->src_addr, &rule->src_mask)) { DPRINTF("Failed to parse rule source: %s\n", (char *) blobmsg_data(cur)); goto error; } rule->flags |= IPRULE_SRC; } if ((cur = tb[RULE_DEST]) != NULL) { if (!parse_ip_and_netmask(af, blobmsg_data(cur), &rule->dest_addr, &rule->dest_mask)) { DPRINTF("Failed to parse rule destination: %s\n", (char *) blobmsg_data(cur)); goto error; } rule->flags |= IPRULE_DEST; } if ((cur = tb[RULE_PRIORITY]) != NULL) { rule->priority = blobmsg_get_u32(cur); rule->flags |= IPRULE_PRIORITY; } if ((cur = tb[RULE_TOS]) != NULL) { if ((rule->tos = blobmsg_get_u32(cur)) > 255) { DPRINTF("Invalid TOS value: %u\n", blobmsg_get_u32(cur)); goto error; } rule->flags |= IPRULE_TOS; } if ((cur = tb[RULE_FWMARK]) != NULL) { if (!iprule_parse_mark(blobmsg_data(cur), rule)) { DPRINTF("Failed to parse rule fwmark: %s\n", (char *) blobmsg_data(cur)); goto error; } /* flags set by iprule_parse_mark() */ } if ((cur = tb[RULE_LOOKUP]) != NULL) { if (!system_resolve_rt_table(blobmsg_data(cur), &rule->lookup)) { DPRINTF("Failed to parse rule lookup table: %s\n", (char *) blobmsg_data(cur)); goto error; } rule->flags |= IPRULE_LOOKUP; } if ((cur = tb[RULE_ACTION]) != NULL) { if (!system_resolve_iprule_action(blobmsg_data(cur), &rule->action)) { DPRINTF("Failed to parse rule action: %s\n", (char *) blobmsg_data(cur)); goto error; } rule->flags |= IPRULE_ACTION; } if ((cur = tb[RULE_GOTO]) != NULL) { rule->gotoid = blobmsg_get_u32(cur); rule->flags |= IPRULE_GOTO; } vlist_add(&iprules, &rule->node, &rule->flags); return; error: free(rule); }