示例#1
0
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 ;
}
示例#2
0
/*
 * 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 */
}
示例#3
0
/*
 * 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
	     }			
	}
		
}