static int default_next_hop(struct pft_ps * ps, struct pci * pci, port_id_t ** ports, size_t * count) { struct pft * pft = ps->dm; address_t destination; qos_id_t qos_id; struct pft_entry * tmp; if (!pft_is_ok(pft)) return -1; destination = pci_destination(pci); if (!is_address_ok(destination)) { LOG_ERR("Bogus destination address, cannot get NHOP"); return -1; } qos_id = pci_qos_id(pci); if (!is_qos_id_ok(qos_id)) { LOG_ERR("Bogus qos-id, cannot get NHOP"); return -1; } if (!ports || !count) { LOG_ERR("Bogus output parameters, won't get NHOP"); return -1; } /* * Taking the lock here since otherwise instance might be deleted when * copying the ports */ rcu_read_lock(); tmp = pft_find(pft, destination, qos_id); if (!tmp) { LOG_ERR("Could not find any entry for dest address: %u and " "qos_id %d", destination, qos_id); rcu_read_unlock(); return -1; } if (pfte_ports_copy(tmp, ports, count)) { rcu_read_unlock(); return -1; } rcu_read_unlock(); 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); }
static int serialize_base_pci(const struct serdes * instance, char * data, const struct pci * pci, size_t pdu_len) { int offset; address_t addr; cep_id_t cep; qos_id_t qos; pdu_type_t type; pdu_flags_t flags; struct dt_cons * dt_cons; ASSERT(instance); ASSERT(data); ASSERT(pci_is_ok(pci)); ASSERT(pdu_len); dt_cons = instance->dt_cons; ASSERT(dt_cons); /* * Putting 1 as version number for now * If another version is needed, this will have to change * Always 8 bit long */ offset = 0; memcpy(data + offset, &version, VERSION_SIZE); offset += VERSION_SIZE; LOG_DBG("Serialized version %d, with size %d", version, VERSION_SIZE); addr = pci_destination(pci); memcpy(data + offset, &addr, dt_cons->address_length); offset += dt_cons->address_length; addr = pci_source(pci); memcpy(data + offset, &addr, dt_cons->address_length); offset += dt_cons->address_length; qos = pci_qos_id(pci); memcpy(data + offset, &qos, dt_cons->qos_id_length); offset += dt_cons->qos_id_length; cep = pci_cep_source(pci); memcpy(data + offset, &cep, dt_cons->cep_id_length); offset += dt_cons->cep_id_length; cep = pci_cep_destination(pci); memcpy(data + offset, &cep, dt_cons->cep_id_length); offset += dt_cons->cep_id_length; type = pci_type(pci); memcpy(data + offset, &type, PDU_TYPE_SIZE); offset += PDU_TYPE_SIZE; flags = pci_flags_get(pci); memcpy(data + offset, &flags, FLAGS_SIZE); offset += FLAGS_SIZE; memcpy(data + offset, &pdu_len, dt_cons->length_length); offset += dt_cons->length_length; return 0; }