X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fdpif-linux.c;h=7293063fe79ec3dedd2eecc7b75e1bfa1703e076;hb=485e2766d816a18e1a51ddf5e12e55f38aeedf89;hp=c7a074628246ca5bec82be0f4a6a3b003d937dda;hpb=b9ad7294a5b4faf886a5022c5ec53b500f93cf3f;p=sliver-openvswitch.git diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c index c7a074628..7293063fe 100644 --- a/lib/dpif-linux.c +++ b/lib/dpif-linux.c @@ -47,7 +47,6 @@ #include "odp-util.h" #include "ofpbuf.h" #include "openvswitch/datapath-compat.h" -#include "openvswitch/tunnel.h" #include "packets.h" #include "poll-loop.h" #include "random.h" @@ -439,12 +438,12 @@ get_vport_type(const struct dpif_linux_vport *vport) case OVS_VPORT_TYPE_GRE64: return "gre64"; - case OVS_VPORT_TYPE_CAPWAP: - return "capwap"; - case OVS_VPORT_TYPE_VXLAN: return "vxlan"; + case OVS_VPORT_TYPE_LISP: + return "lisp"; + case OVS_VPORT_TYPE_UNSPEC: case __OVS_VPORT_TYPE_MAX: break; @@ -455,17 +454,42 @@ get_vport_type(const struct dpif_linux_vport *vport) return "unknown"; } +static enum ovs_vport_type +netdev_to_ovs_vport_type(const struct netdev *netdev) +{ + const char *type = netdev_get_type(netdev); + + if (!strcmp(type, "tap") || !strcmp(type, "system")) { + return OVS_VPORT_TYPE_NETDEV; + } else if (!strcmp(type, "internal")) { + return OVS_VPORT_TYPE_INTERNAL; + } else if (strstr(type, "gre64")) { + return OVS_VPORT_TYPE_GRE64; + } else if (strstr(type, "gre")) { + return OVS_VPORT_TYPE_GRE; + } else if (!strcmp(type, "vxlan")) { + return OVS_VPORT_TYPE_VXLAN; + } else if (!strcmp(type, "lisp")) { + return OVS_VPORT_TYPE_LISP; + } else { + return OVS_VPORT_TYPE_UNSPEC; + } +} + static int dpif_linux_port_add(struct dpif *dpif_, struct netdev *netdev, uint32_t *port_nop) { struct dpif_linux *dpif = dpif_linux_cast(dpif_); + const struct netdev_tunnel_config *tnl_cfg; const char *name = netdev_vport_get_dpif_port(netdev); const char *type = netdev_get_type(netdev); struct dpif_linux_vport request, reply; struct nl_sock *sock = NULL; uint32_t upcall_pid; struct ofpbuf *buf; + uint64_t options_stub[64 / 8]; + struct ofpbuf options; int error; if (dpif->epoll_fd >= 0) { @@ -478,7 +502,7 @@ dpif_linux_port_add(struct dpif *dpif_, struct netdev *netdev, dpif_linux_vport_init(&request); request.cmd = OVS_VPORT_CMD_NEW; request.dp_ifindex = dpif->dp_ifindex; - request.type = netdev_vport_get_vport_type(netdev); + request.type = netdev_to_ovs_vport_type(netdev); if (request.type == OVS_VPORT_TYPE_UNSPEC) { VLOG_WARN_RL(&error_rl, "%s: cannot create port `%s' because it has " "unsupported type `%s'", @@ -492,6 +516,15 @@ dpif_linux_port_add(struct dpif *dpif_, struct netdev *netdev, netdev_linux_ethtool_set_flag(netdev, ETH_FLAG_LRO, "LRO", false); } + tnl_cfg = netdev_get_tunnel_config(netdev); + if (tnl_cfg && tnl_cfg->dst_port != 0) { + ofpbuf_use_stack(&options, options_stub, sizeof options_stub); + nl_msg_put_u16(&options, OVS_TUNNEL_ATTR_DST_PORT, + ntohs(tnl_cfg->dst_port)); + request.options = options.data; + request.options_len = options.size; + } + request.port_no = *port_nop; upcall_pid = sock ? nl_sock_pid(sock) : 0; request.upcall_pid = &upcall_pid; @@ -1203,7 +1236,7 @@ parse_odp_packet(struct ofpbuf *buf, struct dpif_upcall *upcall, [OVS_PACKET_ATTR_KEY] = { .type = NL_A_NESTED }, /* OVS_PACKET_CMD_ACTION only. */ - [OVS_PACKET_ATTR_USERDATA] = { .type = NL_A_U64, .optional = true }, + [OVS_PACKET_ATTR_USERDATA] = { .type = NL_A_UNSPEC, .optional = true }, }; struct ovs_header *ovs_header; @@ -1241,9 +1274,7 @@ parse_odp_packet(struct ofpbuf *buf, struct dpif_upcall *upcall, upcall->key = CONST_CAST(struct nlattr *, nl_attr_get(a[OVS_PACKET_ATTR_KEY])); upcall->key_len = nl_attr_get_size(a[OVS_PACKET_ATTR_KEY]); - upcall->userdata = (a[OVS_PACKET_ATTR_USERDATA] - ? nl_attr_get_u64(a[OVS_PACKET_ATTR_USERDATA]) - : 0); + upcall->userdata = a[OVS_PACKET_ATTR_USERDATA]; *dp_ifindex = ovs_header->dp_ifindex; return 0;