avb_status_t avb_1722_1_adp_advertising_periodic(chanend c_tx, chanend ptp) { guid_t ptp_current; switch (adp_advertise_state) { case ADP_ADVERTISE_IDLE: break; case ADP_ADVERTISE_WAITING: if (avb_timer_expired(&adp_readvertise_timer)) { adp_advertise_state = ADP_ADVERTISE_ADVERTISE_1; } break; case ADP_ADVERTISE_ADVERTISE_0: avb_1722_1_adp_change_ptp_grandmaster(ptp_current.c); start_avb_timer(&ptp_monitor_timer, 1); //Every second adp_advertise_state = ADP_ADVERTISE_ADVERTISE_1; // Fall through and send immediately case ADP_ADVERTISE_ADVERTISE_1: avb_1722_1_create_adp_packet(ENTITY_AVAILABLE, my_guid); mac_tx(c_tx, avb_1722_1_buf, AVB_1722_1_ADP_PACKET_SIZE, ETH_BROADCAST); start_avb_timer(&adp_readvertise_timer, AVB_1722_1_ADP_REPEAT_TIME); adp_advertise_state = ADP_ADVERTISE_WAITING; avb_1722_1_available_index++; break; case ADP_ADVERTISE_DEPARTING: avb_1722_1_create_adp_packet(ENTITY_DEPARTING, my_guid); mac_tx(c_tx, avb_1722_1_buf, AVB_1722_1_ADP_PACKET_SIZE, ETH_BROADCAST); adp_advertise_state = ADP_ADVERTISE_IDLE; avb_1722_1_available_index = 0; break; default: break; } if (ADP_ADVERTISE_IDLE != adp_advertise_state) { if(avb_timer_expired(&ptp_monitor_timer)) { ptp_get_current_grandmaster(ptp, ptp_current.c); if(as_grandmaster_id.l != ptp_current.l) { avb_1722_1_adp_change_ptp_grandmaster(ptp_current.c); adp_advertise_state = ADP_ADVERTISE_ADVERTISE_1; } start_avb_timer(&ptp_monitor_timer, 1); //Every second } } return AVB_NO_STATUS; }
void acmp_progress_inflight_timer(int entity_type) { if (avb_timer_expired(&acmp_inflight_timer[entity_type])) { acmp_centisecond_counter[entity_type]++; start_avb_timer(&acmp_inflight_timer[entity_type], 1); } }
void avb_1722_1_adp_init() { init_avb_timer(&adp_advertise_timer, 1); init_avb_timer(&adp_readvertise_timer, 100); init_avb_timer(&adp_discovery_timer, 200); init_avb_timer(&ptp_monitor_timer, 100); adp_discovery_state = ADP_DISCOVERY_WAITING; start_avb_timer(&adp_discovery_timer, 1); }
/** * Initialises ACMP state machines, data structures and timers. * * Must be called before any other ACMP function. */ void avb_1722_1_acmp_controller_init() { acmp_controller_state = ACMP_CONTROLLER_WAITING; memset(acmp_controller_inflight_commands, 0, sizeof(avb_1722_1_acmp_inflight_command) * AVB_1722_1_MAX_INFLIGHT_COMMANDS); sequence_id[CONTROLLER] = 0; init_avb_timer(&acmp_inflight_timer[CONTROLLER], 10); acmp_centisecond_counter[CONTROLLER] = 0; start_avb_timer(&acmp_inflight_timer[CONTROLLER], 1); }
void avb_1722_1_acmp_listener_init() { int i; acmp_listener_state = ACMP_LISTENER_WAITING; memset(acmp_listener_inflight_commands, 0, sizeof(avb_1722_1_acmp_inflight_command) * AVB_1722_1_MAX_INFLIGHT_COMMANDS); for (i = 0; i < AVB_1722_1_MAX_LISTENERS; i++) acmp_zero_listener_stream_info(i); sequence_id[LISTENER] = 0; init_avb_timer(&acmp_inflight_timer[LISTENER], 10); acmp_centisecond_counter[LISTENER] = 0; start_avb_timer(&acmp_inflight_timer[LISTENER], 1); }
avb_status_t avb_1722_1_adp_discovery_periodic(chanend c_tx) { switch (adp_discovery_state) { case ADP_DISCOVERY_IDLE: break; case ADP_DISCOVERY_WAITING: { unsigned lost=0; if (avb_timer_expired(&adp_discovery_timer)) { adp_two_second_counter++; lost = avb_1722_1_entity_database_check_timeout(); start_avb_timer(&adp_discovery_timer, 1); } return (lost > 0) ? AVB_1722_1_ENTITY_REMOVED : AVB_NO_STATUS; } case ADP_DISCOVERY_DISCOVER: { avb_1722_1_create_adp_packet(ENTITY_DISCOVER, discover_guid); mac_tx(c_tx, avb_1722_1_buf, AVB_1722_1_ADP_PACKET_SIZE, ETH_BROADCAST); adp_discovery_state = ADP_DISCOVERY_WAITING; break; } case ADP_DISCOVERY_ADDED: { adp_discovery_state = ADP_DISCOVERY_WAITING; return AVB_1722_1_ENTITY_ADDED; } case ADP_DISCOVERY_REMOVED: { adp_discovery_state = ADP_DISCOVERY_WAITING; return AVB_1722_1_ENTITY_REMOVED; } } return AVB_NO_STATUS; }
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; } }