Esempio n. 1
0
/*
 * cdp periodic function 
 */
static uword
cdp_process (vlib_main_t * vm,
                    vlib_node_runtime_t * rt,
                    vlib_frame_t * f)
{
    cdp_main_t * cm = &cdp_main;
    f64 poll_time_remaining;
    uword event_type, * event_data = 0;

    /* So we can send events to the cdp process */
    cm->cdp_process_node_index = cdp_process_node.index;

    /* Dynamically register the cdp input node with the snap classifier */
    snap_register_input_protocol (vm, "cdp-input", 
                                  0xC /* ieee_oui, Cisco */,
                                  0x2000 /* protocol CDP */,
                                  cdp_input_node.index);

    snap_register_input_protocol (vm, "cdp-input", 
                                  0xC /* ieee_oui, Cisco */,
                                  0x2004 /* protocol CDP */,
                                  cdp_input_node.index);

#if 0 /* retain for reference */
    /* with the hdlc classifier */
    hdlc_register_input_protocol (vm, HDLC_PROTOCOL_cdp,
                                  cdp_input_node.index);
#endif

    /* with ethernet input (for SRP) */
    ethernet_register_input_type (vm, ETHERNET_TYPE_CDP /* CDP */,
				  cdp_input_node.index);

    poll_time_remaining = 10.0 /* seconds */;
    while (1) {
        /* sleep until next poll time, or msg serialize event occurs */
        poll_time_remaining = 
            vlib_process_wait_for_event_or_clock (vm, poll_time_remaining);
        
        event_type = vlib_process_get_events (vm, &event_data);
        switch (event_type) {
        case ~0:                /* no events => timeout */
            break;

        default:
            clib_warning ("BUG: event type 0x%wx", event_type);
            break;
        }
        if (event_data)
            _vec_len (event_data) = 0;

        /* peer timeout scan, send announcements */
        if (vlib_process_suspend_time_is_zero (poll_time_remaining)) {
            cdp_periodic (vm);
            poll_time_remaining = 10.0;
        }
    }

    return 0;
}
Esempio n. 2
0
static uword
send_dhcp6_pd_client_message_process (vlib_main_t * vm,
				      vlib_node_runtime_t * rt,
				      vlib_frame_t * f0)
{
  dhcp6_pd_client_main_t *cm = &dhcp6_pd_client_main;
  dhcp6_pd_client_state_t *client_state;
  uword *event_data = 0;
  f64 sleep_time = 1e9;
  f64 current_time;
  f64 due_time;
  f64 dt = 0;
  int i;

  while (true)
    {
      vlib_process_wait_for_event_or_clock (vm, sleep_time);
      vlib_process_get_events (vm, &event_data);
      vec_reset_length (event_data);

      current_time = vlib_time_now (vm);
      do
	{
	  due_time = current_time + 1e9;
	  for (i = 0; i < vec_len (cm->client_state_by_sw_if_index); i++)
	    {
	      client_state = &cm->client_state_by_sw_if_index[i];
	      if (!client_state->entry_valid)
		continue;
	      if (check_pd_send_client_message
		  (vm, client_state, current_time, &dt) && (dt < due_time))
		due_time = dt;
	    }
	  current_time = vlib_time_now (vm);
	}
      while (due_time < current_time);

      sleep_time = due_time - current_time;
    }

  return 0;
}
Esempio n. 3
0
static uword
perfmon_periodic_process (vlib_main_t * vm,
			  vlib_node_runtime_t * rt, vlib_frame_t * f)
{
  perfmon_main_t *pm = &perfmon_main;
  f64 now;
  uword *event_data = 0;
  uword event_type;
  int i;

  while (1)
    {
      if (pm->state == PERFMON_STATE_RUNNING)
	vlib_process_wait_for_event_or_clock (vm, pm->timeout_interval);
      else
	vlib_process_wait_for_event (vm);

      now = vlib_time_now (vm);

      event_type = vlib_process_get_events (vm, (uword **) & event_data);

      switch (event_type)
	{
	case PERFMON_START:
	  for (i = 0; i < vec_len (event_data); i++)
	    start_event (pm, now, event_data[i]);
	  break;

	  /* Handle timeout */
	case ~0:
	  handle_timeout (vm, pm, now);
	  break;

	default:
	  clib_warning ("Unexpected event %d", event_type);
	  break;
	}
      vec_reset_length (event_data);
    }
  return 0;			/* or not */
}