Crate p4rs

Source
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§

bitmath
checksum
error
externs
table

Structs§

AlignedU128
Bit
TableEntry
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§

Header
A fixed length header trait.
Pipeline

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