Errc from_view(View& v, Stats_reply& m) { if (remaining(v) < bytes(m)) return Errc::STATS_REPLY_OVERFLOW; from_view(v, m.header); return from_view(v, m.payload, m.header.type); }
Errc from_view(View& v, Queue_stats_request& m) { from_view(v, m.port_number); pad(v, 2); from_view(v, m.queue_id); return {}; }
Errc from_view(View& v, Queue_config_reply& m) { if (remaining(v) < bytes(m)) return Errc::QUEUE_CONFIG_REPLY_OVERFLOW; from_view(v, m.port); from_view(v, m.queues); return {}; }
Errc from_view(View& v, Vendor_stats& m) { if (remaining(v) < bytes(m)) return Errc::VENDOR_STATS_OVERFLOW; from_view(v, m.vendor_id); from_view(v, m.data); return {}; }
Errc from_view(View& v, Flow_stats_request& m) { from_view(v, m.match); from_view(v, m.table_id); pad(v, 1); from_view(v, m.out_port); return {}; }
Errc from_view(View& v, Set_config& m) { if (remaining(v) < bytes(m)) return Errc::CONFIG_OVERFLOW; from_view(v, m.flags); from_view(v, m.miss_send_len); return {}; }
Errc from_view(View& v, Stats_header& m) { from_view(v, m.type); from_view(v, m.flags); if (not is_valid(m.type)) // Required semantic check return Errc::BAD_STATS_TYPE; return {}; }
Errc from_view(View& v, Aggregate_stats& m) { from_view(v, m.packet_count); from_view(v, m.byte_count); from_view(v, m.flow_count); pad(v, 4); return {}; }
Errc from_view(View& v, Description_stats& m) { from_view(v, m.mfr_desc); from_view(v, m.hw_desc); from_view(v, m.sw_desc); from_view(v, m.serial_number); from_view(v, m.dp_desc); return {}; }
Errc from_view(View& v, Port_status& m) { if (remaining(v) < bytes(m)) return Errc::PORT_STATUS_OVERFLOW; from_view(v, m.reason); pad(v, 7); from_view(v, m.port); return {}; }
Errc from_view(View& v, Error& m) { if (remaining(v) < bytes(m)) return Errc::ERROR_OVERFLOW; from_view(v, m.type); from_view(v, m.code); from_view(v, m.data); return {}; }
Errc from_view(View& v, Message& m) { if (remaining(v) < bytes(m)) return Errc::MESSAGE_OVERFLOW; from_view(v, m.header); // TODO: Constrain the view? return from_view(v, m.payload, m.header.type); }
Errc from_view(View& v, Port_mod& m) { if (remaining(v) < bytes(m)) return Errc::PORT_MOD_OVERFLOW; from_view(v, m.port); from_view(v, m.hw_addr); from_view(v, m.config); from_view(v, m.mask); from_view(v, m.advertised); return {}; }
Errc from_view(View& v, Queue_stats_entry& m) { from_view(v, m.length); pad(v, 2); from_view(v, m.tx_bytes); from_view(v, m.tx_packets); from_view(v, m.tx_errors); if (m.length != 32) // Required semantic check return Errc::BAD_QUEUE_STATS_LENGTH; return {}; }
Errc from_view(View& v, Packet_in& m) { if (remaining(v) < bytes(m)) return Errc::PACKET_IN_OVERFLOW; from_view(v, m.buffer_id); from_view(v, m.total_len); from_view(v, m.in_port); from_view(v, m.reason); pad(v, 1); from_view(v, m.data); return {}; }
Errc from_view(View& v, Queue& m) { if (remaining(v) < bytes(m)) return Errc::PROPERTY_OVERFLOW; if (m.length < bytes(m)) return Errc::BAD_QUEUE_LENGTH; from_view(v, m.queue_id); from_view(v, m.length); pad(v, 2); from_view(v, m.properties); return {}; }
Error from_view(View& v, Header& h) { if (v.remaining() < bytes(h)) return make_error_code(errc::header_overflow); from_view(v, h.version); from_view(v, h.type); from_view(v, h.length); from_view(v, h.xid); // Minimum semantic checking if (h.length < bytes(h)) return make_error_code(errc::bad_header_length); return {}; }
Errc from_view(View& v, Flow_mod& m) { if (remaining(v) < bytes(m)) return Errc::FLOW_MOD_OVERFLOW; from_view(v, m.match); from_view(v, m.cookie); from_view(v, m.command); from_view(v, m.idle_timeout); from_view(v, m.hard_timeout); from_view(v, m.priority); from_view(v, m.buffer_id); from_view(v, m.out_port); from_view(v, m.flags); return from_view(v, m.actions); }
Errc from_view(View& v, Header& m) { if (remaining(v) < bytes(m)) return Errc::MESSAGE_OVERFLOW; // FIXME: not the right code? from_view(v, m.version); from_view(v, m.type); from_view(v, m.length); from_view(v, m.xid); if (not is_valid(m.version)) // Optional semantic check return Errc::BAD_VERSION; if (not is_valid(m.type)) // Required semantic check return Errc::BAD_MESSAGE_TYPE; if (m.length < bytes(m)) // Required semantic check return Errc::BAD_HEADER_LENGTH; return {}; }
Errc from_view(View& v, Property& m) { from_view(v, m.property); from_view(v, m.length); pad(v, 4); if (not is_valid(m.property)) // Required semantic check return Errc::BAD_PROPERTY_TYPE; if (m.length < bytes(m)) // Required semantic check return Errc::BAD_PROPERTY_LENGTH; if (Constrained_view c = constrain(v, m.length - bytes(m))) return to_view(c, m.value, m.property); else return {}; }
Errc from_view(View& v, Packet_out& m) { if (remaining(v) < bytes(m)) return Errc::PACKET_OUT_OVERFLOW; from_view(v, m.buffer_id); from_view(v, m.port); from_view(v, m.actions_len); if (Constrained_view c = constrain(v, m.actions_len)) { if (Trap err = from_view(v, m.actions)) return err.code(); } else { return Errc::PACKET_OUT_OVERFLOW; } from_view(v, m.data); return {}; }
Errc from_view(View& v, Flow_removed& m) { if (remaining(v) < bytes(m)) return Errc::FLOW_REMOVED_OVERFLOW; from_view(v, m.match); from_view(v, m.cookie); from_view(v, m.priority); from_view(v, m.reason); pad(v, 1); from_view(v, m.duration_sec); from_view(v, m.duration_nsec); from_view(v, m.idle_timeout); pad(v, 2); from_view(v, m.packet_count); from_view(v, m.byte_count); return {}; }
Errc from_view(View& v, Table_stats_entry& m) { from_view(v, m.table_id); pad(v, 3); from_view(v, m.name); from_view(v, m.wildcards); from_view(v, m.max_entries); from_view(v, m.active_count); from_view(v, m.lookup_count); from_view(v, m.matched_count); return {}; }
Errc from_view(View& v, Stats_request_payload& m, Stats_type t) { switch(t) { case STATS_DESC: return from_view(v, m.empty); case STATS_FLOW: return from_view(v, m.flow); case STATS_AGGREGATE: return from_view(v, m.flow); case STATS_TABLE: return from_view(v, m.empty); case STATS_PORT: return from_view(v, m.port); case STATS_QUEUE: return from_view(v, m.queue); case STATS_VENDOR: return from_view(v, m.vendor); default: break; } throw Errc::BAD_STATS_TYPE; }
Errc from_view(View& v, Stats_reply_payload& m, Stats_type t) { construct(m, t); // Guarantee that non-trivial members are valid switch(t) { case STATS_DESC: return from_view(v, m.desc); case STATS_FLOW: return from_view(v, m.flow); case STATS_AGGREGATE: return from_view(v, m.aggr); case STATS_TABLE: return from_view(v, m.table); case STATS_PORT: return from_view(v, m.port); case STATS_QUEUE: return from_view(v, m.queue); case STATS_VENDOR: return from_view(v, m.vendor); default: break; } throw Errc::BAD_STATS_TYPE; }
Errc from_view(View& v, Feature_reply& m) { if (remaining(v) < bytes(m)) return Errc::FEATURE_OVERFLOW; from_view(v, m.datapath_id); from_view(v, m.nbuffers); from_view(v, m.ntables); pad(v, 3); from_view(v, m.capabilities); from_view(v, m.actions); from_view(v, m.ports); return {}; }
Errc from_view(View& v, Port_stats_entry& m) { from_view(v, m.port_number); pad(v, 6); from_view(v, m.rx_packets); from_view(v, m.tx_packets); from_view(v, m.rx_bytes); from_view(v, m.tx_bytes); from_view(v, m.rx_dropped); from_view(v, m.tx_dropped); from_view(v, m.rx_errors); from_view(v, m.tx_errors); from_view(v, m.rx_frame_err); from_view(v, m.rx_over_err); from_view(v, m.rx_crc_err); from_view(v, m.collisions); return {}; }
Errc from_view(View& v, Port_stats_request& m) { from_view(v, m.port_number); pad(v, 6); return {}; }
Errc from_view(View& v, Flow_stats_entry& m) { from_view(v, m.length); from_view(v, m.table_id); pad(v, 1); from_view(v, m.match); from_view(v, m.duration_sec); from_view(v, m.duration_nsec); from_view(v, m.priority); from_view(v, m.idle_timeout); from_view(v, m.hard_timeout); pad(v, 6); from_view(v, m.cookie); from_view(v, m.packet_count); from_view(v, m.byte_count); if (m.length < bytes(m)) // Required semantic check return Errc::BAD_FLOW_STATS_LENGTH; if (Constrained_view c = constrain(v, m.length - bytes(m))) return from_view(c, m.actions); return Errc::FLOW_STATS_OVERFLOW; }
Errc from_view(View& v, Vendor_stats_request& m) { from_view(v, m.vendor_id); return {}; }