p4 學習筆記

10249421發表於2021-06-03

新版的p4編譯器編譯p4-14

p4c test.p4 -o meter --std p4-14 #p4-14和p4-16存在較大差異,參考p4程式碼時需注意

p4語言特性

  • 無符號數bit型別的操作:此處我暫不明確是否包含 varbit

  • 變長bit型別操作(只有有限的複製和比較操作)

p4程式處理流程

v1model
  • p4程式預設的包處理流程(不寫入任何處理流程)

    1. 沒有任何流表(預設的操作是 NoAction)

    1. 簡單的模擬包

  1. 預設從入埠轉發出去

  • Egress控制塊的作用(無法修改出埠)


(圖片從 2014_arxiv_P4: Programming Protocol-Independent Packet Processor,即提出p4概念的論文中翻譯而來)

v1model.p4原始碼閱讀記錄

  • 外部物件(extern object)

    • extern void resubmit<T>(in T data);

      在 igress 控制塊中呼叫將保留標準和使用者後設資料(保留的是 igress 控制塊結束時候的值,不是呼叫resubmit時候的值)

      只能用於 igress 控制塊,且只能執行一次(若多次呼叫,也只是重新提交一個包)

    • extern void recirculate<T>(in T data);

      在 egress 控制塊中呼叫將保留標準和使用者後設資料(保留的是 egress 控制塊結束時候的值,不是呼叫recirculate時候的值)

      只能用於 egress 控制塊,且只能執行提供一次(若多次呼叫,也只是重新迴圈一個包)

    • extern void clone(in CloneType type, in bit<32> session);

      不保留標準和使用者後設資料

      本質上類似與呼叫 clone3

    • extern void clone3<T>(in CloneType type, in bit<32> session, in T data);

  • 支援的原語操作(p4-14和p4-16系統提供的函式)

    • modify_field
    • modify_field_rng_uniform
    • add_to_field
    • subtract_from_field
    • add
    • subtract
    • bit_xor
    • bit_and
    • shift_left
    • shift_right
    • drop
    • mark_to_drop
    • generate_digest
    • add_header
    • add_header_fast
    • copy_header
    • clone_ingress_pkt_to_egress
    • clone_egress_pkt_to_egress
    • resubmit
    • recirculate
    • modify_field_with_hash_based_offset
    • no_op
    • execute_meter
    • count
    • register_read提供
    • register_write
    • truncate
  • commit

    • 19cd6964994671a6da027e07c77d7d30c6ec99ce (Tue Jan 28 14:40:00 2020)

      1. 新增暫存器的文件說明
      2. 更新後設資料說明
      3. 修改了 resubmit 等外部變數的說明
    • 652bc4af6d0dea30e51c84927c3b42e92c2b7ca3 (Mon Jul 8 15:55:15 2019)

      1. 刪除了六個標準後設資料
        1. clone_spec
        2. drop
        3. recirculate_port
        4. lf_field_list
        5. resubmit_flag
        6. recirculate_flag
    • 858cdf483dd7d245060d8caedb329596b2477816 (Mon Jul 8 14:10:53 2019)

      1. 修改了諸多 extern object 的註釋
        1. extern counter
        2. extern meter
        3. extern void digest(in bit<32> receiver, in T data);
        4. extern void verify_checksum<T, O>(in bool condition, in T data, inout O checksum, HashAlgorithm algo);
        5. extern void update_checksum<T, O>(in bool condition, in T data, inout O checksum, HashAlgorithm algo);
        6. extern void verify_checksum_with_payload
        7. extern void update_checksum_with_payload
        8. extern void resubmit(in T data);
        9. extern void recirculate(in T data);
        10. extern void clone(in CloneType type, in bit<32> session);
        11. extern void clone3(in CloneType type, in bit<32> session, in T data);
        12. v1model 的 package 的各個部分
    • bc7b75bd1892ab230c2ec2d125af8529cf092f4a (Mon Apr 4 13:33:49 2016)

      1. P4 v1.2 compiler prototype
      2. 諸多 extern object 新增的日誌