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; }
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; } }