mirror of
https://github.com/outbackdingo/udevmand.git
synced 2026-08-25 14:53:42 +00:00
mac addresses were never flushed
Signed-off-by: John Crispin <[email protected]>
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
cmake_minimum_required(VERSION 2.6)
|
cmake_minimum_required(VERSION 2.6)
|
||||||
|
|
||||||
|
include_directories(/usr/local/include/libnl-tiny)
|
||||||
|
|
||||||
PROJECT(udevmand C)
|
PROJECT(udevmand C)
|
||||||
INCLUDE(GNUInstallDirs)
|
INCLUDE(GNUInstallDirs)
|
||||||
ADD_DEFINITIONS(-Os -ggdb -Wall -Werror --std=gnu99 -Wmissing-declarations)
|
ADD_DEFINITIONS(-Os -ggdb -Wall -Werror --std=gnu99 -Wmissing-declarations)
|
||||||
|
|||||||
@@ -81,6 +81,8 @@ bridge_dump_if(const char *bridge)
|
|||||||
}
|
}
|
||||||
if (c)
|
if (c)
|
||||||
blobmsg_close_array(&b, c);
|
blobmsg_close_array(&b, c);
|
||||||
|
|
||||||
|
globfree(&gl);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -110,14 +112,14 @@ bridge_read_if(const char *bridge)
|
|||||||
continue;
|
continue;
|
||||||
brif = malloc(sizeof(*brif));
|
brif = malloc(sizeof(*brif));
|
||||||
if (!brif)
|
if (!brif)
|
||||||
return;
|
goto out;
|
||||||
strcpy(brif->name, basename(gl.gl_pathv[i]));
|
strcpy(brif->name, basename(gl.gl_pathv[i]));
|
||||||
brif->port_no = port_no;
|
brif->port_no = port_no;
|
||||||
list_add(&brif->list, &bridge_if);
|
list_add(&brif->list, &bridge_if);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
out:
|
||||||
globfree(&gl);
|
globfree(&gl);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bridge_tout(struct uloop_timeout *t)
|
static void bridge_tout(struct uloop_timeout *t)
|
||||||
@@ -128,7 +130,7 @@ static void bridge_tout(struct uloop_timeout *t)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (glob("/sys/class/net/*", GLOB_MARK | GLOB_ONLYDIR | GLOB_NOSORT, NULL, &gl))
|
if (glob("/sys/class/net/*", GLOB_MARK | GLOB_ONLYDIR | GLOB_NOSORT, NULL, &gl))
|
||||||
return;
|
goto out;
|
||||||
|
|
||||||
list_for_each_entry_safe(brif, tmp, &bridge_if, list) {
|
list_for_each_entry_safe(brif, tmp, &bridge_if, list) {
|
||||||
list_del(&brif->list);
|
list_del(&brif->list);
|
||||||
@@ -143,6 +145,7 @@ static void bridge_tout(struct uloop_timeout *t)
|
|||||||
vlist_flush(&bridge_mac);
|
vlist_flush(&bridge_mac);
|
||||||
globfree(&gl);
|
globfree(&gl);
|
||||||
|
|
||||||
|
out:
|
||||||
uloop_timeout_set(&bridge_timer, 1000);
|
uloop_timeout_set(&bridge_timer, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,3 +190,29 @@ void bridge_init(void)
|
|||||||
uloop_timeout_set(&bridge_timer, 1000);
|
uloop_timeout_set(&bridge_timer, 1000);
|
||||||
vlist_init(&bridge_mac, bridge_cmp, bridge_update);
|
vlist_init(&bridge_mac, bridge_cmp, bridge_update);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bridge_flush(void)
|
||||||
|
{
|
||||||
|
struct bridge_if *brif, *tmp;
|
||||||
|
struct bridge_mac *b, *p;
|
||||||
|
|
||||||
|
vlist_for_each_element_safe(&bridge_mac, b, vlist, p) {
|
||||||
|
vlist_delete(&bridge_mac, &b->vlist);
|
||||||
|
free(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
list_for_each_entry_safe(brif, tmp, &bridge_if, list) {
|
||||||
|
list_del(&brif->list);
|
||||||
|
free(brif);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
bridge_mac_del(struct bridge_mac *b)
|
||||||
|
{
|
||||||
|
list_del(&b->mac);
|
||||||
|
vlist_delete(&bridge_mac, &b->vlist);
|
||||||
|
free(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -111,6 +111,14 @@ dhcpv4_release(struct blob_attr *msg)
|
|||||||
free(dhcpv4);
|
free(dhcpv4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dhcpv4_del(struct dhcpv4 *dhcpv4)
|
||||||
|
{
|
||||||
|
list_del(&dhcpv4->mac);
|
||||||
|
avl_delete(&dhcpv4_tree, &dhcpv4->avl);
|
||||||
|
free(dhcpv4);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
dhcp_init(void)
|
dhcp_init(void)
|
||||||
{
|
{
|
||||||
@@ -136,4 +144,18 @@ dhcp_init(void)
|
|||||||
|
|
||||||
dhcpv4_add(addr, ip, hostname, NULL);
|
dhcpv4_add(addr, ip, hostname, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dhcp_done(void)
|
||||||
|
{
|
||||||
|
struct dhcpv4 *d, *t;
|
||||||
|
|
||||||
|
avl_for_each_element_safe(&dhcpv4_tree, d, avl, t) {
|
||||||
|
avl_delete(&dhcpv4_tree, &d->avl);
|
||||||
|
free(d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -115,14 +115,44 @@ mac_dump(struct mac *mac, int interface)
|
|||||||
neigh_flush();
|
neigh_flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mac_flush(struct mac *mac, struct timespec ts)
|
||||||
|
{
|
||||||
|
time_t last_seen;
|
||||||
|
|
||||||
|
last_seen = ts.tv_sec - mac->ts.tv_sec;
|
||||||
|
if (last_seen < 60 * 60)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!list_empty(&mac->dhcpv4)) {
|
||||||
|
struct dhcpv4 *dhcpv4, *t;
|
||||||
|
|
||||||
|
list_for_each_entry_safe(dhcpv4, t, &mac->dhcpv4, mac)
|
||||||
|
dhcpv4_del(dhcpv4);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!list_empty(&mac->bridge_mac)) {
|
||||||
|
struct bridge_mac *bridge_mac, *t;
|
||||||
|
|
||||||
|
list_for_each_entry_safe(bridge_mac, t, &mac->bridge_mac, mac)
|
||||||
|
bridge_mac_del(bridge_mac);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
mac_dump_all(void)
|
mac_dump_all(void)
|
||||||
{
|
{
|
||||||
struct mac *mac;
|
struct mac *mac, *t;
|
||||||
|
struct timespec ts;
|
||||||
|
|
||||||
blob_buf_init(&b, 0);
|
blob_buf_init(&b, 0);
|
||||||
|
|
||||||
avl_for_each_element(&mac_tree, mac, avl)
|
avl_for_each_element(&mac_tree, mac, avl)
|
||||||
mac_dump(mac, 1);
|
mac_dump(mac, 1);
|
||||||
|
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||||
|
avl_for_each_element_safe(&mac_tree, mac, avl, t)
|
||||||
|
mac_flush(mac, ts);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,12 @@ int main(int argc, char **argv)
|
|||||||
uloop_run();
|
uloop_run();
|
||||||
uloop_done();
|
uloop_done();
|
||||||
ubus_uninit();
|
ubus_uninit();
|
||||||
|
bridge_flush();
|
||||||
|
blob_buf_free(&b);
|
||||||
|
neigh_done();
|
||||||
|
interface_done();
|
||||||
|
dhcp_done();
|
||||||
|
iface_done();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -181,3 +181,9 @@ neigh_init(void)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
neigh_done(void)
|
||||||
|
{
|
||||||
|
nl_socket_free(rtnl_sock.sock);
|
||||||
|
}
|
||||||
|
|||||||
@@ -38,6 +38,17 @@ iface_find(char *name)
|
|||||||
return iface;
|
return iface;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
iface_done(void)
|
||||||
|
{
|
||||||
|
struct iface *i, *t;
|
||||||
|
|
||||||
|
avl_for_each_element_safe(&iface_tree, i, avl, t) {
|
||||||
|
avl_delete(&iface_tree, &i->avl);
|
||||||
|
free(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
iface_get(void)
|
iface_get(void)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -104,3 +104,13 @@ interface_dump(void)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
interface_done(void)
|
||||||
|
{
|
||||||
|
struct interface *i, *t;
|
||||||
|
|
||||||
|
avl_for_each_element_safe(&interface_tree, i, avl, t)
|
||||||
|
free(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
+9
-2
@@ -102,7 +102,7 @@ struct bridge_mac {
|
|||||||
|
|
||||||
int avl_mac_cmp(const void *k1, const void *k2, void *ptr);
|
int avl_mac_cmp(const void *k1, const void *k2, void *ptr);
|
||||||
|
|
||||||
struct avl_tree mac_tree;
|
extern struct avl_tree mac_tree;
|
||||||
int mac_dump_all(void);
|
int mac_dump_all(void);
|
||||||
void mac_dump(struct mac *mac, int interface);
|
void mac_dump(struct mac *mac, int interface);
|
||||||
struct mac* mac_find(uint8_t *addr);
|
struct mac* mac_find(uint8_t *addr);
|
||||||
@@ -111,12 +111,13 @@ void mac_update(struct mac *mac, char *iface);
|
|||||||
int neigh_init(void);
|
int neigh_init(void);
|
||||||
void neigh_enum(void);
|
void neigh_enum(void);
|
||||||
void neigh_flush(void);
|
void neigh_flush(void);
|
||||||
|
void neigh_done(void);
|
||||||
|
|
||||||
bool nl_status_socket(struct nl_socket *ev, int protocol,
|
bool nl_status_socket(struct nl_socket *ev, int protocol,
|
||||||
int (*cb)(struct nl_msg *msg, void *arg), void *priv);
|
int (*cb)(struct nl_msg *msg, void *arg), void *priv);
|
||||||
int genl_send_and_recv(struct nl_socket *ev, struct nl_msg * msg);
|
int genl_send_and_recv(struct nl_socket *ev, struct nl_msg * msg);
|
||||||
|
|
||||||
struct blob_buf b;
|
extern struct blob_buf b;
|
||||||
void blobmsg_add_iface(struct blob_buf *bbuf, char *name, int index);
|
void blobmsg_add_iface(struct blob_buf *bbuf, char *name, int index);
|
||||||
void blobmsg_add_iftype(struct blob_buf *bbuf, const char *name, const uint32_t iftype);
|
void blobmsg_add_iftype(struct blob_buf *bbuf, const char *name, const uint32_t iftype);
|
||||||
void blobmsg_add_ipv4(struct blob_buf *bbuf, const char *name, const uint8_t* addr);
|
void blobmsg_add_ipv4(struct blob_buf *bbuf, const char *name, const uint8_t* addr);
|
||||||
@@ -128,16 +129,22 @@ void ubus_uninit(void);
|
|||||||
|
|
||||||
void bridge_init(void);
|
void bridge_init(void);
|
||||||
void bridge_dump_if(const char *bridge);
|
void bridge_dump_if(const char *bridge);
|
||||||
|
void bridge_flush(void);
|
||||||
|
void bridge_mac_del(struct bridge_mac *b);
|
||||||
|
|
||||||
void dhcpv4_ack(struct blob_attr *msg);
|
void dhcpv4_ack(struct blob_attr *msg);
|
||||||
void dhcpv4_release(struct blob_attr *msg);
|
void dhcpv4_release(struct blob_attr *msg);
|
||||||
void dhcp_init(void);
|
void dhcp_init(void);
|
||||||
|
void dhcp_done(void);
|
||||||
|
void dhcpv4_del(struct dhcpv4 *dhcpv4);
|
||||||
|
|
||||||
int interface_dump(void);
|
int interface_dump(void);
|
||||||
void interface_update(struct blob_attr *msg, int raw);
|
void interface_update(struct blob_attr *msg, int raw);
|
||||||
void interface_down(struct blob_attr *msg);
|
void interface_down(struct blob_attr *msg);
|
||||||
char *interface_resolve(char *device);
|
char *interface_resolve(char *device);
|
||||||
|
void interface_done(void);
|
||||||
|
|
||||||
void ethers_init(void);
|
void ethers_init(void);
|
||||||
|
|
||||||
|
void iface_done(void);
|
||||||
void iface_dump(int delta);
|
void iface_dump(int delta);
|
||||||
|
|||||||
Reference in New Issue
Block a user