Open
Description
I created 3 vhost-users and VMs, and I tried to add p4 pipeline binary package to the running IPDK container infrap4d switch. But it failed.
root@f7f2e82ffdeb:~# p4rt-ctl set-pipe br0 /root/examples/simple_l3/simple_l3.pb.bin /root/examples/simple_l3/p4Info.txt
Error: P4Runtime RPC error (INTERNAL): 'bf_pal_device_add(dev_id, &device_profile)' failed with error message: Internal error.
how I created three vhost-user-x ports in ipdk container
root@f7f2e82ffdeb:~#gnmi-ctl set "device:virtual-device,name:net_vhost0,host-name:host1,device-type:VIRTIO_NET,queues:1,socket-path:/tmp/intf/vhost-user-0,port-type:LINK"
root@f7f2e82ffdeb:~#gnmi-ctl set "device:virtual-device,name:net_vhost1,host-name:host1,device-type:VIRTIO_NET,queues:1,socket-path:/tmp/intf/vhost-user-1,port-type:LINK"
root@f7f2e82ffdeb:~#gnmi-ctl set "device:virtual-device,name:net_vhost2,host-name:host1,device-type:VIRTIO_NET,queues:1,socket-path:/tmp/intf/vhost-user-2,port-type:LINK"
how I created three VMs in host
export WORKING_DIR=/root/.ipdk/volume
#vm1 start
qemu-system-x86_64 -smp 1 -m 256M \
-boot c -cpu host --enable-kvm -nographic \
-name VM1 \
-hda "${WORKING_DIR}"/images/vm1.qcow2 \
-drive file="${WORKING_DIR}"/images/seed1.img,id=seed,if=none,format=raw,index=1 \
-device virtio-blk,drive=seed \
-object memory-backend-file,id=mem,size=256M,mem-path=/mnt/huge,share=on \
-numa node,memdev=mem \
-mem-prealloc \
-chardev socket,id=char1,path="${WORKING_DIR}"/intf/vhost-user-0 \
-netdev type=vhost-user,id=netdev0,chardev=char1,vhostforce \
-device virtio-net-pci,mac=52:54:00:34:12:aa,netdev=netdev0 \
-serial telnet::6551,server,nowait &
#vm2 start
qemu-system-x86_64 -smp 1 -m 256M \
-boot c -cpu host --enable-kvm -nographic \
-name VM2 \
-hda "${WORKING_DIR}"/images/vm2.qcow2 \
-drive file="${WORKING_DIR}"/images/seed2.img,id=seed,if=none,format=raw,index=1 \
-device virtio-blk,drive=seed \
-object memory-backend-file,id=mem,size=256M,mem-path=/mnt/huge,share=on \
-numa node,memdev=mem \
-mem-prealloc \
-chardev socket,id=char2,path="${WORKING_DIR}"/intf/vhost-user-1 \
-netdev type=vhost-user,id=netdev1,chardev=char2,vhostforce \
-device virtio-net-pci,mac=52:54:00:34:12:bb,netdev=netdev1 \
-serial telnet::6552,server,nowait
#vm3 start
qemu-system-x86_64 -smp 1 -m 256M \
-boot c -cpu host --enable-kvm -nographic \
-name VM3 \
-hda /root/.ipdk/volume/images/focal-server-cloudimg-amd64.img \
-drive file="${WORKING_DIR}"/images/seed3.img,id=seed,if=none,format=raw,index=1 \
-device virtio-blk,drive=seed \
-object memory-backend-file,id=mem,size=256M,mem-path=/mnt/huge,share=on \
-numa node,memdev=mem \
-mem-prealloc \
-chardev socket,id=char3,path="${WORKING_DIR}"/intf/vhost-user-2 \
-netdev type=vhost-user,id=netdev2,chardev=char3,vhostforce \
-device virtio-net-pci,mac=52:54:00:34:12:cc,netdev=netdev2 \
-serial telnet::6553,server,nowait
my p4 program was simple_l3.p4
/* -*- P4_16 -*- */
#include <core.p4>
#include <psa.p4>
/*************************************************************************
************* C O N S T A N T S A N D T Y P E S *******************
**************************************************************************/
const bit<16> ETHERTYPE_TPID = 0x8100;
const bit<16> ETHERTYPE_IPV4 = 0x0800;
/*************************************************************************
*********************** H E A D E R S *********************************
*************************************************************************/
/* Define all the headers the program will recognize */
/* The actual sets of headers processed by each gress can differ */
/* Standard ethernet header */
header ethernet_h {
bit<48> dst_addr;
bit<48> src_addr;
bit<16> ether_type;
}
header vlan_tag_h {
bit<16> pcp_cfi_vid;
bit<16> ether_type;
}
header ipv4_h {
bit<8> version_ihl;
bit<8> diffserv;
bit<16> total_len;
bit<16> identification;
bit<16> flags_frag_offset;
bit<8> ttl;
bit<8> protocol;
bit<16> hdr_checksum;
bit<32> src_addr;
bit<32> dst_addr;
}
const int IPV4_HOST_SIZE = 65536;
typedef bit<48> ethernet_addr_t;
/*************************************************************************
************** I N G R E S S P R O C E S S I N G *******************
*************************************************************************/
/*********************** H E A D E R S ************************/
struct my_ingress_headers_t {
ethernet_h ethernet;
vlan_tag_h vlan_tag;
ipv4_h ipv4;
}
/****** G L O B A L I N G R E S S M E T A D A T A *********/
struct my_ingress_metadata_t {
}
struct empty_metadata_t {
}
/*********************** P A R S E R **************************/
parser Ingress_Parser(
packet_in pkt,
out my_ingress_headers_t hdr,
inout my_ingress_metadata_t meta,
in psa_ingress_parser_input_metadata_t ig_intr_md,
in empty_metadata_t resub_meta,
in empty_metadata_t recirc_meta)
{
state start {
transition parse_ethernet;
}
state parse_ethernet {
pkt.extract(hdr.ethernet);
transition select(hdr.ethernet.ether_type) {
ETHERTYPE_TPID: parse_vlan_tag;
ETHERTYPE_IPV4: parse_ipv4;
default: accept;
}
}
state parse_vlan_tag {
pkt.extract(hdr.vlan_tag);
transition select(hdr.vlan_tag.ether_type) {
ETHERTYPE_IPV4: parse_ipv4;
default: accept;
}
}
state parse_ipv4 {
pkt.extract(hdr.ipv4);
transition accept;
}
}
/***************** M A T C H - A C T I O N *********************/
control ingress(
inout my_ingress_headers_t hdr,
inout my_ingress_metadata_t meta,
in psa_ingress_input_metadata_t ig_intr_md,
inout psa_ingress_output_metadata_t ostd
)
{
action send(PortId_t port) {
send_to_port(ostd, port);
}
action drop() {
ingress_drop(ostd);
}
table ipv4_host {
key = { hdr.ipv4.dst_addr : exact; }
actions = {
send;drop;
@defaultonly NoAction;
}
const default_action = drop();
size = IPV4_HOST_SIZE;
}
apply {
ipv4_host.apply();
}
}
/********************* D E P A R S E R ************************/
control Ingress_Deparser(packet_out pkt,
out empty_metadata_t clone_i2e_meta,
out empty_metadata_t resubmit_meta,
out empty_metadata_t normal_meta,
inout my_ingress_headers_t hdr,
in my_ingress_metadata_t meta,
in psa_ingress_output_metadata_t istd)
{
apply {
pkt.emit(hdr);
}
}
/*************************************************************************
**************** E G R E S S P R O C E S S I N G *******************
*************************************************************************/
/*********************** H E A D E R S ************************/
struct my_egress_headers_t {
}
/******** G L O B A L E G R E S S M E T A D A T A *********/
struct my_egress_metadata_t {
}
/*********************** P A R S E R **************************/
parser Egress_Parser(
packet_in pkt,
out my_egress_headers_t hdr,
inout my_ingress_metadata_t meta,
in psa_egress_parser_input_metadata_t istd,
in empty_metadata_t normal_meta,
in empty_metadata_t clone_i2e_meta,
in empty_metadata_t clone_e2e_meta)
{
state start {
transition accept;
}
}
/***************** M A T C H - A C T I O N *********************/
control egress(
inout my_egress_headers_t hdr,
inout my_ingress_metadata_t meta,
in psa_egress_input_metadata_t istd,
inout psa_egress_output_metadata_t ostd)
{
apply {
}
}
/********************* D E P A R S E R ************************/
control Egress_Deparser(packet_out pkt,
out empty_metadata_t clone_e2e_meta,
out empty_metadata_t recirculate_meta,
inout my_egress_headers_t hdr,
in my_ingress_metadata_t meta,
in psa_egress_output_metadata_t istd,
in psa_egress_deparser_input_metadata_t edstd)
{
apply {
pkt.emit(hdr);
}
}
#if __p4c__
bit<32> test_version = __p4c_version__;
#endif
/************ F I N A L P A C K A G E ******************************/
IngressPipeline(Ingress_Parser(), ingress(), Ingress_Deparser()) pipe;
EgressPipeline(Egress_Parser(), egress(), Egress_Deparser()) ep;
PSA_Switch(pipe, PacketReplicationEngine(), ep, BufferingQueueingEngine()) main;
any idea? thank you very much guys!
Metadata
Metadata
Assignees
Labels
No labels