INT4 add_flow_entry(gn_switch_t *sw, gn_flow_t *flow) { uuid_t uuid_gen; if(sw->conn_state == INITSTATE) { return GN_ERR; } pthread_mutex_lock(&sw->flow_entry_mutex); if(NULL == find_flow_entry(sw, flow)) { uuid_generate_random(uuid_gen); uuid_unparse(uuid_gen, flow->uuid); gn_flow_t *p_new_flow = copy_flow_entry(flow); if(0 != p_new_flow) { p_new_flow->status = ENTRY_ENABLED; if(sw->flow_entries) { gn_flow_t *p_flow = sw->flow_entries; while(p_flow->next) { p_flow = p_flow->next; }; p_flow->next = p_new_flow; p_new_flow->prev = p_flow; } else { sw->flow_entries = p_new_flow; } } } else { pthread_mutex_unlock(&sw->flow_entry_mutex); return GN_OK; } pthread_mutex_unlock(&sw->flow_entry_mutex); return GN_OK; }
INT4 add_flow_entry(gn_switch_t *sw, gn_flow_t *flow) { uuid_t uuid_gen; if(sw->state == 0) { return GN_ERR; } pthread_mutex_lock(&sw->flow_entry_mutex); if(NULL == find_flow_entry(sw, flow)) { uuid_generate_random(uuid_gen); uuid_unparse(uuid_gen, flow->uuid); if(sw->flow_entries) { gn_flow_t *p_flow = sw->flow_entries; while(p_flow->next) { p_flow = p_flow->next; }; p_flow->next = flow; } else { flow->prev = NULL; flow->next = NULL; sw->flow_entries = flow; } } else { pthread_mutex_unlock(&sw->flow_entry_mutex); return GN_ERR; } flow->status = ENTRY_DISABLED; pthread_mutex_unlock(&sw->flow_entry_mutex); return GN_OK; }
INT4 flow_entry_timeout(gn_switch_t *sw, gn_flow_t *flow) { pthread_mutex_lock(&sw->flow_entry_mutex); gn_flow_t *p_flow = find_flow_entry(sw, flow); if(p_flow) { p_flow->status = ENTRY_TIMEOUT; if(NULL == p_flow->prev) { sw->flow_entries = p_flow->next; } else { p_flow->prev->next = p_flow->next; } //delete flow entry from list if(p_flow->next) { p_flow->next->prev = p_flow->prev; } if(p_flow->prev) { p_flow->prev->next = p_flow->next; } else { sw->flow_entries = p_flow->next; } //recycle the memory gn_flow_free(p_flow); } pthread_mutex_unlock(&sw->flow_entry_mutex); return GN_OK; }