int dtcp_select_policy_set(struct dtcp * dtcp, const string_t * path, const string_t * name) { struct dtcp_config * cfg = dtcp->cfg; struct dtcp_ps *ps; int ret; if (path && strcmp(path, "")) { LOG_ERR("This component has no selectable subcomponents"); return -1; } ret = base_select_policy_set(&dtcp->base, &policy_sets, name); if (ret) { return ret; } /* Copy the connection parameter to the policy-set. From now on * these connection parameters must be accessed by the DTCP policy set, * and not from the struct connection. */ mutex_lock(&dtcp->base.ps_lock); ps = container_of(dtcp->base.ps, struct dtcp_ps, base); ps->flow_ctrl = dtcp_flow_ctrl(cfg); ps->rtx_ctrl = dtcp_rtx_ctrl(cfg); ps->flowctrl.window_based = dtcp_window_based_fctrl(cfg); ps->flowctrl.rate_based = dtcp_rate_based_fctrl(cfg); ps->flowctrl.sent_bytes_th = dtcp_sent_bytes_th(cfg); ps->flowctrl.sent_bytes_percent_th = dtcp_sent_bytes_percent_th(cfg); ps->flowctrl.sent_buffers_th = dtcp_sent_buffers_th(cfg); ps->flowctrl.rcvd_bytes_th = dtcp_rcvd_bytes_th(cfg); ps->flowctrl.rcvd_bytes_percent_th = dtcp_rcvd_bytes_percent_th(cfg); ps->flowctrl.rcvd_buffers_th = dtcp_rcvd_buffers_th(cfg); ps->rtx.max_time_retry = dtcp_max_time_retry(cfg); ps->rtx.data_retransmit_max = dtcp_data_retransmit_max(cfg); ps->rtx.initial_tr = dtcp_initial_tr(cfg); ps->flowctrl.window.max_closed_winq_length = dtcp_max_closed_winq_length(cfg); ps->flowctrl.window.initial_credit = dtcp_initial_credit(cfg); ps->flowctrl.rate.sending_rate = dtcp_sending_rate(cfg); ps->flowctrl.rate.time_period = dtcp_time_period(cfg); mutex_unlock(&dtcp->base.ps_lock); return ret; }
static int default_sender_inactivity_timer(struct dtp_ps * ps) { struct dtp * dtp = ps->dm; struct dt * dt; struct dtcp * dtcp; struct dtcp_ps * dtcp_ps; struct dtcp_config * cfg; seq_num_t max_sent, snd_rt_win, init_credit, next_send; LOG_DBG("default_sender_inactivity launched"); if (!dtp) return 0; dt = dtp_dt(dtp); if (!dt) return -1; dtcp = dt_dtcp(dt); if (!dtp) return -1; dt_sv_drf_flag_set(dt, true); dtp_initial_sequence_number(dtp); cfg = dtcp_config_get(dtcp); if (!cfg) return -1; rcu_read_lock(); dtcp_ps = dtcp_ps_get(dtcp); if (dtcp_ps->rtx_ctrl) { struct rtxq * q; q = dt_rtxq(dt); if (!q) { rcu_read_unlock(); LOG_ERR("Couldn't find the Retransmission queue"); return -1; } rtxq_flush(q); } if (dtcp_ps->flow_ctrl) { struct cwq * cwq; cwq = dt_cwq(dt); ASSERT(cwq); if (cwq_flush(cwq)) { rcu_read_unlock(); LOG_ERR("Coudln't flush cwq"); return -1; } dt_sv_window_closed_set(dt, false); } rcu_read_unlock(); init_credit = dtcp_initial_credit(cfg); max_sent = dtp_sv_max_seq_nr_sent(dtp); snd_rt_win = dtcp_snd_rt_win(dtcp); next_send = dtp_sv_last_nxt_seq_nr(dtp); LOG_DBG("Current values:\n\tinit_credit: %u " "max_sent: %u snd_rt_win: %u next_send: %u", init_credit, max_sent, snd_rt_win, next_send); dtcp_snd_rt_win_set(dtcp, next_send + init_credit); LOG_DBG("Resulting snd_rt_win_edge: %u", dtcp_snd_rt_win(dtcp)); /*FIXME: Missing sending the control ack pdu */ return 0; }