static int populate_ctrl_pci(struct pci * pci, struct dtcp * dtcp) { struct dtcp_config * dtcp_cfg; seq_num_t snd_lft; seq_num_t snd_rt; seq_num_t LWE; dtcp_cfg = dtcp_config_get(dtcp); if (!dtcp_cfg) { LOG_ERR("No dtcp cfg..."); return -1; } /* * FIXME: Shouldn't we check if PDU_TYPE_ACK_AND_FC or * PDU_TYPE_NACK_AND_FC ? */ LWE = dt_sv_rcv_lft_win(dtcp->parent); if (dtcp_flow_ctrl(dtcp_cfg)) { if (dtcp_window_based_fctrl(dtcp_cfg)) { snd_lft = snd_lft_win(dtcp); snd_rt = snd_rt_wind_edge(dtcp); pci_control_new_left_wind_edge_set(pci, LWE); pci_control_new_rt_wind_edge_set(pci, rcvr_rt_wind_edge(dtcp)); pci_control_my_left_wind_edge_set(pci, snd_lft); pci_control_my_rt_wind_edge_set(pci, snd_rt); } if (dtcp_rate_based_fctrl(dtcp_cfg)) { LOG_MISSING; } } switch (pci_type(pci)) { case PDU_TYPE_ACK_AND_FC: case PDU_TYPE_ACK: if (pci_control_ack_seq_num_set(pci, LWE)) { LOG_ERR("Could not set sn to ACK"); return -1; } return 0; case PDU_TYPE_NACK_AND_FC: case PDU_TYPE_NACK: if (pci_control_ack_seq_num_set(pci, LWE + 1)) { LOG_ERR("Could not set sn to NACK"); return -1; } return 0; default: break; } return 0; }
static int deserialize_ack_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, dt_cons->seq_num_length); *offset += dt_cons->seq_num_length; if (pci_control_ack_seq_num_set(new_pci, seq)) return -1; return 0; }