Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}