== VM instructions === instructions_type these are the instructions type ==== fix_checksum_ipv4 This command will fix ipv4 checksum header [source,python] ---- { ins_name : string ,"fix_checksum_ipv4" ## this command will recalculate the ipv4 checksum pkt_offset : uint16_t, number, ## the offset into the packet when the ipv4 header is located } ---- ==== flow_man_simple This command will allocate and manipulate flow object data For example, allocate a flow variable and object from 10.0.0.1-10.0.0.10 [source,python] ---- { ins_name: string, "flow_man_simple" ## increment a flow variable flow_varible_name: string "name_of_varible" # internal software will allocate the object for this, the name should be unique object_size : uint16_t #size of the variable 1,2,4,8 ( max uint64) Operation : "inc","dec","random" # the command could be inc from min-max start at init # decrement # random split_by_core : true/false ##do we want to split the range by cores init_value : number, size of object_size (max uint64) min_value : number, size of object_size (max uint64) max_value : number, size of object_size (max uint64) } ---- ==== write_to_pkt This command will copy flow varible into packet offset [source,c] ---- tmp_pkt_data = (flow_var +add_value) if (big_edian){ (varible_size )pkt[pkt_offset] =swap(tmp_pkt_data); } ---- [source,python] ---- { ins_name : string , "write_to_pkt" ## flow_varible_name : string "name_of_varible" # flow varible value to copy from pkt_offset : uint16_t # the offset into the packet to copy the varible add_value : 0 (size_of_the_varible)# when writing add this value big_edian : bool default true # swap varible when copy yo packet } ---- === Examples === Examples1 an examples to a programs that change src_ip in specific range for one core range of src_ip 10.0.0.1-10.0.0.10 start from 10.0.0.7 update ipv4 checksum ip offset is in 14 offset [ 6 - dest mac 0 6 - src mac 6 2 network 12 ip[0] 14 ip[4] 18 ip[8]-TTL,Protocol 22 ip[12]-src_ip 26 ip[12]-dest_ip 30 } The program [source,python] ---- [ { ins_name : "flow_data_inc" flow_varible_name : "src_ip" object_size : 1 operaqtion : "inc" split_by_core : false # one core init_value : 7 min_value : 1 max_value : 10 } , { ins_name : "write_to_pkt" flow_varible_name : "src_ip" pkt_offset : 26, add_value : 0 , big_edian : true }, { ins_name : "fix_checksum_ipv4" pkt_offset : 14 } ] ---- === Examples2 an examples to a programs that change src_ip and dest_ip in specific range for one core range of src_ip 10.0.0.1-10.0.0.10 start from 10.0.0.7 range of dest_ip 48.0.0.1-48.0.0.10 start from 48.0.0.7 update ipv4 checksum ip offset is in 14 offset [ 6 - dest mac 0 6 - src mac 6 2 network 12 ip[0] 14 ip[4] 18 ip[8]-TTL,Protocol 22 ip[12]-src_ip 26 ip[12]-dest_ip 30 } The program [source,python] ---- [ { ins_name : "flow_data_inc" flow_varible_name : "src_ip" object_size : 1 operaqtion : "inc" split_by_core : false # one core init_value : 7 min_value : 1 max_value : 10 } , { ins_name : "write_to_pkt" flow_varible_name : "src_ip" pkt_offset : 26, add_value : 0 , big_edian : true }, { ins_name : "write_to_pkt" flow_varible_name : "src_ip" pkt_offset : 30, add_value : 0 , big_edian : true }, { ins_name : "fix_checksum_ipv4" pkt_offset : 14 } ] ---- === Considerations ==== Control-Plain check - Verify that packet offset into fix_checksum_ipv4 is less that pkt_size - min_ip_header - There is no stream that are orphaned (not started at startup and nobody call them) ==== Data-Plain check - Convert the commands to a VM compress command - Allocate flow memory per flow for each stream (currently add the memory in each offset) - VM runner at startup/ each packet