Example #1
0
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;
}
Example #2
0
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);
    }
}
Example #3
0
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);
}
Example #4
0
/**
 * 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);
}
Example #5
0
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);
}
Example #6
0
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;
}
Example #7
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;
    }
}