Passes ingress_sched config item from other_config column of Interface table to the netdev.
Signed-off-by: Billy O'Mahony <billy.o.mah...@intel.com> --- lib/netdev-bsd.c | 1 + lib/netdev-dpdk.c | 19 +++++++++++++++++++ lib/netdev-dummy.c | 1 + lib/netdev-linux.c | 1 + lib/netdev-provider.h | 10 ++++++++++ lib/netdev-vport.c | 1 + lib/netdev.c | 22 ++++++++++++++++++++++ lib/netdev.h | 1 + vswitchd/bridge.c | 2 ++ 9 files changed, 58 insertions(+) diff --git a/lib/netdev-bsd.c b/lib/netdev-bsd.c index f863a18..5582b0f 100644 --- a/lib/netdev-bsd.c +++ b/lib/netdev-bsd.c @@ -1509,6 +1509,7 @@ netdev_bsd_update_flags(struct netdev *netdev_, enum netdev_flags off, netdev_bsd_get_etheraddr, \ netdev_bsd_get_mtu, \ NULL, /* set_mtu */ \ + NULL, /* set_ingress_sched */ \ netdev_bsd_get_ifindex, \ netdev_bsd_get_carrier, \ NULL, /* get_carrier_resets */ \ diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 2c92bd3..d14c381 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -368,6 +368,9 @@ struct netdev_dpdk { /* If true, device was attached by rte_eth_dev_attach(). */ bool attached; + /* Ingress Scheduling config */ + char *ingress_sched_str; + /* In dpdk_list. */ struct ovs_list list_node OVS_GUARDED_BY(dpdk_mutex); @@ -1028,6 +1031,7 @@ netdev_dpdk_destruct(struct netdev *netdev) } free(dev->devargs); + free(dev->ingress_sched_str); common_destruct(dev); ovs_mutex_unlock(&dpdk_mutex); @@ -1963,6 +1967,20 @@ netdev_dpdk_set_mtu(struct netdev *netdev, int mtu) } static int +netdev_dpdk_set_ingress_sched(struct netdev *netdev, + const char *ingress_sched_str) +{ + struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); + + free(dev->ingress_sched_str); + if (ingress_sched_str) { + dev->ingress_sched_str = xstrdup(ingress_sched_str); + } + + return 0; +} + +static int netdev_dpdk_get_carrier(const struct netdev *netdev, bool *carrier); static int @@ -3268,6 +3286,7 @@ unlock: netdev_dpdk_get_etheraddr, \ netdev_dpdk_get_mtu, \ netdev_dpdk_set_mtu, \ + netdev_dpdk_set_ingress_sched, \ netdev_dpdk_get_ifindex, \ GET_CARRIER, \ netdev_dpdk_get_carrier_resets, \ diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index d189a86..9c8a9aa 100644 --- a/lib/netdev-dummy.c +++ b/lib/netdev-dummy.c @@ -1374,6 +1374,7 @@ netdev_dummy_update_flags(struct netdev *netdev_, netdev_dummy_get_etheraddr, \ netdev_dummy_get_mtu, \ netdev_dummy_set_mtu, \ + NULL, /* set_ingress_sched */ \ netdev_dummy_get_ifindex, \ NULL, /* get_carrier */ \ NULL, /* get_carrier_resets */ \ diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 44dfac5..4186b24 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -2827,6 +2827,7 @@ netdev_linux_update_flags(struct netdev *netdev_, enum netdev_flags off, netdev_linux_get_etheraddr, \ netdev_linux_get_mtu, \ netdev_linux_set_mtu, \ + NULL, /* set_ingress_sched */ \ netdev_linux_get_ifindex, \ netdev_linux_get_carrier, \ netdev_linux_get_carrier_resets, \ diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h index 79143d2..36c1c5e 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -34,6 +34,7 @@ extern "C" { struct netdev_tnl_build_header_params; #define NETDEV_NUMA_UNSPEC OVS_NUMA_UNSPEC +#define NETDEV_UNSPEC (-1) /* A network device (e.g. an Ethernet device). * @@ -72,6 +73,7 @@ struct netdev { * modify them. */ int n_txq; int n_rxq; + int priority_rxq; /* id of prioritized rxq. -1 = None */ int ref_cnt; /* Times this devices was opened. */ struct shash_node *node; /* Pointer to element in global map. */ struct ovs_list saved_flags_list; /* Contains "struct netdev_saved_flags". */ @@ -408,6 +410,14 @@ struct netdev_class { * null if it would always return EOPNOTSUPP. */ int (*set_mtu)(struct netdev *netdev, int mtu); + /* Sets 'netdev''s ingress scheduling policy. + * + * If 'netdev' does not support the specified policy then + * this function should return EOPNOTSUPP. This function may be set to + * null if it would always return EOPNOTSUPP. */ + int (*set_ingress_sched)(struct netdev *netdev, + const char *ingress_sched_str); + /* Returns the ifindex of 'netdev', if successful, as a positive number. * On failure, returns a negative errno value. * diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c index fc02438..6296479 100644 --- a/lib/netdev-vport.c +++ b/lib/netdev-vport.c @@ -834,6 +834,7 @@ get_stats(const struct netdev *netdev, struct netdev_stats *stats) netdev_vport_get_etheraddr, \ NULL, /* get_mtu */ \ NULL, /* set_mtu */ \ + NULL, /* set_ingress_sched */ \ NULL, /* get_ifindex */ \ NULL, /* get_carrier */ \ NULL, /* get_carrier_resets */ \ diff --git a/lib/netdev.c b/lib/netdev.c index 5008a43..ade3b0c 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -391,6 +391,7 @@ netdev_open(const char *name, const char *type, struct netdev **netdevp) /* By default enable one tx and rx queue per netdev. */ netdev->n_txq = netdev->netdev_class->send ? 1 : 0; netdev->n_rxq = netdev->netdev_class->rxq_alloc ? 1 : 0; + netdev->priority_rxq = NETDEV_UNSPEC; ovs_list_init(&netdev->saved_flags_list); @@ -943,6 +944,27 @@ netdev_mtu_is_user_config(struct netdev *netdev) return netdev->mtu_user_config; } +/* Sets the Ingress Scheduling policy of 'netdev'. + * + * If successful, returns 0. Returns EOPNOTSUPP if 'netdev' does not support + * the specified policy */ +int +netdev_set_ingress_sched(struct netdev *netdev, const char *ingress_sched_str) +{ + const struct netdev_class *class = netdev->netdev_class; + int error; + + error = class->set_ingress_sched ? + class->set_ingress_sched(netdev, ingress_sched_str) : EOPNOTSUPP; + if (error && error != EOPNOTSUPP) { + VLOG_DBG_RL(&rl, "failed to set ingress scheduling for network " \ + "device %s: %s", + netdev_get_name(netdev), ovs_strerror(error)); + } + + return error; +} + /* Returns the ifindex of 'netdev', if successful, as a positive number. On * failure, returns a negative errno value. * diff --git a/lib/netdev.h b/lib/netdev.h index 5572366..9089a4d 100644 --- a/lib/netdev.h +++ b/lib/netdev.h @@ -138,6 +138,7 @@ int netdev_get_mtu(const struct netdev *, int *mtup); int netdev_set_mtu(struct netdev *, int mtu); void netdev_mtu_user_config(struct netdev *, bool); bool netdev_mtu_is_user_config(struct netdev *); +int netdev_set_ingress_sched(struct netdev *, const char *ingress_sched_str); int netdev_get_ifindex(const struct netdev *); int netdev_set_tx_multiq(struct netdev *, unsigned int n_txq); diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 8336d70..f193f54 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -1795,6 +1795,8 @@ iface_do_create(const struct bridge *br, } iface_set_netdev_mtu(iface_cfg, netdev); + netdev_set_ingress_sched(netdev, + smap_get(&iface_cfg->other_config, "ingress_sched")); *ofp_portp = iface_pick_ofport(iface_cfg); error = ofproto_port_add(br->ofproto, netdev, ofp_portp); -- 2.7.4 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev