Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}