diff --git a/src/algo_lightning.c b/src/algo_lightning.c index 0331860..c26c190 100644 --- a/src/algo_lightning.c +++ b/src/algo_lightning.c @@ -21,6 +21,25 @@ char* ooo_state_str[] = { "OOO_DONE" }; + +enum schedule_group_target { + SCHEDULE_BOTH = 0, + SCHEDULE_FAST = 1, + SCHEDULE_SLOW = 2 +}; + +int schedule_group_target_trans[] = { + SCHEDULE_BOTH, + SCHEDULE_SLOW, + SCHEDULE_FAST +}; + +char* schedule_group_target_str[] = { + "SCHEDULE_BOTH", + "SCHEDULE_FAST", + "SCHEDULE_SLOW" +}; + struct stat_entry { uint8_t link_id; int64_t max_ooo; @@ -53,6 +72,7 @@ struct light_ctx { uint8_t is_measlat; uint8_t explain; uint8_t disable_scheduler; + enum schedule_group_target sched_strat; }; void algo_lightning_free(void* v) { @@ -78,6 +98,7 @@ void algo_lightning_init(struct evt_core_ctx* ctx, struct algo_ctx* app_ctx, str lightc->pkt_sent_id = 1; lightc->uniq_pkt_sent_id = 1; lightc->disable_scheduler = 0; + lightc->sched_strat = SCHEDULE_BOTH; uint64_t window = 2000; if (ap->algo_specific_params != NULL) { @@ -93,6 +114,7 @@ void algo_lightning_init(struct evt_core_ctx* ctx, struct algo_ctx* app_ctx, str sscanf(token, "measlat=%d", &lightc->is_measlat); sscanf(token, "explain=%d", &lightc->explain); sscanf(token, "disable_scheduler=%d", &lightc->disable_scheduler); + sscanf(token, "tick_tock=%d", &lightc->sched_strat); } } @@ -114,6 +136,7 @@ void algo_lightning_init(struct evt_core_ctx* ctx, struct algo_ctx* app_ctx, str printf("measlat = %s\n", lightc->is_measlat ? "yes" : "no"); printf("explain = %s\n", lightc->explain ? "yes" : "no"); printf("disable_scheduler = %s\n", lightc->disable_scheduler ? "yes" : "no"); + printf("schedule_group_target = %s\n", schedule_group_target_str[lightc->sched_strat]); } void algo_lightning_pad(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo, struct buffer_packet* bp) { @@ -382,43 +405,49 @@ int algo_lightning_on_datagram(struct evt_core_ctx* ctx, struct evt_core_fdinfo* uint64_t now_timestamp = timespec_get_unit(&now, MILISEC); // Select fast link - sel_link_last = now; - lightc->selected_link = UINT8_MAX; - for (int i = 0; i < lightc->fast_count; i++) { - if (timespec_lt (&lightc->last[stats[i].link_id], &sel_link_last)) { - lightc->selected_link = stats[i].link_id; - sel_link_last = lightc->last[stats[i].link_id]; - } - } - send_message (ctx, bp); - if (lightc->csv) printf("%ld,%d,fast\n", now_timestamp, lightc->selected_link); - - // Tag packets for slow link - if (lightc->is_measlat) { - union abstract_packet* cur = ap; - while (cur != NULL) { - if (ap->fmt.headers.cmd != CMD_UDP_ENCAPSULATED) { - cur = ap_next(cur); - continue; + if (lightc->sched_strat == SCHEDULE_BOTH || lightc->sched_strat == SCHEDULE_FAST) { + sel_link_last = now; + lightc->selected_link = UINT8_MAX; + for (int i = 0; i < lightc->fast_count; i++) { + if (timespec_lt (&lightc->last[stats[i].link_id], &sel_link_last)) { + lightc->selected_link = stats[i].link_id; + sel_link_last = lightc->last[stats[i].link_id]; } - struct measure_packet *mp = (void*)&cur->fmt.content.udp_encapsulated.payload; - mp->flag = 1; - cur = ap_next(cur); } + send_message (ctx, bp); + if (lightc->csv) printf("%ld,%d,fast\n", now_timestamp, lightc->selected_link); } - // Select slow link - sel_link_last = now; - lightc->selected_link = UINT8_MAX; - for (int i = lightc->fast_count; i < lightc->total_links; i++) { - if (timespec_lt (&lightc->last[stats[i].link_id], &sel_link_last)) { - lightc->selected_link = stats[i].link_id; - sel_link_last = lightc->last[stats[i].link_id]; + if (lightc->sched_strat == SCHEDULE_BOTH || lightc->sched_strat == SCHEDULE_SLOW) { + // Tag packets for slow link + if (lightc->is_measlat) { + union abstract_packet* cur = ap; + while (cur != NULL) { + if (ap->fmt.headers.cmd != CMD_UDP_ENCAPSULATED) { + cur = ap_next(cur); + continue; + } + struct measure_packet *mp = (void*)&cur->fmt.content.udp_encapsulated.payload; + mp->flag = 1; + cur = ap_next(cur); + } } - } - send_message (ctx, bp); - if (lightc->csv) printf("%ld,%d,slow\n", now_timestamp, lightc->selected_link); + // Select slow link + sel_link_last = now; + lightc->selected_link = UINT8_MAX; + for (int i = lightc->fast_count; i < lightc->total_links; i++) { + if (timespec_lt (&lightc->last[stats[i].link_id], &sel_link_last)) { + lightc->selected_link = stats[i].link_id; + sel_link_last = lightc->last[stats[i].link_id]; + } + } + send_message (ctx, bp); + if (lightc->csv) printf("%ld,%d,slow\n", now_timestamp, lightc->selected_link); + } + + // Update our algo context + lightc->sched_strat = schedule_group_target_trans[lightc->sched_strat]; lightc->uniq_pkt_sent_id++; mv_buffer_rtof (&app_ctx->br, fdinfo); return 0;