Example #1
0
void process_new_gateway (
    lisp_addr_t         gateway,
    lispd_iface_elt     *iface )
{
    lisp_addr_t **gw_addr   = NULL;
    int         afi         = AF_UNSPEC;


    switch(gateway.afi) {
    case AF_INET:
        gw_addr = &(iface->ipv4_gateway);
        afi = AF_INET;
        break;
    case AF_INET6:
        gw_addr = &(iface->ipv6_gateway);
        afi = AF_INET6;
        break;
    default:
        return;
    }
    if (*gw_addr == NULL) { // The default gateway of this interface is not deffined yet
        *gw_addr = clone_lisp_addr(&gateway);
        if (*gw_addr == NULL) {
            free (*gw_addr);
            *gw_addr = NULL;
            return;
        }
    } else {
        copy_lisp_addr(*gw_addr,&gateway);
    }

    add_route(afi,iface->iface_index,NULL,NULL,*gw_addr,0,100,iface->iface_index);
}
Example #2
0
void process_new_gateway (
        lisp_addr_t         gateway,
        lispd_iface_elt     *iface )
{
    lisp_addr_t                 **gw_addr    = NULL;
    int                         afi          = AF_UNSPEC;
    lispd_mapping_list          *map_list    = NULL;


    switch(gateway.afi){
    case AF_INET:
        gw_addr = &(iface->ipv4_gateway);
        afi = AF_INET;
        iface->ipv4_changed = TRUE;
        break;
    case AF_INET6:
        gw_addr = &(iface->ipv6_gateway);
        afi = AF_INET6;
        iface->ipv6_changed = TRUE;
        break;
    default:
        return;
    }
    if (*gw_addr == NULL){ // The default gateway of this interface is not deffined yet
        *gw_addr = clone_lisp_addr(&gateway);
        if (*gw_addr == NULL){
            free (*gw_addr);
            *gw_addr = NULL;
            return;
        }
    }else{
        copy_lisp_addr(*gw_addr,&gateway);
    }
#ifndef VPNAPI
    add_route(afi,iface->iface_index,NULL,NULL,*gw_addr,0,100,iface->iface_index);
#endif

#ifdef VPNAPI
    if (iface->status != UP){
        lispd_log_msg(LISP_LOG_DEBUG_1,"process_new_gateway: Probably the interface %s is UP "
                "but we didn't receive netlink indicating this. Change %s status to UP",
                iface->iface_name,iface->iface_name);
        iface->status = UP;

        /*
         * If we don't have default control or output iface, recalculate it
         */

        if ((default_ctrl_iface_v4 == NULL && iface->ipv4_address->afi != AF_UNSPEC) ||
                (default_ctrl_iface_v6 == NULL && iface->ipv6_address->afi != AF_UNSPEC)){
            lispd_log_msg(LISP_LOG_DEBUG_2,"process_new_gateway: Recalculate new control interface");
            set_default_ctrl_ifaces();
        }

        if ((default_out_iface_v4 == NULL && iface->ipv4_address->afi != AF_UNSPEC) ||
                (default_out_iface_v6 == NULL && iface->ipv6_address->afi != AF_UNSPEC)){
            lispd_log_msg(LISP_LOG_DEBUG_2,"process_new_gateway: Recalculate new data interface");
            set_default_output_ifaces();
        }
    }

    if (gateway.afi == AF_INET){
        reset_socket(ipv4_data_input_fd);
        reset_socket(ipv4_control_input_fd);
    }else{
        reset_socket(ipv6_data_input_fd);
        reset_socket(ipv6_control_input_fd);
    }
#endif

    /* Check if the interface is behind NAT */

    if(nat_aware==TRUE){
        if (iface->status == UP && iface->ipv4_address != NULL){
            map_list = get_mappings_from_iface(iface);
            restart_info_request_process(map_list,iface->ipv4_address);
            free_mapping_list(map_list,FALSE);
        }
    }

    /* Reprograming SMR timer*/
    if (smr_timer == NULL){
        smr_timer = create_timer (SMR_TIMER);
    }
    start_timer(smr_timer, LISPD_SMR_TIMEOUT,(timer_callback)init_smr, NULL);

}