uint32_t references;
};
+struct vnn_interface {
+ struct vnn_interface *prev, *next;
+ struct ctdb_interface *iface;
+};
+
/* state associated with a public ip address */
struct ctdb_vnn {
struct ctdb_vnn *prev, *next;
struct ctdb_interface *iface;
- const char **ifaces;
+ struct vnn_interface *ifaces;
ctdb_sock_addr public_address;
uint8_t public_netmask_bits;
static bool vnn_has_interface_with_name(struct ctdb_vnn *vnn,
const char *name)
{
- int n;
+ struct vnn_interface *i;
- for (n = 0; vnn->ifaces[n] != NULL; n++) {
- if (strcmp(name, vnn->ifaces[n]) == 0) {
+ for (i = vnn->ifaces; i != NULL; i = i->next) {
+ if (strcmp(name, i->iface->name) == 0) {
return true;
}
}
static struct ctdb_interface *ctdb_vnn_best_iface(struct ctdb_context *ctdb,
struct ctdb_vnn *vnn)
{
- int i;
+ struct vnn_interface *i;
struct ctdb_interface *cur = NULL;
struct ctdb_interface *best = NULL;
- for (i=0; vnn->ifaces[i]; i++) {
+ for (i = vnn->ifaces; i != NULL; i = i->next) {
- cur = ctdb_find_iface(ctdb, vnn->ifaces[i]);
+ cur = ctdb_find_iface(ctdb, i->iface->name);
if (cur == NULL) {
continue;
}
static bool ctdb_vnn_available(struct ctdb_context *ctdb,
struct ctdb_vnn *vnn)
{
- int i;
+ struct vnn_interface *i;
/* Nodes that are not RUNNING can not host IPs */
if (ctdb->runstate != CTDB_RUNSTATE_RUNNING) {
return true;
}
- for (i=0; vnn->ifaces[i]; i++) {
+ for (i = vnn->ifaces; i != NULL; i = i->next) {
struct ctdb_interface *cur;
- cur = ctdb_find_iface(ctdb, vnn->ifaces[i]);
+ cur = ctdb_find_iface(ctdb, i->iface->name);
if (cur == NULL) {
continue;
}
bool check_address)
{
struct ctdb_vnn *vnn;
- uint32_t num = 0;
char *tmp;
const char *iface;
DEBUG(DEBUG_ERR, (__location__ " out of memory\n"));
return -1;
}
- vnn->ifaces = talloc_array(vnn, const char *, num + 2);
- if (vnn->ifaces == NULL) {
- DEBUG(DEBUG_ERR, (__location__ " out of memory\n"));
- talloc_free(vnn);
- return -1;
- }
tmp = talloc_strdup(vnn, ifaces);
if (tmp == NULL) {
DEBUG(DEBUG_ERR, (__location__ " out of memory\n"));
return -1;
}
for (iface = strtok(tmp, ","); iface; iface = strtok(NULL, ",")) {
+ struct vnn_interface *vnn_iface;
struct ctdb_interface *i;
if (!ctdb_sys_check_iface_exists(iface)) {
DEBUG(DEBUG_ERR,
return -1;
}
- vnn->ifaces = talloc_realloc(vnn, vnn->ifaces, const char *, num + 2);
- if (vnn->ifaces == NULL) {
+ vnn_iface = talloc_zero(vnn, struct vnn_interface);
+ if (vnn_iface == NULL) {
DEBUG(DEBUG_ERR, (__location__ " out of memory\n"));
talloc_free(vnn);
return -1;
}
- vnn->ifaces[num] = talloc_strdup(vnn, iface);
- if (vnn->ifaces[num] == NULL) {
- DEBUG(DEBUG_ERR, (__location__ " out of memory\n"));
- talloc_free(vnn);
- return -1;
- }
- num++;
+
+ vnn_iface->iface = i;
+ DLIST_ADD_END(vnn->ifaces, vnn_iface);
}
talloc_free(tmp);
- vnn->ifaces[num] = NULL;
vnn->public_address = *addr;
vnn->public_netmask_bits = mask;
vnn->pnn = -1;
ctdb_sock_addr *addr;
struct ctdb_public_ip_info_old *info;
struct ctdb_vnn *vnn;
+ struct vnn_interface *iface;
addr = (ctdb_sock_addr *)indata.dptr;
/* count how many public ip structures we have */
num = 0;
- for (;vnn->ifaces[num];) {
+ for (iface = vnn->ifaces; iface != NULL; iface = iface->next) {
num++;
}
info->ip.pnn = vnn->pnn;
info->active_idx = 0xFFFFFFFF;
- for (i=0; vnn->ifaces[i]; i++) {
+ i = 0;
+ for (iface = vnn->ifaces; iface != NULL; iface = iface->next) {
struct ctdb_interface *cur;
- cur = ctdb_find_iface(ctdb, vnn->ifaces[i]);
+ cur = ctdb_find_iface(ctdb, iface->iface->name);
if (cur == NULL) {
DEBUG(DEBUG_CRIT, (__location__ " internal error iface[%s] unknown\n",
- vnn->ifaces[i]));
+ iface->iface->name));
return -1;
}
if (vnn->iface == cur) {
info->ifaces[i].name[sizeof(info->ifaces[i].name)-1] = '\0';
info->ifaces[i].link_state = cur->link_up;
info->ifaces[i].references = cur->references;
+
+ i++;
}
info->num = i;
len = offsetof(struct ctdb_public_ip_info_old, ifaces) +
struct ctdb_addr_info_old *pub;
const char *ifaces = NULL;
uint32_t len;
- int iface = 0;
+ struct vnn_interface *iface = NULL;
DEBUG(DEBUG_NOTICE,
("New IP %s configured, adding it\n",
first_add = false;
}
- ifaces = vnn->ifaces[0];
- iface = 1;
- while (vnn->ifaces[iface] != NULL) {
+ ifaces = vnn->ifaces->iface->name;
+ iface = vnn->ifaces->next;
+ while (iface != NULL) {
ifaces = talloc_asprintf(vnn, "%s,%s", ifaces,
- vnn->ifaces[iface]);
- iface++;
+ iface->iface->name);
+ iface = iface->next;
}
len = strlen(ifaces) + 1;