Add mud_set_on() to enable/disable a local addr
This commit is contained in:
65
mud.c
65
mud.c
@@ -77,6 +77,7 @@ struct ipaddr {
|
|||||||
struct path {
|
struct path {
|
||||||
struct {
|
struct {
|
||||||
unsigned up : 1;
|
unsigned up : 1;
|
||||||
|
unsigned on : 1;
|
||||||
unsigned active : 1;
|
unsigned active : 1;
|
||||||
} state;
|
} state;
|
||||||
struct ipaddr local_addr;
|
struct ipaddr local_addr;
|
||||||
@@ -340,6 +341,24 @@ int mud_sso_int (int fd, int level, int optname, int opt)
|
|||||||
return setsockopt(fd, level, optname, &opt, sizeof(opt));
|
return setsockopt(fd, level, optname, &opt, sizeof(opt));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int mud_cmp_ipaddr (struct ipaddr *a, struct ipaddr *b)
|
||||||
|
{
|
||||||
|
if (a == b)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (a->family != b->family)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (a->family == AF_INET)
|
||||||
|
return memcmp(&a->ip.v4, &b->ip.v4, sizeof(a->ip.v4));
|
||||||
|
|
||||||
|
if (a->family == AF_INET6)
|
||||||
|
return memcmp(&a->ip.v6, &b->ip.v6, sizeof(a->ip.v6));
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
int mud_cmp_addr (struct sockaddr *a, struct sockaddr *b)
|
int mud_cmp_addr (struct sockaddr *a, struct sockaddr *b)
|
||||||
{
|
{
|
||||||
@@ -377,19 +396,9 @@ struct path *mud_get_path (struct mud *mud, struct ipaddr *local_addr,
|
|||||||
struct path *path;
|
struct path *path;
|
||||||
|
|
||||||
for (path = mud->path; path; path = path->next) {
|
for (path = mud->path; path; path = path->next) {
|
||||||
if (local_addr->family != path->local_addr.family)
|
if (mud_cmp_ipaddr(local_addr, &path->local_addr))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (local_addr->family == AF_INET) {
|
|
||||||
if (memcmp(&path->local_addr.ip.v4, &local_addr->ip.v4,
|
|
||||||
sizeof(local_addr->ip.v4)))
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
if (memcmp(&path->local_addr.ip.v6, &local_addr->ip.v6,
|
|
||||||
sizeof(local_addr->ip.v6)))
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mud_cmp_addr(addr, (struct sockaddr *)&path->addr))
|
if (mud_cmp_addr(addr, (struct sockaddr *)&path->addr))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -477,6 +486,8 @@ struct path *mud_new_path (struct mud *mud, struct ipaddr *local_addr,
|
|||||||
|
|
||||||
mud_set_path(path, local_addr, addr);
|
mud_set_path(path, local_addr, addr);
|
||||||
|
|
||||||
|
path->state.on = 1;
|
||||||
|
|
||||||
path->next = mud->path;
|
path->next = mud->path;
|
||||||
mud->path = path;
|
mud->path = path;
|
||||||
|
|
||||||
@@ -504,6 +515,33 @@ int mud_ipaddrinfo (struct ipaddr *ipaddr, const char *name)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mud_set_on (struct mud *mud, const char *name, int on)
|
||||||
|
{
|
||||||
|
if (!name) {
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ipaddr local_addr;
|
||||||
|
|
||||||
|
if (mud_ipaddrinfo(&local_addr, name))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
struct path *path = NULL;
|
||||||
|
|
||||||
|
for (path = mud->path; path; path = path->next) {
|
||||||
|
if (!path->state.active)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (mud_cmp_ipaddr(&local_addr, &path->local_addr))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
path->state.on = on;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int mud_peer (struct mud *mud, const char *name, const char *host, int port)
|
int mud_peer (struct mud *mud, const char *name, const char *host, int port)
|
||||||
{
|
{
|
||||||
if (!name || !host || !port) {
|
if (!name || !host || !port) {
|
||||||
@@ -1086,6 +1124,9 @@ int mud_push (struct mud *mud)
|
|||||||
struct path *path;
|
struct path *path;
|
||||||
|
|
||||||
for (path = mud->path; path; path = path->next) {
|
for (path = mud->path; path; path = path->next) {
|
||||||
|
if (!path->state.on)
|
||||||
|
continue;
|
||||||
|
|
||||||
uint64_t now = mud_now(mud);
|
uint64_t now = mud_now(mud);
|
||||||
|
|
||||||
if ((path->last_time) &&
|
if ((path->last_time) &&
|
||||||
@@ -1132,7 +1173,7 @@ int mud_push (struct mud *mud)
|
|||||||
int64_t limit_min = INT64_MAX;
|
int64_t limit_min = INT64_MAX;
|
||||||
|
|
||||||
for (path = mud->path; path; path = path->next) {
|
for (path = mud->path; path; path = path->next) {
|
||||||
if (!path->state.up)
|
if (!path->state.up || !path->state.on)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int64_t limit = path->limit;
|
int64_t limit = path->limit;
|
||||||
|
|||||||
2
mud.h
2
mud.h
@@ -15,6 +15,8 @@ int mud_get_fd (struct mud *);
|
|||||||
int mud_set_send_timeout_msec (struct mud *, unsigned);
|
int mud_set_send_timeout_msec (struct mud *, unsigned);
|
||||||
int mud_set_time_tolerance_sec (struct mud *, unsigned);
|
int mud_set_time_tolerance_sec (struct mud *, unsigned);
|
||||||
|
|
||||||
|
int mud_set_on (struct mud *, const char *, int);
|
||||||
|
|
||||||
int mud_peer (struct mud *, const char *, const char *, int);
|
int mud_peer (struct mud *, const char *, const char *, int);
|
||||||
|
|
||||||
int mud_can_pull (struct mud *);
|
int mud_can_pull (struct mud *);
|
||||||
|
|||||||
Reference in New Issue
Block a user