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

        ASSERT(instance);
        ASSERT(new_pci);
        ASSERT(offset);
        ASSERT(ptr);

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

        seq = 0;

        memcpy(&seq, ptr + *offset, CTRL_SEQ_NR);
        *offset += CTRL_SEQ_NR;
        if (pci_control_last_seq_num_rcvd_set(new_pci, seq))
                return -1;

        memcpy(&seq, ptr + *offset, dt_cons->seq_num_length);
        *offset += dt_cons->seq_num_length;
        if (pci_control_new_left_wind_edge_set(new_pci, seq))
                return -1;

        memcpy(&seq, ptr + *offset, dt_cons->seq_num_length);
        *offset += dt_cons->seq_num_length;
        if (pci_control_new_rt_wind_edge_set(new_pci, seq))
                return -1;

        memcpy(&seq, ptr + *offset, dt_cons->seq_num_length);
        *offset += dt_cons->seq_num_length;
        if (pci_control_my_left_wind_edge_set(new_pci, seq))
                return -1;

        memcpy(&seq, ptr + *offset, dt_cons->seq_num_length);
        *offset += dt_cons->seq_num_length;
        if (pci_control_my_rt_wind_edge_set(new_pci, seq))
                return -1;

        /*
         * Note that the same applies here as before
         * MyRcvRate to be added here in the future
         */

        return 0;
}
Esempio n. 2
0
struct pdu * pdu_ctrl_create_ni(struct dtcp * dtcp, pdu_type_t type)
{
        struct pdu *    pdu;
        struct pci *    pci;
        struct buffer * buffer;
        seq_num_t       seq;
        struct efcp *   efcp;

        if (!pdu_type_is_control(type))
                return NULL;

        efcp = dt_efcp(dtcp->parent);
        if (!efcp) {
                LOG_ERR("Passed instance has no EFCP, bailing out");
                return NULL;
        }

        buffer = buffer_create_ni(1);
        if (!buffer)
                return NULL;

        pdu = pdu_create_ni();
        if (!pdu) {
                buffer_destroy(buffer);
                return NULL;
        }

        pci = pci_create_ni();
        if (!pci) {
                pdu_destroy(pdu);
                return NULL;
        }

        seq = next_snd_ctl_seq(dtcp);
        if (pci_format(pci,
                       efcp_src_cep_id(efcp),
                       efcp_dst_cep_id(efcp),
                       efcp_src_addr(efcp),
                       efcp_dst_addr(efcp),
                       seq,
                       efcp_qos_id(efcp),
                       type)) {
                pdu_destroy(pdu);
                pci_destroy(pci);
                return NULL;
        }

        if (pci_control_last_seq_num_rcvd_set(pci,last_rcv_ctrl_seq(dtcp))) {
                pci_destroy(pci);
                pdu_destroy(pdu);
                return NULL;
        }

        if (pdu_pci_set(pdu, pci)) {
                pdu_destroy(pdu);
                pci_destroy(pci);
                return NULL;
        }

        if (pdu_buffer_set(pdu, buffer)) {
                pdu_destroy(pdu);
                return NULL;
        }

        return pdu;
}