Expand description
This is the runtime support create for x4c
generated programs.
The main abstraction in this crate is the Pipeline
trait. Rust code that
is generated by x4c
implements this trait. A main_pipeline
struct is
exported by the generated code that implements Pipeline
. Users can wrap
the main_pipeline
object in harness code to provide higher level
interfaces for table manipulation and packet i/o.
use p4rs::{ packet_in, packet_out, Pipeline };
use std::net::Ipv6Addr;
struct Handler {
pipe: Box<dyn Pipeline>
}
impl Handler {
/// Create a new pipeline handler.
fn new(pipe: Box<dyn Pipeline>) -> Self {
Self{ pipe }
}
/// Handle a packet from the specified port. If the pipeline produces
/// an output result, send the processed packet to the output port
/// returned by the pipeline.
fn handle_packet(&mut self, port: u16, pkt: &[u8]) {
let mut input = packet_in::new(pkt);
let output = self.pipe.process_packet(port, &mut input);
for (out_pkt, out_port) in &output {
let mut out = out_pkt.header_data.clone();
out.extend_from_slice(out_pkt.payload_data);
self.send_packet(*out_port, &out);
}
}
/// Add a routing table entry. Packets for the provided destination will
/// be sent out the specified port.
fn add_router_entry(&mut self, dest: Ipv6Addr, port: u16) {
self.pipe.add_table_entry(
"ingress.router.ipv6_routes", // qualified name of the table
"forward_out_port", // action to invoke on a hit
&dest.octets(),
&port.to_le_bytes(),
0,
);
}
/// Send a packet out the specified port.
fn send_packet(&self, port: u16, pkt: &[u8]) {
// send the packet ...
}
}
Re-exports§
pub use error::TryFromSliceError;
Modules§
Structs§
- Aligned
U128 - Bit
- Table
Entry - packet_
in - Every packet that goes through a P4 pipeline is represented as a
packet_in
instance.packet_in
objects wrap an underlying mutable data reference that is ultimately rooted in a memory mapped region containing a ring of packets. - packet_
out
Traits§
Functions§
- bitvec_
to_ biguint - bitvec_
to_ bitvec16 - bitvec_
to_ ip6addr - dump_bv
- extract_
bit_ action_ parameter - extract_
bool_ action_ parameter - extract_
exact_ key - extract_
lpm_ key - extract_
range_ key - extract_
ternary_ key - Extract a ternary key from the provided keyset data. Ternary keys come in two parts. The first part is a leading bit that indicates whether we care about the value. If that leading bit is non-zero, the trailing bits of the key are interpreted as a binary value. If the leading bit is zero, the trailing bits are ignored and a Ternary::DontCare key is returned.
- int_
to_ bitvec