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