Esempio n. 1
0
File: serdes.c Progetto: msune/irati
static int serialize_fc_pci(const struct serdes * instance,
                            char *                data,
                            const struct pci *    pci,
                            int                   offset)
{
        seq_num_t        seq;
        struct dt_cons * dt_cons;

        ASSERT(instance);
        ASSERT(data);
        ASSERT(pci);
        ASSERT(offset);

        dt_cons = instance->dt_cons;
        ASSERT(dt_cons);

        /*
         * Not filling in rate-based fields for now
         * since they are not defined as a type either
         * Add them when needed
         */
        seq = pci_control_new_rt_wind_edge(pci);
        memcpy(data + offset, &seq, dt_cons->seq_num_length);
        offset += dt_cons->seq_num_length;

        seq = pci_control_my_left_wind_edge(pci);
        memcpy(data + offset, &seq, dt_cons->seq_num_length);
        offset += dt_cons->seq_num_length;

        seq = pci_control_my_rt_wind_edge(pci);
        memcpy(data + offset, &seq, dt_cons->seq_num_length);

        return 0;
}
Esempio n. 2
0
static int rcv_flow_ctl(struct dtcp * dtcp,
                        struct pdu *  pdu)
{
        struct pci * pci;

        ASSERT(dtcp);
        ASSERT(pdu);

        pci = pdu_pci_get_rw(pdu);
        ASSERT(pci);

        snd_rt_wind_edge_set(dtcp, pci_control_new_rt_wind_edge(pci));
        push_pdus_rmt(dtcp);

        pdu_destroy(pdu);
        return 0;
}
Esempio n. 3
0
File: serdes.c Progetto: msune/irati
static int serialize_cc_pci(const struct serdes * instance,
                            char *                data,
                            const struct pci *    pci,
                            int                   offset)
{
        seq_num_t        seq;
        struct dt_cons * dt_cons;

        ASSERT(instance);
        ASSERT(data);
        ASSERT(pci);
        ASSERT(offset);

        dt_cons = instance->dt_cons;
        ASSERT(dt_cons);

        seq = pci_control_last_seq_num_rcvd(pci);
        memcpy(data + offset, &seq, CTRL_SEQ_NR);

        seq = pci_control_new_left_wind_edge(pci);
        memcpy(data + offset, &seq, dt_cons->seq_num_length);
        offset += dt_cons->seq_num_length;

        seq = pci_control_new_rt_wind_edge(pci);
        memcpy(data + offset, &seq, dt_cons->seq_num_length);
        offset += dt_cons->seq_num_length;

        seq = pci_control_my_left_wind_edge(pci);
        memcpy(data + offset, &seq, dt_cons->seq_num_length);
        offset += dt_cons->seq_num_length;

        seq = pci_control_my_rt_wind_edge(pci);
        memcpy(data + offset, &seq, dt_cons->seq_num_length);
        offset += dt_cons->seq_num_length;

        /* Add MyRcvRate here in the future */

        return 0;
}
Esempio n. 4
0
static int rcv_ack_and_flow_ctl(struct dtcp * dtcp,
                                struct pdu *  pdu)
{
        struct dtcp_ps * ps;
        seq_num_t        seq;
        struct pci *     pci;

        ASSERT(dtcp);

        pci = pdu_pci_get_rw(pdu);
        ASSERT(pci);

        LOG_DBG("Updating Window Edges for DTCP: %pK", dtcp);

        seq = pci_control_ack_seq_num(pci);

        rcu_read_lock();
        ps = container_of(rcu_dereference(dtcp->base.ps),
                          struct dtcp_ps, base);
        /* This updates sender LWE */
        if (ps->sender_ack(ps, seq))
                LOG_ERR("Could not update RTXQ and LWE");
	if (ps->rtx_ctrl && ps->rtt_estimator)
        	ps->rtt_estimator(ps, pci_control_ack_seq_num(pci));
        rcu_read_unlock();

        snd_rt_wind_edge_set(dtcp, pci_control_new_rt_wind_edge(pci));
        LOG_DBG("Right Window Edge: %u", snd_rt_wind_edge(dtcp));

        LOG_DBG("Calling CWQ_deliver for DTCP: %pK", dtcp);
        push_pdus_rmt(dtcp);

        /* FIXME: Verify values for the receiver side */
        LOG_DBG("DTCP received ACK-FC (CPU: %d)", smp_processor_id());
        dump_we(dtcp, pci);

        pdu_destroy(pdu);
        return 0;
}
Esempio n. 5
0
void dump_we(struct dtcp * dtcp, struct pci *  pci)
{
        struct dtp * dtp;
        seq_num_t    snd_rt_we;
        seq_num_t    snd_lf_we;
        seq_num_t    rcv_rt_we;
        seq_num_t    rcv_lf_we;
        seq_num_t    new_rt_we;
        seq_num_t    new_lf_we;
        seq_num_t    pci_seqn;
        seq_num_t    my_rt_we;
        seq_num_t    my_lf_we;
        seq_num_t    ack;

        ASSERT(dtcp);
        ASSERT(pci);

        dtp = dt_dtp(dtcp->parent);
        ASSERT(dtp);

        snd_rt_we = snd_rt_wind_edge(dtcp);
        snd_lf_we = dtcp_snd_lf_win(dtcp);
        rcv_rt_we = rcvr_rt_wind_edge(dtcp);
        rcv_lf_we = dt_sv_rcv_lft_win(dtcp->parent);
        new_rt_we = pci_control_new_rt_wind_edge(pci);
        new_lf_we = pci_control_new_left_wind_edge(pci);
        my_lf_we  = pci_control_my_left_wind_edge(pci);
        my_rt_we  = pci_control_my_rt_wind_edge(pci);
        pci_seqn  = pci_sequence_number_get(pci);
        ack       = pci_control_ack_seq_num(pci);

        LOG_DBG("SEQN: %u N/Ack: %u SndRWE: %u SndLWE: %u "
                "RcvRWE: %u RcvLWE: %u "
                "newRWE: %u newLWE: %u "
                "myRWE: %u myLWE: %u",
                pci_seqn, ack, snd_rt_we, snd_lf_we, rcv_rt_we, rcv_lf_we,
                new_rt_we, new_lf_we, my_rt_we, my_lf_we);
}