void Deparser::deparse(Packet *pkt) const { PHV *phv = pkt->get_phv(); BMELOG(deparser_start, *pkt, *this); // TODO(antonin) // this is temporary while we experiment with the debugger DEBUGGER_NOTIFY_CTR( Debugger::PacketId::make(pkt->get_packet_id(), pkt->get_copy_id()), DBG_CTR_DEPARSER | get_id()); update_checksums(pkt); char *data = pkt->prepend(get_headers_size(*phv)); int bytes_parsed = 0; // invalidating headers, and resetting header stacks is done in the Packet // destructor, when the PHV is released for (auto it = headers.begin(); it != headers.end(); ++it) { Header &header = phv->get_header(*it); if (header.is_valid()) { BMELOG(deparser_emit, *pkt, *it); header.deparse(data + bytes_parsed); bytes_parsed += header.get_nbytes_packet(); // header.mark_invalid(); } } // phv->reset_header_stacks(); BMELOG(deparser_done, *pkt, *this); DEBUGGER_NOTIFY_CTR( Debugger::PacketId::make(pkt->get_packet_id(), pkt->get_copy_id()), DBG_CTR_EXIT(DBG_CTR_DEPARSER) | get_id()); }
const ControlFlowNode * MatchActionTable::operator()(Packet *pkt) const { // TODO(antonin) // this is temporary while we experiment with the debugger DEBUGGER_NOTIFY_CTR( Debugger::PacketId::make(pkt->get_packet_id(), pkt->get_copy_id()), DBG_CTR_TABLE | get_id()); BMLOG_TRACE_PKT(*pkt, "Applying table '{}'", get_name()); const auto next = match_table->apply_action(pkt); DEBUGGER_NOTIFY_CTR( Debugger::PacketId::make(pkt->get_packet_id(), pkt->get_copy_id()), DBG_CTR_EXIT(DBG_CTR_TABLE) | get_id()); return next; }
const ParseState * ParseState::operator()(Packet *pkt, const char *data, size_t *bytes_parsed) const { // TODO(antonin) // this is temporary while we experiment with the debugger DEBUGGER_NOTIFY_CTR( Debugger::PacketId::make(pkt->get_packet_id(), pkt->get_copy_id()), DBG_CTR_PARSE_STATE | get_id()); auto next_state = find_next_state(pkt, data, bytes_parsed); DEBUGGER_NOTIFY_CTR( Debugger::PacketId::make(pkt->get_packet_id(), pkt->get_copy_id()), DBG_CTR_EXIT(DBG_CTR_PARSE_STATE) | get_id()); return next_state; }
void Parser::parse(Packet *pkt) const { BMELOG(parser_start, *pkt, *this); // TODO(antonin) // this is temporary while we experiment with the debugger DEBUGGER_NOTIFY_CTR( Debugger::PacketId::make(pkt->get_packet_id(), pkt->get_copy_id()), DBG_CTR_PARSER | get_id()); BMLOG_DEBUG_PKT(*pkt, "Parser '{}': start", get_name()); const char *data = pkt->data(); if (!init_state) return; const ParseState *next_state = init_state; size_t bytes_parsed = 0; while (next_state) { next_state = (*next_state)(pkt, data, &bytes_parsed); BMLOG_TRACE("Bytes parsed: {}", bytes_parsed); } pkt->remove(bytes_parsed); BMELOG(parser_done, *pkt, *this); DEBUGGER_NOTIFY_CTR( Debugger::PacketId::make(pkt->get_packet_id(), pkt->get_copy_id()), DBG_CTR_EXIT(DBG_CTR_PARSER) | get_id()); BMLOG_DEBUG_PKT(*pkt, "Parser '{}': end", get_name()); }