*/
int rc;
- if (facelet_cache_add(&facemgr->facelet_cache, facelet) < 0) {
- ERROR("[facemgr_process_create] Error adding facelet to cache");
- return -1;
- }
- DEBUG("Facelet added to cache");
-
/*
* If the facelet does not satisfy filters, we do not lose any information
* but do not take any action to complement the face
}
/* Process GET/UDPATE... */
+ int rc;
switch(facelet_get_status(facelet)) {
case FACELET_STATUS_UNDEFINED:
ERROR("[facemgr_process_update] Unexpected facelet status");
return -1;
}
}
+
+ rc = facemgr_facelet_satisfy_rules(facemgr, facelet);
+ if (rc == -3) {
+ /* Does not satisfy rules */
+ return 0;
+ }
+
if (!facelet_validate_face(facelet))
return 0;
}
}
+ rc = facemgr_facelet_satisfy_rules(facemgr, facelet);
+ if (rc == -3) {
+ /* Does not satisfy rules */
+ return 0;
+ }
+
if (!facelet_validate_face(facelet))
return 0;
int
facemgr_process_delete(facemgr_t * facemgr, facelet_t * facelet)
{
+
+ DEBUG("[facemgr_process_delete] Deleting facelet on hicn-light");
if (interface_on_event(facemgr->hl, facelet) < 0)
return -1;
+ /*
+ * It might be tempting to cache old information, but for now we reset the
+ * facelet state that might change (such as IP addresses etc).
+ * netdevice, netdevice_type and admin_state should not be affected.
+ */
+ DEBUG("[facemgr_process_delete] Cleaning cached data");
+ facelet_unset_local_addr(facelet);
+ facelet_unset_local_port(facelet);
+ facelet_unset_remote_addr(facelet);
+ facelet_unset_remote_port(facelet);
+
facelet_set_status(facelet, FACELET_STATUS_DELETED);
- //facelet_set_bj_done(facelet, false);
+
+ facelet_unset_bj_done(facelet);
return 0;
}
+
/**
* \brief Process incoming events from interfaces
*
/* This is a new facelet... we expect a CREATE event. */
switch(facelet_get_event(facelet_in)) {
case FACELET_EVENT_CREATE:
+
+ if (facelet_cache_add(&facemgr->facelet_cache, facelet_in) < 0) {
+ ERROR("[facemgr_on_event] Error adding facelet to cache");
+ return -1;
+ }
+ DEBUG("Facelet added to cache");
+
if (facemgr_process_create(facemgr, facelet_in) < 0) {
- ERROR("[facemgr_process_cached_facelet] Error processing CREATE event");
+ ERROR("[facemgr_on_event] Error processing CREATE event");
goto ERR;
}
break;
case FACELET_EVENT_GET:
/* Insert new facelet in cached */
if (facemgr_process_get(facemgr, facelet_in) < 0) {
- ERROR("[facemgr_process_cached_facelet] Error processing GET event");
+ ERROR("[facemgr_on_event] Error processing GET event");
goto ERR;
}
break;
DEBUG("... match #%d", i);
switch(facelet_get_event(facelet_in)) {
case FACELET_EVENT_CREATE:
- // FIXME, this might occur if the facemgr restarts and we try to
- // re-create existing faces
- ERROR("[facemgr_on_event] CREATE event for a face that already exists...");
- ret = -1;
+ // This case will occur when we try to re-create existing faces,
+ // eg. in the situation of a forwarder restarting.
+ // likely this occurs when the interface receives a (potentially new) address
+ if (facelet_merge(facelet, facelet_in) < 0) {
+ ERROR("[facemgr_on_event] Error merging facelets");
+ continue;
+ }
+ if (facemgr_process_create(facemgr, facelet) < 0) {
+ ERROR("[facemgr_on_event] Error processing CREATE event");
+ ret = -1;
+ }
continue;
case FACELET_EVENT_GET: /* should be an INFORM message */
continue;
case FACELET_EVENT_UPDATE:
- {
- DEBUG("FACELET_EVENT_UPDATE");
- char buf[128];
- facelet_snprintf(buf, 128, facelet_in);
- DEBUG("MERGE %s", buf);
- facelet_snprintf(buf, 128, facelet);
- DEBUG(" ON %s", buf);
- }
if (facelet_merge(facelet, facelet_in) < 0) {
ERROR("[facemgr_on_event] Error merging facelets");
continue;
override->is_discovery = false;
override->discovery = false;
+ override->is_ipv4 = false;
+ override->ipv6 = false;
+ override->is_ipv6 = false;
+ override->ipv6 = false;
+
override->overlays.v4 = NULL;
override->overlays.v6 = NULL;
return facelet_set_local_ ## NAME(facelet, NAME); \
} \
\
+int \
+facelet_unset_ ## NAME(facelet_t * facelet) \
+{ \
+ return facelet->NAME ## _status = FACELET_ATTR_STATUS_UNSET; \
+}
#define _(TYPE, NAME) FACELET_ACCESSORS(TYPE, NAME)
foreach_facelet_attr
facelet->bj_done = true;
}
+void
+facelet_unset_bj_done(facelet_t * facelet)
+{
+ facelet->bj_done = false;
+}
+
+
bool
facelet_is_bj_done(const facelet_t * facelet)
{
*/
bool facelet_has_key(const facelet_t * facelet);
-
#define FACELET_ACCESSORS_H(TYPE, NAME) \
bool facelet_has_ ## NAME(const facelet_t * facelet); \
facelet_attr_status_t facelet_get_ ## NAME ## _status(const facelet_t * facelet);\
int facelet_get_ ## NAME(const facelet_t * facelet, TYPE * NAME); \
-int facelet_set_ ## NAME(facelet_t * facelet, TYPE NAME);
+int facelet_set_ ## NAME(facelet_t * facelet, TYPE NAME); \
+int facelet_unset_ ## NAME(facelet_t * facelet);
#define _(TYPE, NAME) FACELET_ACCESSORS_H(TYPE, NAME)
foreach_facelet_attr
bool facelet_has_pending(const facelet_t * facelet);
void facelet_set_bj_done(facelet_t * facelet);
+void facelet_unset_bj_done(facelet_t * facelet);
bool facelet_is_bj_done(const facelet_t * facelet);
void facelet_set_au_done(facelet_t * facelet);
bool facelet_is_au_done(const facelet_t * facelet);
ERROR("Failed to delete face\n");
goto ERR;
}
- INFO("Deleted face id=%d\n", hc_face.id);
break;
case FACELET_EVENT_UPDATE:
config_setting_t *overlay_v4 = config_setting_get_member(overlay, "ipv4");
if (overlay_v4) {
const char * local_addr_str, * remote_addr_str;
- ip_address_t local_addr, remote_addr;
+ ip_address_t local_addr = IP_ADDRESS_EMPTY;
+ ip_address_t remote_addr = IP_ADDRESS_EMPTY;
ip_address_t * local_addr_p = NULL;
ip_address_t * remote_addr_p = NULL;
int local_port = 0;
int remote_port = 0;
if (config_setting_lookup_string(overlay_v4, "local_addr", &local_addr_str)) {
- ip_address_pton(local_addr_str, &local_addr);
+ if (ip_address_pton(local_addr_str, &local_addr) < 0) {
+ ERROR("Error parsing v4 local addr");
+ goto ERR;
+ }
local_addr_p = &local_addr;
}
}
if (config_setting_lookup_string(overlay_v4, "remote_addr", &remote_addr_str)) {
- ip_address_pton(remote_addr_str, &remote_addr);
+ if (ip_address_pton(remote_addr_str, &remote_addr) < 0) {
+ ERROR("Error parsing v4 remote addr");
+ goto ERR;
+ }
remote_addr_p = &remote_addr;
}
config_setting_t *overlay_v6 = config_setting_get_member(overlay, "ipv6");
if (overlay_v6) {
const char * local_addr_str, * remote_addr_str;
- ip_address_t local_addr, remote_addr;
+ ip_address_t local_addr = IP_ADDRESS_EMPTY;
+ ip_address_t remote_addr = IP_ADDRESS_EMPTY;
ip_address_t * local_addr_p = NULL;
ip_address_t * remote_addr_p = NULL;
int local_port = 0;
int remote_port = 0;
if (config_setting_lookup_string(overlay_v6, "local_addr", &local_addr_str)) {
- ip_address_pton(local_addr_str, &local_addr);
+ if (ip_address_pton(local_addr_str, &local_addr) < 0) {
+ ERROR("Error parsing v6 local addr");
+ goto ERR;
+ }
local_addr_p = &local_addr;
}
}
if (config_setting_lookup_string(overlay_v6, "remote_addr", &remote_addr_str)) {
- ip_address_pton(remote_addr_str, &remote_addr);
+ if (ip_address_pton(remote_addr_str, &remote_addr) < 0) {
+ ERROR("Error parsing v6 remote addr");
+ goto ERR;
+ }
remote_addr_p = &remote_addr;
}
config_setting_t *overlay_v4 = config_setting_get_member(overlay, "ipv4");
if (overlay_v4) {
const char * local_addr_str, * remote_addr_str;
- ip_address_t local_addr, remote_addr;
+ ip_address_t local_addr = IP_ADDRESS_EMPTY;
+ ip_address_t remote_addr = IP_ADDRESS_EMPTY;
ip_address_t * local_addr_p = NULL;
ip_address_t * remote_addr_p = NULL;
int local_port = 0;
int remote_port = 0;
if (config_setting_lookup_string(overlay_v4, "local_addr", &local_addr_str)) {
- ip_address_pton(local_addr_str, &local_addr);
+ if (ip_address_pton(local_addr_str, &local_addr) < 0) {
+ ERROR("Error parsing v4 local addr");
+ goto ERR;
+ }
local_addr_p = &local_addr;
}
}
if (config_setting_lookup_string(overlay_v4, "remote_addr", &remote_addr_str)) {
- ip_address_pton(remote_addr_str, &remote_addr);
+ if (ip_address_pton(remote_addr_str, &remote_addr) < 0) {
+ ERROR("Error parsing v4 remote addr");
+ goto ERR;
+ }
remote_addr_p = &remote_addr;
}
config_setting_t *overlay_v6 = config_setting_get_member(overlay, "ipv6");
if (overlay_v6) {
const char * local_addr_str, * remote_addr_str;
- ip_address_t local_addr, remote_addr;
+ ip_address_t local_addr = IP_ADDRESS_EMPTY;
+ ip_address_t remote_addr = IP_ADDRESS_EMPTY;
ip_address_t * local_addr_p = NULL;
ip_address_t * remote_addr_p = NULL;
int local_port = 0;
int remote_port = 0;
if (config_setting_lookup_string(overlay_v6, "local_addr", &local_addr_str)) {
- ip_address_pton(local_addr_str, &local_addr);
+ if (ip_address_pton(local_addr_str, &local_addr) < 0) {
+ ERROR("Error parsing v6 local addr");
+ goto ERR;
+ }
local_addr_p = &local_addr;
}
}
if (config_setting_lookup_string(overlay_v6, "remote_addr", &remote_addr_str)) {
- ip_address_pton(remote_addr_str, &remote_addr);
+ if (ip_address_pton(remote_addr_str, &remote_addr) < 0) {
+ ERROR("Error parsing v6 remote addr");
+ goto ERR;
+ }
remote_addr_p = &remote_addr;
}