On 11/26/2016 11:08 PM, Ben Pfaff wrote: > On Thu, Nov 24, 2016 at 02:39:43AM +0000, Yang, Yi Y wrote: >> I noticed vxlan module always uses tp_dst from tunnel metadata in preference >> to vxlan->cfg.dst_port, this isn't the result we want in some use cases, for >> example, if we create two vxlan port which have different dst_port, when we >> forward the packet from the first vxlan port to the second one, we need the >> packet should be sent out with the second vxlan port's dst_port as tp_dst, >> but current vxlan module will use that one from the first vxlan port, the >> source code in vxlan module and our experiment have confirmed this. >> >> The line in file datapath/linux/compat/vxlan.c is here: >> >> dst_port = info->key.tp_dst ? : vxlan->cfg.dst_port; >> >> Anybody knows how we can change this? The below change seems more reasonable >> to me, or do we have some ways to dynamically change it by openflow actions? >> >> dst_port = vxlan->cfg.dst_port ? : info->key.tp_dst; > > I think that this might be related to the bug that Gerhard reported, > starting here: > > https://mail.openvswitch.org/pipermail/ovs-discuss/2016-November/042984.html > Gerhard, does Yang's fix make any difference for you? (I don't know > whether you're using the compat code, but the upstream code may have the > same bug.) >
Ben, I finally managed to create a working setup with a newer kernel (4.8.10-200.fc24.x86_64) and current upstream ovs master. Unless I made a mistake, the fix does not make a difference for my scenario. Here are the details: # modinfo openvswitch filename: /lib/modules/4.8.10-200.fc24.x86_64/extra/openvswitch.ko alias: net-pf-16-proto-16-family-ovs_packet alias: net-pf-16-proto-16-family-ovs_flow alias: net-pf-16-proto-16-family-ovs_vport alias: net-pf-16-proto-16-family-ovs_datapath version: 2.6.90 license: GPL description: Open vSwitch switching datapath srcversion: 8BF3A000492AA097034609E depends: nf_conntrack,nf_nat,udp_tunnel,libcrc32c,nf_nat_ipv6,nf_nat_ipv4,nf_defrag_ipv6 vermagic: 4.8.10-200.fc24.x86_64 SMP mod_unload // Before change: # ovs-dpctl dump-flows recirc_id(0),tunnel(tun_id=0x0,src=192.168.122.202,dst=192.168.122.227,ttl=64,flags(-df-csum+key)),in_port(1),skb_mark(0),eth(src=52:f9:67:de:f0:4b,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=10.0.0.68,tip=10.0.0.111,op=1/0xff), packets:23, bytes:966, used:0.003s, actions:set(tunnel(tun_id=0x0,dst=192.168.122.21,ttl=64,tp_src=7291,tp_dst=6081,flags(df|key))),3,2 # git diff diff --git a/datapath/linux/compat/vxlan.c b/datapath/linux/compat/vxlan.c index 3abcab1..c84a280 100644 --- a/datapath/linux/compat/vxlan.c +++ b/datapath/linux/compat/vxlan.c @@ -1046,7 +1046,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev, dev->name); goto drop; } - dst_port = info->key.tp_dst ? : vxlan->cfg.dst_port; + dst_port = vxlan->cfg.dst_port ? : info->key.tp_dst; vni = vxlan_tun_id_to_vni(info->key.tun_id); remote_ip.sa.sa_family = ip_tunnel_info_af(info); if (remote_ip.sa.sa_family == AF_INET) { // Build and install OVS kernel module and reboot: # ovs-dpctl dump-flows recirc_id(0),tunnel(tun_id=0x0,src=192.168.122.202,dst=192.168.122.227,ttl=64,flags(-df-csum+key)),in_port(1),skb_mark(0),eth(src=52:f9:67:de:f0:4b,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=10.0.0.68,tip=10.0.0.111,op=1/0xff), packets:23, bytes:966, used:0.289s, actions:2,set(tunnel(tun_id=0x0,dst=192.168.122.21,ttl=64,tp_src=7291,tp_dst=6081,flags(df|key))),3 _______________________________________________ discuss mailing list disc...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-discuss