static void mirroring_send(const int mirror_id, uint8_t *pkt_data, const uint32_t length, const uint64_t packet_id) { RMT_LOG(P4_LOG_LEVEL_VERBOSE, "Sending coalesced packet of length %u from coalescing session %d\n", length, mirror_id); uint8_t *metadata; phv_data_t *phv = phv_init(0, 0); fields_set_clone_spec(phv, mirror_id); fields_set_packet_length(phv, length); deparser_produce_metadata(phv, &metadata); free(phv); // Send to queuing module. queuing_receive(metadata, NULL, pkt_data, length, packet_id, PKT_INSTANCE_TYPE_COALESCED); }
int mirroring_receive(phv_data_t *phv, int *metadata_recirc, void *pkt_data, int len, uint64_t packet_id, pkt_instance_type_t instance_type) { int mirror_id = fields_get_clone_spec(phv); coalescing_session_t *coalescing_session = get_coalescing_session(mirror_id); if(NULL != coalescing_session) { RMT_LOG(P4_LOG_LEVEL_VERBOSE, "Queuing digest for mirror %d %d\n", mirror_id, *metadata_recirc); pkt_digest_t *pkt_digest = malloc(sizeof(pkt_digest_t)); pkt_digest->mirror_id = mirror_id; pkt_digest->length = 0; deparser_extract_digest(phv, metadata_recirc, pkt_digest->buffer, &(pkt_digest->length)); cb_write(rmt_mirroring_cb, pkt_digest); } else if(NULL != get_mirroring_mapping(mirror_id)) { uint8_t *metadata; deparser_produce_metadata(phv, &metadata); //:: if enable_intrinsic: //:: bytes = 0 //:: for header_instance in ordered_header_instances_non_virtual: //:: h_info = header_info[header_instance] //:: is_metadata = h_info["is_metadata"] //:: if is_metadata: bytes += h_info["byte_width_phv"] //:: #endfor uint8_t extracted_metadata[${bytes}]; metadata_extract(extracted_metadata, metadata, NULL); /* NULL ? */ // do not set deflection_flag and dod bits for mirrored packet metadata_set_deflection_flag(extracted_metadata, 0); metadata_set_deflect_on_drop(extracted_metadata, 0); metadata_dump(metadata, extracted_metadata); //:: #endif return queuing_receive(metadata, metadata_recirc, pkt_data, len, packet_id, instance_type); } else { RMT_LOG(P4_LOG_LEVEL_WARN, "Received packet with invalid mirror id %d\n", mirror_id); } free(pkt_data); free(metadata_recirc); return 0; }
int mirroring_receive(phv_data_t *phv, int *metadata_recirc, void *pkt_data, int len, uint64_t packet_id, pkt_instance_type_t instance_type) { int mirror_id = fields_get_clone_spec(phv); if(NULL != get_mirroring_mapping(mirror_id)) { uint8_t *metadata; deparser_produce_metadata(phv, &metadata); return queuing_receive(metadata, metadata_recirc, pkt_data, len, packet_id, instance_type); } else { RMT_LOG(P4_LOG_LEVEL_WARN, "Received packet with invalid mirror id %d\n", mirror_id); } free(pkt_data); free(metadata_recirc); return 0; }