Skip to content

Commit

Permalink
vswitchd: Introduce 'mtu_request' column in Interface.
Browse files Browse the repository at this point in the history
The 'mtu_request' column can be used to set the MTU of a specific
interface.

This column is useful because it will allow changing the MTU of DPDK
devices (implemented in a future commit), which are not accessible
outside the ovs-vswitchd process, but it can be used for kernel
interfaces as well.

The current implementation of set_mtu() in netdev-dpdk is removed
because it's broken.  It will be reintroduced by a subsequent commit on
this series.

Signed-off-by: Daniele Di Proietto <[email protected]>
Acked-by: Ilya Maximets <[email protected]>
  • Loading branch information
ddiproietto committed Aug 13, 2016
1 parent ad44446 commit 56abcf4
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 68 deletions.
2 changes: 2 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ Post-v2.5.0
- ovs-pki: Changed message digest algorithm from SHA-1 to SHA-512 because
SHA-1 is no longer secure and some operating systems have started to
disable it in OpenSSL.
- Add 'mtu_request' column to the Interface table. It can be used to
configure the MTU of non-internal ports.


v2.5.0 - 26 Feb 2016
Expand Down
53 changes: 1 addition & 52 deletions lib/netdev-dpdk.c
Original file line number Diff line number Diff line change
Expand Up @@ -1649,57 +1649,6 @@ netdev_dpdk_get_mtu(const struct netdev *netdev, int *mtup)
return 0;
}

static int
netdev_dpdk_set_mtu(const struct netdev *netdev, int mtu)
{
struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
int old_mtu, err, dpdk_mtu;
struct dpdk_mp *old_mp;
struct dpdk_mp *mp;
uint32_t buf_size;

ovs_mutex_lock(&dpdk_mutex);
ovs_mutex_lock(&dev->mutex);
if (dev->mtu == mtu) {
err = 0;
goto out;
}

buf_size = dpdk_buf_size(mtu);
dpdk_mtu = FRAME_LEN_TO_MTU(buf_size);

mp = dpdk_mp_get(dev->socket_id, dpdk_mtu);
if (!mp) {
err = ENOMEM;
goto out;
}

rte_eth_dev_stop(dev->port_id);

old_mtu = dev->mtu;
old_mp = dev->dpdk_mp;
dev->dpdk_mp = mp;
dev->mtu = mtu;
dev->max_packet_len = MTU_TO_FRAME_LEN(dev->mtu);

err = dpdk_eth_dev_init(dev);
if (err) {
dpdk_mp_put(mp);
dev->mtu = old_mtu;
dev->dpdk_mp = old_mp;
dev->max_packet_len = MTU_TO_FRAME_LEN(dev->mtu);
dpdk_eth_dev_init(dev);
goto out;
}

dpdk_mp_put(old_mp);
netdev_change_seq_changed(netdev);
out:
ovs_mutex_unlock(&dev->mutex);
ovs_mutex_unlock(&dpdk_mutex);
return err;
}

static int
netdev_dpdk_get_carrier(const struct netdev *netdev, bool *carrier);

Expand Down Expand Up @@ -2995,7 +2944,7 @@ netdev_dpdk_vhost_cuse_reconfigure(struct netdev *netdev)
netdev_dpdk_set_etheraddr, \
netdev_dpdk_get_etheraddr, \
netdev_dpdk_get_mtu, \
netdev_dpdk_set_mtu, \
NULL, /* set_mtu */ \
netdev_dpdk_get_ifindex, \
GET_CARRIER, \
netdev_dpdk_get_carrier_resets, \
Expand Down
9 changes: 9 additions & 0 deletions vswitchd/bridge.c
Original file line number Diff line number Diff line change
Expand Up @@ -775,6 +775,15 @@ bridge_delete_or_reconfigure_ports(struct bridge *br)
goto delete;
}

if (iface->cfg->n_mtu_request == 1
&& strcmp(iface->type,
ofproto_port_open_type(br->type, "internal"))) {
/* Try to set the MTU to the requested value. This is not done
* for internal interfaces, since their MTU is decided by the
* ofproto module, based on other ports in the bridge. */
netdev_set_mtu(iface->netdev, *iface->cfg->mtu_request);
}

/* If the requested OpenFlow port for 'iface' changed, and it's not
* already the correct port, then we might want to temporarily delete
* this interface, so we can add it back again with the new OpenFlow
Expand Down
10 changes: 8 additions & 2 deletions vswitchd/vswitch.ovsschema
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{"name": "Open_vSwitch",
"version": "7.13.0",
"cksum": "889248633 22774",
"version": "7.14.0",
"cksum": "3974332717 22936",
"tables": {
"Open_vSwitch": {
"columns": {
Expand Down Expand Up @@ -321,6 +321,12 @@
"mtu": {
"type": {"key": "integer", "min": 0, "max": 1},
"ephemeral": true},
"mtu_request": {
"type": {
"key": {"type": "integer",
"minInteger": 1},
"min": 0,
"max": 1}},
"error": {
"type": {"key": "string", "min": 0, "max": 1}}},
"indexes": [["name"]]},
Expand Down
52 changes: 38 additions & 14 deletions vswitchd/vswitch.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2380,6 +2380,44 @@
</column>
</group>

<group title="MTU">
<p>
The MTU (maximum transmission unit) is the largest amount of data
that can fit into a single Ethernet frame. The standard Ethernet
MTU is 1500 bytes. Some physical media and many kinds of virtual
interfaces can be configured with higher MTUs.
</p>

<p>
A client may change a non-internal interface MTU by filling in
<ref column="mtu_request"/>. Internal interfaces MTU, instead, is set
by Open vSwitch to the minimum of non-internal interfaces MTU in the
bridge. In any case, Open vSwitch then reports in <ref column="mtu"/>
the currently configured value.
</p>

<column name="mtu">
<p>
This column will be empty for an interface that does not
have an MTU as, for example, some kinds of tunnels do not.
</p>

<p>
Open vSwitch sets this column's value, so other clients should treat
it as read-only.
</p>
</column>

<column name="mtu_request"
type='{"type": "integer", "minInteger": 1}'>
<p>
Requested MTU (Maximum Transmission Unit) for the interface. A client
can fill this column to change the MTU of a non-internal interface.
</p>
</column>

</group>

<group title="Interface Status">
<p>
Status information about interfaces attached to bridges, updated every
Expand Down Expand Up @@ -2422,20 +2460,6 @@
</p>
</column>

<column name="mtu">
<p>
The MTU (maximum transmission unit); i.e. the largest
amount of data that can fit into a single Ethernet frame.
The standard Ethernet MTU is 1500 bytes. Some physical media
and many kinds of virtual interfaces can be configured with
higher MTUs.
</p>
<p>
This column will be empty for an interface that does not
have an MTU as, for example, some kinds of tunnels do not.
</p>
</column>

<column name="lacp_current">
Boolean value indicating LACP status for this interface. If true, this
interface has current LACP information about its LACP partner. This
Expand Down

0 comments on commit 56abcf4

Please sign in to comment.