

Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
Community
Ask the community for help and clear up your study doubts
Discover the best universities in your country according to Docsity users
Free resources
Download our free guides on studying techniques, anxiety management strategies, and thesis advice from Docsity tutors
In this cheat sheet you have the main concepts about P4 programming language
Typology: Cheat Sheet
1 / 2
This page cannot be seen from the preview
Don't miss anything!
// typedef: introduces alternate type name typedef bit<48> macAddr_t; typedef bit<32> ip4Addr_t; // headers: ordered collection of members // operations test and set validity bits: // isValid(), setValid(), setInvalid() header ethernet_t { macAddr_t dstAddr; macAddr_t srcAddr; bit<16> type; } // variable declaration and member access ethernet_t ethernet; macAddr_t src = ethernet.srcAddr; // struct: unordered collection of members struct headers_t { ethernet_t ethernet; }
// packet_in: extern for input packet extern packet_in { void extract
// Local metadata declaration, assignment bit<16> tmp1; bit<16> tmp2; tmp1 = hdr.ethernet.type; // bit slicing, concatenation tmp2 = tmp1[7:0] ++ tmp1[15:8]; // addition, subtraction, casts tmp2 = tmp1 + tmp1 - (bit<16>)tmp1[7:0]; // bitwise operators tmp2 = (~tmp1 & tmp1) | (tmp1 ^ tmp1); tmp2 = tmp1 << 3;
// Inputs provided by control-plane action set_next_hop(bit<32> next_hop) { if (next_hop == 0) { metadata.next_hop = hdr.ipv4.dst; } else { metadata.next_hop = next_hop; } } // Inputs provided by data-plane action swap_mac(inout bit<48> x, inout bit<48> y) { bit<48> tmp = x; x = y; y = tmp; } // Inputs provided by control/data-plane action forward(in bit<9> p, bit<48> d) { standard_metadata.egress_spec = p; headers.ethernet.dstAddr = d; } // Remove header from packet action decap_ip_ip() { hdr.ipv4 = hdr.inner_ipv4; hdr.inner_ipv4.setInvalid(); }
table ipv4_lpm { key = { hdr.ipv4.dstAddr : lpm; // standard match kinds: // exact, ternary, lpm } // actions that can be invoked actions = { ipv4_forward; drop; NoAction; } // table properties size = 1024; default_action = NoAction(); }
apply { // branch on header validity if (hdr.ipv4.isValid()) { ipv4_lpm.apply(); } // branch on table hit result if (local_ip_table.apply().hit) { send_to_cpu(); } // branch on table action invocation switch (table1.apply().action_run) { action1: { table2.apply(); } action2: { table3.apply(); } } }
// packet_out: extern for output packet extern packet_out { void emit
// header stack declaration header label_t { bit<20> label; bit bos; } struct header_t { label_t[10] labels; } header_t hdr; // remove from header stack action pop_label() { hdr.labels.pop_front(1); } // add to header stack action push_label(in bit<20> label) { hdr.labels.push_front(1); hdr.labels[0].setValid(); hdr.labels[0] = { label, 0}; }
// common defns for IPv4 and IPv header ip46_t { bit<4> version; bit<4> reserved; } // header stack parsing state parse_labels { packet.extract(hdr.labels.next); transition select(hdr.labels.last.bos) { 0: parse_labels; // create loop 1: guess_labels_payload; } } // lookahead parsing state guess_labels_payload { transition select(packet.lookahead< ip46_t>().version) { 4 : parse_inner_ipv4; 6 : parse_inner_ipv6; default : parse_inner_ethernet; } }
// common externs extern void truncate(in bit<32> length); extern void resubmit
struct standard_metadata_t { bit<9> ingress_port; bit<9> egress_spec; bit<9> egress_port; bit<32> clone_spec; bit<32> instance_type; bit<1> drop; bit<16> recirculate_port; bit<32> packet_length; bit<32> enq_timestamp; bit<19> enq_qdepth; bit<32> deq_timedelta; bit<19> deq_qdepth; bit<48> ingress_global_timestamp; bit<48> egress_global_timestamp; bit<32> lf_field_list; bit<16> mcast_grp; bit<32> resubmit_flag; bit<16> egress_rid; bit<1> checksum_error; bit<32> recirculate_flag; }
// counters counter(8192, CounterType.packets) c; action count(bit<32> index) { //increment counter at index c.count(index); } // registers register<bit<48>>(16384) r; action ipg(out bit<48> ival, bit<32> x) { bit<48> last; bit<48> now; r.read(x, last); now = std_meta.ingress_global_timestamp; ival = now - last; r.write(x, now); }