예제 #1
0
파일: proxy.c 프로젝트: Windeal/improxy
static void sig_usr1_handler()
{
    imp_interface* p_if;
    for(p_if = imp_interface_first();p_if;p_if = LIST_NEXT(p_if, link))
    {
        if(p_if->type == INTERFACE_UPSTREAM)
            continue;
        imp_group_print(p_if);
    }
    imp_membership_db_print_all();
}
예제 #2
0
파일: handler.c 프로젝트: nskeeper/improxy
void mcast_allow_handler(imp_interface *p_if, pi_addr *p_ga,
     pa_list* p_src_list, im_version version)
{
    imp_group *p_gp = NULL;
    pa_list   *p_node = NULL;;

    p_gp = imp_group_find(p_if, p_ga);
    if (p_gp != NULL) {

        imp_source  *p_is = NULL, *p_is_next = NULL;

        if (p_gp->version < version && version == IM_IGMPv3_MLDv2) {

            IMP_LOG_INFO("Group %s Group Compatibility Mode" \
                "is lesser than IGMPV3\n", imp_pi_ntoa(&p_gp->group_addr));
            return;
        }

        /*update version timer*/
        imp_group_version_timer_update(p_gp, version);

        if(p_gp->type == GROUP_INCLUDE) {

            /*INCLUDE (A)    ALLOW (B)      INCLUDE (A+B)           (B)=GMI*/

            for (p_node = p_src_list ;p_node; p_node = p_node->next ){

                p_is = imp_source_find(p_gp, &p_node->addr, FORWARDING);
                if (p_is == NULL) {

                    imp_source_create(p_gp, &p_node->addr, FORWARDING);
                } else {

                    imp_set_timer(TIMER_GMI, p_is->timer);
                }
            }

        } else {
            /*EXCLUDE (X, Y)  ALLOW (A)    EXCLUDE (X+A, Y-A)       (A)=GMI*/

            for (p_node = p_src_list ;p_node; p_node = p_node->next ){

                p_is = imp_source_find(p_gp, &p_node->addr, FORWARDING);
                if (p_is == NULL) {

                    imp_source_create(p_gp, &p_node->addr, FORWARDING);
                } else {

                    imp_set_timer(TIMER_GMI, p_is->timer);
                }
            }

             for(p_is = LIST_FIRST(&p_gp->src_list); p_is;
                p_is = p_is_next) {

                p_is_next = LIST_NEXT(p_is, link);
                if (!TIMEVAL_ISZERO(p_is->timer->tm))
                    continue;

                if( pa_list_find(p_src_list, &p_is->src_addr) != NULL)
                    imp_source_cleanup(p_is);
            }


         }
        return;
    }

    imp_group_print(p_if);
}
예제 #3
0
파일: handler.c 프로젝트: nskeeper/improxy
void mcast_is_ex_hander(imp_interface *p_if, pi_addr *p_ga,
    pa_list* p_src_list, im_version version)
{
    imp_group *p_gp = NULL;
    pa_list *p_node = NULL;;


    p_gp = imp_group_find(p_if, p_ga);
    if (p_gp != NULL) {

        if (p_gp->version < version && version == IM_IGMPv3_MLDv2) {

            IMP_LOG_INFO("Group %s Group Compatibility Mode" \
                "is lesser than IGMPV3\n", imp_pi_ntoa(&p_gp->group_addr));
            return;
        }

        /*update version timer*/
        imp_group_version_timer_update(p_gp, version);

        if(p_gp->type == GROUP_INCLUDE) {
            /* Router State   Report Rec'd  New Router State     Actions
             * ------------   ------------  ----------------     -------
             *  INCLUDE (A)    IS_EX (B)     EXCLUDE (A*B, B-A)   (B-A)=0
             *                                                    Delete (A-B)
             *                                                    Group Timer=GMI
             */

            imp_source  *p_is = NULL, *p_is_next = NULL;

            for (p_is = LIST_FIRST(&p_gp->src_list); p_is ;
                    p_is = p_is_next) {

                p_is_next = LIST_NEXT(p_is, link);
                if(pa_list_find(p_src_list, &p_is->src_addr) == NULL) {
                    /*Delete (A-B)*/
                    imp_source_cleanup(p_is);
                }
            }

            for(p_node = p_src_list; p_node; p_node = p_node->next) {

                if (imp_source_find(p_gp, &p_node->addr, FORWARDING) == NULL){
                    /*(B-A)=0*/
                    imp_source_create(p_gp, &p_node->addr, BLOCKING);/*forward or not*/
                }
            }

            p_gp->type = GROUP_EXCLUDE;


            p_gp->timer = imp_add_timer(group_timer_handler, p_gp);
            /*Group Timer=GMI*/
            imp_set_timer(TIMER_GMI, p_gp->timer);

        } else {

            /*  Router State   Report Rec'd  New Router State   Actions
                *  ------------   ------------  ----------------   -------
             *  EXCLUDE (X, Y)  IS_EX (A)     EXCLUDE (A-Y, Y*A)    (A-X-Y)=GMI
             *                                                    Delete (X-A)
             *                                                    Delete (Y-A)
             *                                                    Group Timer=GMI
             */
            imp_source  *p_is = NULL, *p_is_next = NULL;

            for (p_is = LIST_FIRST(&p_gp->src_list); p_is ;
                    p_is = p_is_next) {

                p_is_next = LIST_NEXT(p_is, link);

                if(TIMEVAL_ISZERO(p_is->timer->tm))
                    continue;
                /*Delete (X-A)*/
                if(pa_list_find(p_src_list, &p_is->src_addr) == NULL) {
                    imp_source_cleanup(p_is);
                }
            }


            for (p_is = LIST_FIRST(&p_gp->src_list); p_is ;
                    p_is = p_is_next) {

                p_is_next = LIST_NEXT(p_is, link);

                if(!TIMEVAL_ISZERO(p_is->timer->tm))
                    continue;

                /*Delete (Y-A)*/
                if(pa_list_find(p_src_list, &p_is->src_addr) == NULL) {
                    imp_source_cleanup(p_is);
                }
            }

            for(p_node = p_src_list; p_node; p_node = p_node->next) {

                if (imp_source_find(p_gp, &p_node->addr, BLOCKING) == NULL
                    && imp_source_find(p_gp, &p_node->addr, FORWARDING) == NULL){
                    /*(A-X-Y)=GMI*/
                    imp_source_create(p_gp, &p_node->addr, FORWARDING);/*forward or not*/
                }
            }

            /*Group Timer=GMI*/
            imp_set_timer(TIMER_GMI, p_gp->timer);

        }

        return;
    }

    p_gp = imp_group_create(p_if, p_ga, p_src_list, GROUP_EXCLUDE, version);

    if (p_gp == NULL) {
        IMP_LOG_ERROR("imp_group_create failed");
        return;
    }


    imp_group_print(p_if);
    return;

}
예제 #4
0
파일: handler.c 프로젝트: nskeeper/improxy
void mcast_to_in_handler(imp_interface *p_if, pi_addr *p_ga,
     pa_list* p_src_list, im_version version)
{
    imp_group     *p_gp;
    pa_list  *p_node = NULL;
    struct timeval lmqt;

    imp_time_val(TIMER_LMQT, &lmqt);

    p_gp = imp_group_find(p_if, p_ga);
    if (p_gp != NULL) {


        IMP_LOG_DEBUG("Leave Group %s\n", imp_pi_ntoa(p_ga));

        if (p_gp->version < version) {

            IMP_LOG_WARNING("%s's Group Compatibility Mode is IGMPv1.\n",
                imp_pi_ntoa(p_ga));
        return;
        }

        if (p_gp->type == GROUP_INCLUDE) {

            /*INCLUDE (A)    TO_IN (B)    INCLUDE (A+B)           (B)=GMI
                                                                  Send Q(G, A-B)
            */
            imp_source  *p_is = NULL;

            for (p_is = LIST_FIRST(&p_gp->src_list); p_is;
                p_is = LIST_NEXT(p_is, link)) {

                if (pa_list_find(p_src_list, &p_is->src_addr) == NULL) {

                    /* Send Q(G, A-B)*/
                    if(TIMEVAL_LT(lmqt, p_is->timer->tm)) {
                        p_is->times = DEFAULT_RV;
                        imp_set_timer(TIMER_LMQT, p_is->timer);
                    }
                } else {

                    imp_set_timer(TIMER_GMI, p_is->timer);
                }

            }

            for(p_node = p_src_list; p_node; p_node = p_node->next) {

                if (imp_source_find(p_gp, &p_node->addr, FORWARDING) == NULL){

                    imp_source_create(p_gp, &p_node->addr, FORWARDING);/*forward*/
                }
            }


        } else {

            /*EXCLUDE (X, Y)  TO_IN (A)    EXCLUDE (X+A, Y-A)     (A)=GMI
             *                                                  Send Q(G, X-A)
             *                                                  Send Q(G)
             */
            imp_source  *p_is = NULL, *p_is_next = NULL;

            /*Y-A*/
            for (p_is = LIST_FIRST(&p_gp->src_list); p_is;
                p_is = p_is_next) {

                p_is_next = LIST_NEXT(p_is, link);

                if(!TIMEVAL_ISZERO(p_is->timer->tm))
                    continue;

                if (pa_list_find(p_src_list, &p_is->src_addr) != NULL) {

                    imp_source_cleanup(p_is);
                }
            }

            for (p_is = LIST_FIRST(&p_gp->src_list); p_is;
                p_is = LIST_NEXT(p_is, link)) {

                if(TIMEVAL_ISZERO(p_is->timer->tm))
                    continue;

                if (pa_list_find(p_src_list, &p_is->src_addr) == NULL) {
                    /*Send Q(G, X-A)*/
                    if(TIMEVAL_LT(lmqt, p_is->timer->tm)) {
                        p_is->times = DEFAULT_RV;
                        imp_set_timer(TIMER_LMQT, p_is->timer);
                    }
                } else {

                    imp_set_timer(TIMER_GMI, p_is->timer);
                }

            }

            for(p_node = p_src_list; p_node; p_node = p_node->next) {

                if (imp_source_find(p_gp, &p_node->addr, FORWARDING) == NULL){

                    imp_source_create(p_gp, &p_node->addr, FORWARDING);/*forward*/
                }
            }

            /*Send Q(G)*/
            if(p_gp->gs_sch_times == 0) {
                IMP_LOG_DEBUG("Send Q(G)\n");
                p_gp->gs_sch_times = DEFAULT_RV;
                imp_set_timer(TIMER_LMQT, p_gp->timer);
            }
        }

        if(p_gp->sch_timer == NULL) {

            p_gp->sch_timer = imp_add_timer(
                                group_source_specific_timer_handler, p_gp);
            imp_set_timer(0, p_gp->sch_timer);
        }

        return;
    }

    if(p_src_list == NULL)
        return;

    IMP_LOG_DEBUG("Can't find group %s, will create it\n", imp_pi_ntoa(p_ga));
    p_gp = imp_group_create(p_if, p_ga, p_src_list, GROUP_INCLUDE, version);
    if (p_gp == NULL) {
        IMP_LOG_ERROR("imp_group_create failed");
        return;
    }

    imp_group_print(p_if);

}
예제 #5
0
파일: handler.c 프로젝트: nskeeper/improxy
void mcast_to_ex_hander(imp_interface *p_if, pi_addr *p_ga,
     pa_list* p_src_list, im_version version)
{
    imp_group *p_gp = NULL;
    pa_list *p_node = NULL;;

    p_gp = imp_group_find(p_if, p_ga);
    if (p_gp != NULL) {

        imp_source     *p_is = NULL, *p_is_next = NULL;
        int             enable_sch = 0;
        struct timeval  lmqt;

        imp_time_val(TIMER_LMQT, &lmqt);

        if (p_gp->version < version && version == IM_IGMPv3_MLDv2) {

            IMP_LOG_INFO("Group %s Group Compatibility Mode" \
                "is lesser than IGMPV3\n", imp_pi_ntoa(&p_gp->group_addr));
            return;
        }

        /*update version timer*/
        imp_group_version_timer_update(p_gp, version);


        if(p_gp->type == GROUP_INCLUDE) {
            /* Router State   Report Rec'd  New Router State     Actions
             * ------------   ------------  ----------------     -------
             *  INCLUDE (A)    TO_EX (B)    EXCLUDE (A*B, B-A)   (B-A)=0
             *                                                    Send Q(G, A*B)
             *                                                    Delete (A-B)
             *                                                    Group Timer=GMI
             */


            for (p_is = LIST_FIRST(&p_gp->src_list); p_is ;
                    p_is = p_is_next) {

                p_is_next = LIST_NEXT(p_is, link);
                if(pa_list_find(p_src_list, &p_is->src_addr) == NULL) {

                    /*Delete (A-B)*/
                    imp_source_cleanup(p_is);
                } else if(TIMEVAL_LT(lmqt, p_is->timer->tm)) {

                    /*Send Q(G, A*B)*/
                    imp_set_timer(TIMER_LMQT, p_is->timer);
                    p_is->times = DEFAULT_RV;
                    enable_sch = 1;
                }
            }

            for(p_node = p_src_list; p_node; p_node = p_node->next) {

                if (imp_source_find(p_gp, &p_node->addr, FORWARDING) == NULL){

                    /*(B-A)=0*/
                    imp_source_create(p_gp, &p_node->addr, BLOCKING);/*forward or not*/
                }
            }

            p_gp->type = GROUP_EXCLUDE;

            p_gp->timer = imp_add_timer(group_timer_handler, p_gp);
            /*Group Timer=GMI*/
            imp_set_timer(TIMER_GMI, p_gp->timer);

        } else {

            /*  Router State   Report Rec'd  New Router State   Actions
                *  ------------   ------------  ----------------   -------
             *  EXCLUDE (X, Y)  TO_EX (A)     EXCLUDE (A-Y, Y*A)    (A-X-Y)=Group Timer
             *                                                    Delete (X-A)
             *                                                    Delete (Y-A)
             *                                                    Send Q(G, A-Y)
             *                                                    Group Timer=GMI
             */

            for (p_is = LIST_FIRST(&p_gp->src_list); p_is ;
                    p_is = p_is_next) {

                p_is_next = LIST_NEXT(p_is, link);

                if(TIMEVAL_ISZERO(p_is->timer->tm))
                    continue;
                if(pa_list_find(p_src_list, &p_is->src_addr) == NULL) {

                    /*Delete (X-A)*/
                    imp_source_cleanup(p_is);
                } else if(TIMEVAL_LT(lmqt, p_is->timer->tm)) {

                    /*Send Q(G, A-Y)*/
                    imp_set_timer(TIMER_LMQT, p_is->timer);
                    p_is->times = DEFAULT_RV;
                    enable_sch = 1;
                }
            }


            for (p_is = LIST_FIRST(&p_gp->src_list); p_is ;
                    p_is = p_is_next) {

                p_is_next = LIST_NEXT(p_is, link);
                if(!TIMEVAL_ISZERO(p_is->timer->tm))
                    continue;
                /*Delete (Y-A)*/
                if(pa_list_find(p_src_list, &p_is->src_addr) == NULL) {
                    imp_source_cleanup(p_is);
                }
            }

            for(p_node = p_src_list; p_node; p_node = p_node->next) {

                if (imp_source_find(p_gp, &p_node->addr, BLOCKING) == NULL
                    && imp_source_find(p_gp, &p_node->addr, FORWARDING) == NULL){
                    /*(A-X-Y)=Group Timer*/
                    p_is = imp_source_create(p_gp, &p_node->addr, FORWARDING);/*forward or not*/
                    memcpy(&p_is->timer->tm, &p_gp->timer->tm, sizeof(struct timeval));

                    if(TIMEVAL_LT(lmqt, p_is->timer->tm)) {

                        imp_set_timer(TIMER_LMQT, p_is->timer);
                        p_is->times = DEFAULT_RV;
                        enable_sch = 1;
                    }
                }
            }

            /*Group Timer=GMI*/
            imp_set_timer(TIMER_GMI, p_gp->timer);

        }

        if(enable_sch && p_gp->sch_timer == NULL) {

            p_gp->sch_timer = imp_add_timer(group_source_specific_timer_handler, p_gp);
            imp_set_timer(0, p_gp->sch_timer);
        }

        imp_membership_db_update(p_ga);

        return;
    }

    p_gp = imp_group_create(p_if, p_ga, p_src_list, GROUP_EXCLUDE, version);

    if (p_gp == NULL) {
        IMP_LOG_ERROR("imp_group_create failed");
        return;
    }

    imp_membership_db_update(p_ga);
    imp_group_print(p_if);

}