若是想要了解 SDN OpenFlow 以及 P4 請不要吝嗇點擊喜歡或是訂閱我喔!(訂閱又不收費XD)
未來有機會也可以跟大家分享我當網管的辛酸血淚史,可以讓人解決問題時可以參考我的文章。
話不多說,我們就累狗!!
本練習的目的是實現源路由。 通過源路由,源主機引導網絡中的每個交換機將數據包發送到特定端口。 主機在數據包中放置一堆輸出端口。 在此示例中,我們只是將堆棧放在以太網頭之後,然後選擇一個特殊的etherType來表明這一點。 每個交換機從堆棧中彈出一個項目,並根據指定的端口號轉發數據包。
您的交換機必須解析源路由堆棧。 每個項目都有一個bos(堆棧底部)位和一個端口號。 僅對於堆棧的最後一個條目,bos位為1。 然後在入口處,它應該從堆棧中彈出一個條目,並相應地設置出口端口。 最後一跳也可能將etherType還原為TYPE_IPV4。
/* -*- P4_16 -*- */
#include <core.p4>
#include <v1model.p4>
const bit<16> TYPE_IPV4 = 0x800;
const bit<16> TYPE_SRCROUTING = 0x1234;
#define MAX_HOPS 9
/*************************************************************************
*********************** H E A D E R S ***********************************
*************************************************************************/
typedef bit<9> egressSpec_t;
typedef bit<48> macAddr_t;
typedef bit<32> ip4Addr_t;
header ethernet_t {
macAddr_t dstAddr;
macAddr_t srcAddr;
bit<16> etherType;
}
header srcRoute_t {
bit<1> bos;
bit<15> port;
}
header ipv4_t {
bit<4> version;
bit<4> ihl;
bit<8> diffserv;
bit<16> totalLen;
bit<16> identification;
bit<3> flags;
bit<13> fragOffset;
bit<8> ttl;
bit<8> protocol;
bit<16> hdrChecksum;
ip4Addr_t srcAddr;
ip4Addr_t dstAddr;
}
struct metadata {
/* empty */
}
struct headers {
ethernet_t ethernet;
srcRoute_t[MAX_HOPS] srcRoutes;
ipv4_t ipv4;
}
/*************************************************************************
*********************** P A R S E R ***********************************
*************************************************************************/
parser MyParser(packet_in packet,
out headers hdr,
inout metadata meta,
inout standard_metadata_t standard_metadata) {
state start {
transition parse_ethernet;
}
state parse_ethernet {
packet.extract(hdr.ethernet);
/*
* TODO: Modify the next line to select on hdr.ethernet.etherType
* If the value is TYPE_SRCROUTING transition to parse_srcRouting
* otherwise transition to accept.
*/
transition accept;
}
state parse_srcRouting {
/*
* TODO: extract the next entry of hdr.srcRoutes
* while hdr.srcRoutes.last.bos is 0 transition to this state
* otherwise parse ipv4
*/
transition accept;
}
state parse_ipv4 {
packet.extract(hdr.ipv4);
transition accept;
}
}
/*************************************************************************
************ C H E C K S U M V E R I F I C A T I O N *************
*************************************************************************/
control MyVerifyChecksum(inout headers hdr, inout metadata meta) {
apply { }
}
/*************************************************************************
************** I N G R E S S P R O C E S S I N G *******************
*************************************************************************/
control MyIngress(inout headers hdr,
inout metadata meta,
inout standard_metadata_t standard_metadata) {
action drop() {
mark_to_drop(standard_metadata);
}
action srcRoute_nhop() {
/*
* TODO: set standard_metadata.egress_spec
* to the port in hdr.srcRoutes[0] and
* pop an entry from hdr.srcRoutes
*/
}
action srcRoute_finish() {
hdr.ethernet.etherType = TYPE_IPV4;
}
action update_ttl(){
hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
}
apply {
if (hdr.srcRoutes[0].isValid()){
/*
* TODO: add logic to:
* - If final srcRoutes (top of stack has bos==1):
* - change etherType to IP
* - choose next hop and remove top of srcRoutes stack
*/
if (hdr.ipv4.isValid()){
update_ttl();
}
}else{
drop();
}
}
}
/*************************************************************************
**************** E G R E S S P R O C E S S I N G *******************
*************************************************************************/
control MyEgress(inout headers hdr,
inout metadata meta,
inout standard_metadata_t standard_metadata) {
apply { }
}
/*************************************************************************
************* C H E C K S U M C O M P U T A T I O N **************
*************************************************************************/
control MyComputeChecksum(inout headers hdr, inout metadata meta) {
apply { }
}
/*************************************************************************
*********************** D E P A R S E R *******************************
*************************************************************************/
control MyDeparser(packet_out packet, in headers hdr) {
apply {
packet.emit(hdr.ethernet);
packet.emit(hdr.srcRoutes);
packet.emit(hdr.ipv4);
}
}
/*************************************************************************
*********************** S W I T C H *******************************
*************************************************************************/
V1Switch(
MyParser(),
MyVerifyChecksum(),
MyIngress(),
MyEgress(),
MyComputeChecksum(),
MyDeparser()
) main;
在此付上我的 Reference,我將會以簡短白話的方式來講解 P4 這套語言,若是你/妳不嫌棄可以訂閱我的發文
每天就根據我自己了解的程度來做發文的動作,如果自己對於 P4也有興趣可以先來預習,那我們明天見!
Reference :
P4_turtorial
[(http://docs.google.com/presentation/d/1zliBqsS8IOD4nQUboRRmF_19poeLLDLadD5zLzrTkVc/edit#slide=id.g37fca2850e_6_1802)]