static int push_pdus_rmt(struct dtcp * dtcp) { struct cwq * q; struct efcp * efcp; ASSERT(dtcp); efcp = dt_efcp(dtcp->parent); if (!efcp) { LOG_ERR("Passed instance has no EFCP, bailing out"); return -1; } q = dt_cwq(dtcp->parent); if (!q) { LOG_ERR("No Closed Window Queue"); return -1; } cwq_deliver(q, dtcp->parent, dtcp->rmt, efcp_dst_addr(efcp), efcp_qos_id(efcp)); return 0; }
static int default_transmission_control(struct dtp_ps * ps, struct pdu * pdu) { struct dtp * dtp = ps->dm; struct dt * dt; struct efcp * efcp; if (!dtp) { LOG_ERR("No instance passed, cannot run policy"); pdu_destroy(pdu); return -1; } dt = dtp_dt(dtp); if (!dt) { LOG_ERR("Passed instance has no parent, cannot run policy"); pdu_destroy(pdu); return -1; } efcp = dt_efcp(dt); if (!efcp) { LOG_ERR("Passed instance has no EFCP, cannot run policy"); pdu_destroy(pdu); return -1; } /* Post SDU to RMT */ LOG_DBG("defaultTxPolicy - sending to rmt"); if (dtp_sv_max_seq_nr_set(dtp, pci_sequence_number_get(pdu_pci_get_ro( pdu)))) LOG_ERR("Problems setting max sequence number received " "in default_transmission"); LOG_DBG("local_soft_irq_pending: %d", local_softirq_pending()); return common_efcp_pdu_send(efcp, dtp_rmt(dtp), pci_destination(pdu_pci_get_ro(pdu)), pci_qos_id(pdu_pci_get_ro(pdu)), pdu); }
int dtcp_pdu_send(struct dtcp * dtcp, struct pdu * pdu) { struct efcp * efcp; ASSERT(dtcp); ASSERT(dtcp->parent); efcp = dt_efcp(dtcp->parent); if (!efcp) { LOG_ERR("Passed instance has no EFCP, dtcp_pdu_send bailing out"); pdu_destroy(pdu); return -1; } return common_efcp_pdu_send(efcp, dtcp->rmt, efcp_dst_addr(efcp), efcp_qos_id(efcp), pdu); }
static int default_flow_control_overrun(struct dtp_ps * ps, struct pdu * pdu) { struct cwq * cwq; struct dt * dt; struct dtp * dtp = ps->dm; if (!dtp) { LOG_ERR("No instance passed, cannot run policy"); return -1; } dt = dtp_dt(dtp); ASSERT(dt); cwq = dt_cwq(dt); if (!cwq) { LOG_ERR("Failed to get cwq"); pdu_destroy(pdu); return -1; } LOG_DBG("Default Flow Control"); if (!pdu_is_ok(pdu)) { LOG_ERR("PDU is not ok, cannot run policy"); return -1; } if (cwq_push(cwq, pdu)) { LOG_ERR("Failed to push into cwq"); return -1; } if (efcp_disable_write(dt_efcp(dt))) return -1; return 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; }