int main(int args, char *argv[])
{
    int dfd = -1, i = 0, ret = -1, rlen = 0, wlen = 0;
    unsigned int pkt_len = sizeof(pkt_sample);
    unsigned long long tlen = 0;
    char role = 'T';
    char *ptr8 = NULL;
    unsigned char temp8, dmac[6] = DMAC_DFT;
    int loop_cnt = PKT_DFT_LOOP;
    
    printf("--------------- Trout board to board Tx/Rx test tool ---------------\n");
    printf("version: 1.00, created at %s.\n", __DATE__ ", " __TIME__);
    printf(" Author: Hugh\n\n");
    printf("--------------------------------------------------------------------\n");
    
    if(args < 2)
    {
        printf("too few argment!\n");
        printUsaging(argv[0]);
        return -1;
    }

    if(*argv[1] == 'T' || *argv[1] == 't') 
    {
        role = 'T';         //tx mode
    }
    else if(*argv[1] == 'R' || *argv[1] == 'r')
    {
        role = 'R';         //only rx mode
        if(*(argv[1] + 1) == '8')
            role = 'r';    //rx and tx mode.
    }
    else
    {
        printf("bad mode: %s\n", argv[1]);
        printUsaging(argv[0]);
        return -1;
    }
    
    if(role == 'T')
    {
        if(*(argv[1] + 1) =='8')
            role = 't';    //tx and rx mode.
        
        memcpy(dmac, &pkt_sample[16], 6);
        if(args >= 3)
        {
            //get dest mac address
            if(strlen(argv[2]) != (12+5))
            {
                printf("invalid dest mac length!\n");
                printUsaging(argv[0]);
                return -1;
            }
            
            if(strmac2hex(dmac, argv[2]) < 0)
            {
                printUsaging(argv[0]);
                return -1;
            }

            memcpy(&pkt_sample[4], dmac, 6);
        }

        //get tx loop count
        if(args >= 4)
        {
            loop_cnt = strtol(argv[3], NULL, 0);
            if(loop_cnt == 0)
            {
                printf("loop_cnt is 0! using default:%u.\n", PKT_DFT_LOOP);
                loop_cnt = PKT_DFT_LOOP;
            }
            else if(loop_cnt < 0)
            {
                loop_cnt = -1;
            }
        }
        
        //get packet length
        if(args >= 5)
        {
            pkt_len = strtoul(argv[4], NULL, 0);
            if(pkt_len < 84)
            {
                pkt_len = sizeof(pkt_sample);
                printf("pkt length is too short! using default:%u.\n", pkt_len);
            }
        }        
        
    }

    printf("device: %s\n", TROUT_DBG_DEV_NAME);
    if(role == 'T')
        printf("  mode: Tx only.\n");
    else if(role == 'R')
        printf("  mode: Rx only.\n");
    else if(role == 't')
        printf("  mode: Tx8Rx.\n");
    else if(role == 'r')
        printf("  mode: Rx8Tx.\n");
    else
    {
        printf("  mode: invalid mode!\n");
        return -1;
    }
    
    if(role == 'T' || role == 't')
    {
        printf("  dmac: %02x:%02x:%02x:%02x:%02x:%02x\n", dmac[0], dmac[1], dmac[2], dmac[3], dmac[4], dmac[5]);
//        printf("  smac: %02x:%02x:%02x:%02x:%02x:%02x\n", pkt_sample[10], pkt_sample[11], pkt_sample[12], pkt_sample[13], pkt_sample[14], pkt_sample[15]);
//        printf(" bssid: %02x:%02x:%02x:%02x:%02x:%02x\n", pkt_sample[4], pkt_sample[5], pkt_sample[6], pkt_sample[7], pkt_sample[8], pkt_sample[9]);
        printf("pktlen: %u\n", pkt_len);
        printf(" loops: %u\n", loop_cnt);
    }

    printf("open <%s> ... ", TROUT_DBG_DEV_NAME);
    
    dfd = open(TROUT_DBG_DEV_NAME, O_RDWR);
    if(dfd < 0)
    {
        printf("fail.\n");
        return -1;
    }
    
    printf("OK.\n");


    switch(role)
    {
        case 'T':
            ret = doTx(dfd, dmac, pkt_len, loop_cnt);
            if(ret < 0)
            {
                printf("Tx fail.\n");
            }
            else
            {
                printf("Tx ok.\n");
            }

            break;

        case 't':
            ret = doTx8Rx(dfd, dmac, pkt_len, loop_cnt);
            if(ret < 0)
            {
                printf("Tx8Rx fail.\n");
            }
            else
            {
                printf("Tx8Rx ok.\n");
            }
        
            break;
    
        case 'R':
            ret = doRx(dfd);
            if(ret < 0)
            {
                printf("Rx failed.\n");
            }
            else
            {
                printf("Rx ok.\n");
            }
        
            break;
        
        case 'r':
            ret = doRx8Tx(dfd);
            if(ret < 0)
            {
                printf("Rx8Tx fail.\n");
            }
            else
            {
                printf("Rx8Tx ok.\n");
            }
        
            break;
            
        default:
            printf("unknown role!\n");
            break;
    }

    close(dfd);
    
    printf("######### test end #########\n");

    return 0;
}
Example #2
0
static void mrp_update_state(mrp_event e, mrp_attribute_state *st, int four_packed_event)
{
#ifdef MRP_FULL_PARTICIPANT
  // Registrar state machine
  switch (e) 
    {
    case MRP_EVENT_BEGIN:
      st->registrar_state = MRP_MT;
      break;
    case MRP_EVENT_RECEIVE_NEW:
      if (st->registrar_state == MRP_LV) 
        stop_avb_timer(&st->leaveTimer);
      st->registrar_state = MRP_IN;
      st->pending_indications |= PENDING_JOIN_NEW;
      st->four_vector_parameter = four_packed_event;
      break;
    case MRP_EVENT_RECEIVE_JOININ:
    case MRP_EVENT_RECEIVE_JOINMT:
      if (st->registrar_state == MRP_LV)
        stop_avb_timer(&st->leaveTimer);
      if (st->registrar_state == MRP_MT) {
          st->pending_indications |= PENDING_JOIN;
          st->four_vector_parameter = four_packed_event;
      }
      st->registrar_state = MRP_IN;
      break;
    case MRP_EVENT_RECEIVE_LEAVE:
    case MRP_EVENT_RECEIVE_LEAVE_ALL:
    case MRP_EVENT_TX_LEAVE_ALL:
    case MRP_EVENT_REDECLARE:
      if (st->registrar_state == MRP_IN) {
        start_avb_timer(&st->leaveTimer, MRP_LEAVETIMER_PERIOD_CENTISECONDS);
        st->registrar_state = MRP_LV;
      }
      break;
    case MRP_EVENT_LEAVETIMER:
    case MRP_EVENT_FLUSH:
      if (st->registrar_state == MRP_LV) {
        // Lv
        st->pending_indications |= PENDING_LEAVE;
        st->four_vector_parameter = four_packed_event;
      }
      st->registrar_state = MRP_MT;
      break;
    default:
      break;
    }
#endif

  // Applicant state machine
  switch (e) 
    {
    case MRP_EVENT_BEGIN:
      st->applicant_state = MRP_VO;
      break;
    case MRP_EVENT_NEW:
      st->applicant_state = MRP_VN;
      break;
    case MRP_EVENT_JOIN:
      switch (st->applicant_state) 
        {
        case MRP_VO:
#ifdef MRP_FULL_PARTICIPANT
        case MRP_LO:
#endif
          st->applicant_state = MRP_VP;
          break;
        case MRP_LA:
          st->applicant_state = MRP_AA;
          break;
        case MRP_AO:
          st->applicant_state = MRP_AP;
          break;
        case MRP_QO:
          st->applicant_state = MRP_QP;
          break;      
        }
      break;
    case MRP_EVENT_LV:
      switch (st->applicant_state) 
        {
        case MRP_QP:
          st->applicant_state = MRP_QO;
          break;
        case MRP_AP:
          st->applicant_state = MRP_AO;
          break;
        case MRP_VP:
          st->applicant_state = MRP_VO;
          break;
        case MRP_VN:
        case MRP_AN:
        case MRP_AA:
        case MRP_QA:
          st->applicant_state = MRP_LA;
          break;
        }
      break;
    case MRP_EVENT_RECEIVE_JOININ:
      switch (st->applicant_state) 
        {
        case MRP_VO:
          st->applicant_state = MRP_AO;
          break;
        case MRP_VP:
          st->applicant_state = MRP_AP;
          break;
        case MRP_AA:
          st->applicant_state = MRP_QA;
          break;
        case MRP_AO:
          st->applicant_state = MRP_QO;
          break;
        case MRP_AP:
          st->applicant_state = MRP_QP;
          break;
        }
    case MRP_EVENT_RECEIVE_IN:
    	switch (st->applicant_state)
    	{
    	case MRP_AA:
    	  st->applicant_state = MRP_QA;
    	  break;
    	}
    case MRP_EVENT_RECEIVE_JOINMT:
    case MRP_EVENT_RECEIVE_MT:
      switch (st->applicant_state) 
        {
        case MRP_QA:
          st->applicant_state = MRP_AA;
          break;
        case MRP_QO:
          st->applicant_state = MRP_AO;
          break;
        case MRP_QP:
          st->applicant_state = MRP_AP;
          break;
#ifdef MRP_FULL_PARTICIPANT
        case MRP_LO:
          st->applicant_state = MRP_VO;
          break;
#endif
        }      
      break;
    case MRP_EVENT_RECEIVE_LEAVE:
    case MRP_EVENT_RECEIVE_LEAVE_ALL:
    case MRP_EVENT_REDECLARE:
      switch (st->applicant_state) 
        {
        case MRP_VO:
        case MRP_AO:
        case MRP_QO:
#ifdef MRP_FULL_PARTICIPANT
          st->applicant_state = MRP_LO;
#else
          st->applicant_state = MRP_VO;
#endif
          break;
        case MRP_AN:
          st->applicant_state = MRP_VN;
          break;
        case MRP_AA:
        case MRP_QA:
        case MRP_AP:
        case MRP_QP:
          st->applicant_state = MRP_VP;
          break;
        }      
      break;
    case MRP_EVENT_PERIODIC:
      switch (st->applicant_state) 
        {
        case MRP_QA:
          st->applicant_state = MRP_AA;
          break;
        case MRP_QP:
          st->applicant_state = MRP_AP;
          break;
        }
      break;
    case MRP_EVENT_TX: 
      switch (st->applicant_state) 
        {
        case MRP_VP:
        case MRP_VN:
        case MRP_AN:
        case MRP_AA:
        case MRP_LA:
        case MRP_AP:
#ifdef MRP_FULL_PARTICIPANT
        case MRP_LO:
#endif
          {
          int vector = makeTxEvent(e, st, 0);
          doTx(st, vector);
          break;
          }
        }
      switch (st->applicant_state) 
        {
        case MRP_VP:
          st->applicant_state = MRP_AA;
          break;
        case MRP_VN:
          st->applicant_state = MRP_AN;
          break;
        case MRP_AN:
        case MRP_AA:
        case MRP_AP:
          st->applicant_state = MRP_QA;
          break;
        case MRP_LA:
#ifdef MRP_FULL_PARTICIPANT
        case MRP_LO:
#endif
          st->applicant_state = MRP_VO;
          break;          
        }
      break;
#ifdef MRP_FULL_PARTICIPANT
    case MRP_EVENT_TX_LEAVE_ALL: {
      switch (st->applicant_state) 
        {
        case MRP_VP:
        case MRP_VN:
        case MRP_AN:
        case MRP_AA:
        case MRP_LA:
        case MRP_QA:
        case MRP_AP:
        case MRP_QP:
          {         
          int vector = makeTxEvent(e, st, 1);
          doTx(st, vector);
        }
        }
      switch (st->applicant_state) 
        {
        case MRP_VO:
        case MRP_LA:
        case MRP_AO:
        case MRP_QO:
          st->applicant_state = MRP_LO;
          break;
        case MRP_VN:
          st->applicant_state = MRP_AN;
          break;
        case MRP_AN:
        case MRP_AA:
        case MRP_AP:
        case MRP_QP:
          st->applicant_state = MRP_QA;
          break;
        }
      }
      break;
#endif
    default:
      break;
    }
}