2 * netifd - network interface daemon
3 * Copyright (C) 2012 Felix Fietkau <nbd@openwrt.org>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2
7 * as published by the Free Software Foundation
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
18 #include <arpa/inet.h>
19 #include <netinet/in.h>
22 __vlist_simple_init(struct vlist_simple_tree *tree, int offset)
24 INIT_LIST_HEAD(&tree->list);
26 tree->head_offset = offset;
30 vlist_simple_delete(struct vlist_simple_tree *tree, struct vlist_simple_node *node)
34 list_del(&node->list);
35 ptr = (char *) node - tree->head_offset;
40 vlist_simple_flush(struct vlist_simple_tree *tree)
42 struct vlist_simple_node *n, *tmp;
44 list_for_each_entry_safe(n, tmp, &tree->list, list) {
45 if ((n->version == tree->version || n->version == -1) &&
49 vlist_simple_delete(tree, n);
54 vlist_simple_replace(struct vlist_simple_tree *dest, struct vlist_simple_tree *old)
56 struct vlist_simple_node *n, *tmp;
58 vlist_simple_update(dest);
59 list_for_each_entry_safe(n, tmp, &old->list, list) {
61 vlist_simple_add(dest, n);
63 vlist_simple_flush(dest);
67 vlist_simple_flush_all(struct vlist_simple_tree *tree)
70 vlist_simple_flush(tree);
74 parse_netmask_string(const char *str, bool v6)
80 if (!strchr(str, '.')) {
81 ret = strtoul(str, &err, 0);
91 if (inet_aton(str, &addr) != 1)
94 return 32 - fls(~(ntohl(addr.s_addr)));
101 split_netmask(char *str, unsigned int *netmask, bool v6)
103 char *delim = strchr(str, '/');
108 *netmask = parse_netmask_string(delim, v6);
114 parse_ip_and_netmask(int af, const char *str, void *addr, unsigned int *netmask)
116 char *astr = alloca(strlen(str) + 1);
119 if (!split_netmask(astr, netmask, af == AF_INET6))
122 if (af == AF_INET6) {
130 return inet_pton(af, astr, addr);
134 format_macaddr(uint8_t *mac)
136 static char str[sizeof("ff:ff:ff:ff:ff:ff ")];
138 snprintf(str, sizeof(str), "%02x:%02x:%02x:%02x:%02x:%02x",
139 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);