int flashProg( unsigned addr, unsigned length, void const *data ) { int rval = -1 ; if( VALID_ADDR(addr) ){ if( 0 == (addr&(FLASH_PAGE_SIZE-1)) ){ if( 0 == (length&(FLASH_PAGE_SIZE-1)) ){ rval = 0 ; while( 0 < length ){ int const lockbit = LOCK_BIT(addr); int const page = FLASH_PAGE(addr); if( EFC0->MC_FSR & (1<<(lockbit+16)) ){ DEBUGMSG( "unlock seg 0x" ); DEBUGHEXCHAR( lockbit ); DEBUGMSG( " here\n" ); EFC0->MC_FCR = (0x5A<<24)|(page<<8)|EFC_COMMAND_CLEARLOCKBIT ; while( 0 == (EFC0->MC_FSR & MC_FSR_FRDY) ) ; if( 0 != (EFC0->MC_FSR & (MC_FSR_LOCKE|MC_FSR_PROGE)) ){ rval = 4 ; break ; } } DEBUGMSG( "program 0x" ); DEBUGHEX( addr ); DEBUGMSG( " here\r\n" ); // fill the write buffer copyLongs( (unsigned long *)addr, (unsigned long *)data, FLASH_PAGE_SIZE/sizeof(unsigned long) ); // now program EFC0->MC_FCR = (0x5A<<24)|(page<<8)|EFC_COMMAND_WRITEPAGE ; // wait for completion while( 0 == (EFC0->MC_FSR & MC_FSR_FRDY) ) ; if( 0 != (EFC0->MC_FSR & (MC_FSR_LOCKE|MC_FSR_PROGE)) ){ rval = 5 ; break ; } length -= FLASH_PAGE_SIZE ; addr += FLASH_PAGE_SIZE ; data = ((char *)data) + FLASH_PAGE_SIZE ; } } else rval = 3 ; } else rval = 2 ; } else rval = 1 ; return rval ; }
/* * void igmprt_timer_group(igmp_router_t* router, igmp_interface_t *ifp) * * handle the groups timers for this router * */ void igmprt_timer_group(igmp_router_t* router,igmp_interface_t *ifp) { igmp_group_t *gp; struct ip_mreq mreq; struct in_addr group_addr; igmp_interface_t *ifp1; for(gp=ifp->igmpi_groups;gp;gp=gp->igmpg_next) { if ( gp->igmpg_addr.s_addr == inet_addr(IGMP_ALL_ROUTERS)) continue; /*decrement group timer*/ if (gp->igmpg_timer > 0) { --gp->igmpg_timer; } /*handle group timer*/ if (gp->igmpg_timer == 0){ group_addr.s_addr = gp->igmpg_addr.s_addr; igmp_group_cleanup(ifp,gp,router); igmp_info_print(router); /*Tell all upstream interfaces that we are gone */ for (ifp1 = router->igmprt_interfaces; ifp1; ifp1 = ifp1->igmpi_next){ if(ifp1->igmpi_type == UPSTREAM ) { mreq.imr_multiaddr.s_addr=group_addr.s_addr; mreq.imr_interface.s_addr=ifp1->igmpi_addr.s_addr; if (VALID_ADDR(mreq.imr_multiaddr)) { if (1) { if (setsockopt(router->igmprt_up_socket, IPPROTO_IP, IP_DROP_MEMBERSHIP, (void *) &mreq, sizeof(mreq)) < 0) { printf("perror:setsockopt - IP_DROP_MEMBERSHIP"); //exit(1); } } } } /*if UPSTREAM */ } /*for */ } /* if timer==0 */ } /* for groups */ }
/* * void igmp_group_handle_isex() * * Handle a is_ex{A} report for a group * the report have only one source */ void igmp_group_handle_isex( igmp_router_t* router, igmp_interface_t* ifp, igmp_group_t* gp, int numsrc, struct in_addr *sources) { igmp_src_t *src,*old_src_set; int i; membership_db* member; /* Reset timer */ gp->igmpg_timer = IGMP_GMI; /* 260 */ /* Do the v3 logic */ old_src_set=gp->igmpg_sources; if (gp->igmpg_fmode == IGMP_FMODE_EXCLUDE) { /* $6.4.1: State = Excl(X,Y), Report = IS_EX(A) */ for (i=0;i < numsrc;i++){ src=igmp_group_src_add(gp,sources[i]); /* (A-X-Y) = GMI */ if ((check_src_set(src->igmps_source,old_src_set) == FALSE) && (check_src(src->igmps_source,sources,numsrc) == TRUE)){ src->igmps_timer = IGMP_GMI; src->igmps_fstate = FALSE; } else /* delete ( X-A) delete (Y-A) */ if ((check_src(src->igmps_source,sources,numsrc) == FALSE) && (check_src_set(src->igmps_source,old_src_set) == TRUE)){ //eddie igmp_src_cleanup(gp,sr); //eddie k_proxy_del_mfc (router->igmprt_socket, sr->igmps_source.s_addr, gp->igmpg_addr.s_addr); } } } else { /* $6.4.1: State = Incl(X,Y), Report = IS_EX(A) */ for (i=0;i< numsrc; i++){ src=igmp_group_src_add(gp,sources[i]); if ((check_src_set(src->igmps_source,old_src_set) == FALSE) && (check_src(src->igmps_source,sources,numsrc) == TRUE)){ /*(B-A) = 0*/ src->igmps_timer = 0; }else{ if ((check_src(src->igmps_source,sources,numsrc) == FALSE) && (check_src_set(src->igmps_source,old_src_set) == TRUE)){ /* delete (A-B)*/ igmp_src_cleanup(gp,src); k_proxy_del_mfc (router->igmprt_socket, src->igmps_source.s_addr, gp->igmpg_addr.s_addr); } } } } gp->igmpg_fmode = IGMP_FMODE_EXCLUDE; /* Member Join from Downstream */ if (ifp->igmpi_type != UPSTREAM){ member = (membership_db*)update_multi(router,gp->igmpg_addr,gp->igmpg_fmode,numsrc,sources); if (VALID_ADDR(gp->igmpg_addr)) { k_proxy_chg_mfc(router->igmprt_socket, 0, gp->igmpg_addr.s_addr, ifp->igmpi_index,1); dbg_printf("(%s->%s(%d)) ifp->igmpi_name is %s, ifp->igmpi_index is %d\n", __FILE__, __FUNCTION__, __LINE__, ifp->igmpi_name, ifp->igmpi_index); //k_proxy_chg_mfc(router->igmprt_socket, sources[0].s_addr ,gp->igmpg_addr.s_addr,ifp->igmpi_index,1); // Added by Joshua } } }