switchdev - no more sdk

Post on 17-Feb-2017

302 Views

Category:

Software

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Elad Raz, Jiri Pirko

Kernel TLV | 2016

Switchdev – No More SDK

© 2016 Mellanox Technologies 2

Switchdev is here to stay

What?

Why?

Where?

© 2016 Mellanox Technologies 3

Switchdev is here to stay

What?

Why?

Where?

© 2016 Mellanox Technologies 4

Switchdev is here to stay

What?

64 net-devicesDoing skb rx/tx, ethtool, port state and ndo offload

© 2016 Mellanox Technologies 5

Switchdev is here to stay

What?

switchdev_ops.1D/.1Q Bridging – VLANs, PVID, FDB, IGMP…

Routing – FIB offload

and more

© 2016 Mellanox Technologies 6

Switchdev is here to stay

What?

In-kernel implementation

NO MORE SDK!drivers/net/ethernet/mellanox/mlxsw

© 2016 Mellanox Technologies 7

Switchdev is here to stay

Devlinkset port type, port splitter, shared buffers, etc.

What?

© 2016 Mellanox Technologies 8

Switchdev is here to stay

QoS, Shared bufferDCBNL interface implementation

What?

© 2016 Mellanox Technologies 9

Switchdev is here to stay

L3 offloadfix the current switchdev model, include VRF support

What?

© 2016 Mellanox Technologies 10

Switchdev is here to stay

What?

Why?

Where?

pen

© 2016 Mellanox Technologies 11

Switchdev is here to stay

Why?

Community based

Open-source

Standard behavior

Standard API

© 2016 Mellanox Technologies 12

Switchdev is here to stay

What?

Why?

Where?

© 2016 Mellanox Technologies 13

Switchdev is here to stay

Where?

Flowstc cls_flower + selected acts offload

© 2016 Mellanox Technologies 14

Switchdev is here to stay

Where?

(e)BPF?

© 2016 Mellanox Technologies 15

SWITCHDEV

commit 007f790c8276271de26416f90d55561bcc96588a

Author: Jiri Pirko <jiri@resnulli.us>

Date: Fri Nov 28 14:34:17 2014 +0100

net: introduce generic switch devices support

The goal of this is to provide a possibility to support various switch

chips. Drivers should implement relevant ndos to do so. Now there is

only one ndo defined:

- for getting physical switch id is in place.

Note that user can use random port netdevice to access the switch.

Signed-off-by: Jiri Pirko <jiri@resnulli.us>

Reviewed-by: Thomas Graf <tgraf@suug.ch>

Acked-by: Andy Gospodarek <gospo@cumulusnetworks.com>

Signed-off-by: David S. Miller <davem@davemloft.net>

© 2016 Mellanox Technologies 16

ROCKER

commit 4b8ac9660af07be6f6602b523929793eed314997

Author: Jiri Pirko <jiri@resnulli.us>

Date: Fri Nov 28 14:34:26 2014 +0100

rocker: introduce rocker switch driver

This patch introduces the first driver to benefit from the switchdev

infrastructure and to implement newly introduced switch ndos. This is a

driver for emulated switch chip implemented in qemu:

https://github.com/sfeldma/qemu-rocker/

This patch is a result of joint work with Scott Feldman.

Signed-off-by: Scott Feldman <sfeldma@gmail.com>

Signed-off-by: Jiri Pirko <jiri@resnulli.us>

Reviewed-by: Thomas Graf <tgraf@suug.ch>

Reviewed-by: John Fastabend <john.r.fastabend@intel.com>

Signed-off-by: David S. Miller <davem@davemloft.net>

© 2016 Mellanox Technologies 17

MLXSW

commit 93c1edb27f9e7ef7f276b91763c93242bbda71cb

Author: Jiri Pirko <jiri@mellanox.com>

Date: Wed Jul 29 23:33:46 2015 +0200

mlxsw: Introduce Mellanox switch driver core

Add core components of Mellanox switch driver infrastructure.

Core infrastructure is designed so that it can be used by multiple

bus drivers (PCI now, I2C and SGMII are planned to be implemented

in the future). Multiple switch kind drivers can be registered as well.

This core serves as a glue between buses and drivers.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>

Signed-off-by: Ido Schimmel <idosch@mellanox.com>

Signed-off-by: Elad Raz <eladr@mellanox.com>

Reviewed-by: Scott Feldman <sfeldma@gmail.com>

Signed-off-by: David S. Miller <davem@davemloft.net>

© 2016 Mellanox Technologies 18

ndo_ops

static const struct net_device_ops mlxsw_sp_port_netdev_ops = {

.ndo_open = mlxsw_sp_port_open,

.ndo_stop = mlxsw_sp_port_stop,

.ndo_start_xmit = mlxsw_sp_port_xmit,

.ndo_set_rx_mode = mlxsw_sp_set_rx_mode,

.ndo_set_mac_address = mlxsw_sp_port_set_mac_address,

.ndo_change_mtu = mlxsw_sp_port_change_mtu,

.ndo_get_stats64 = mlxsw_sp_port_get_stats64,

.ndo_vlan_rx_add_vid = mlxsw_sp_port_add_vid,

.ndo_vlan_rx_kill_vid = mlxsw_sp_port_kill_vid,

.ndo_fdb_add = switchdev_port_fdb_add,

.ndo_fdb_del = switchdev_port_fdb_del,

.ndo_fdb_dump = switchdev_port_fdb_dump,

.ndo_bridge_setlink = switchdev_port_bridge_setlink,

.ndo_bridge_getlink = switchdev_port_bridge_getlink,

.ndo_bridge_dellink = switchdev_port_bridge_dellink,

};

© 2016 Mellanox Technologies 19

switchdev_ops

static const struct switchdev_ops mlxsw_sp_port_switchdev_ops = {

.switchdev_port_attr_get = mlxsw_sp_port_attr_get,

.switchdev_port_attr_set = mlxsw_sp_port_attr_set,

.switchdev_port_obj_add = mlxsw_sp_port_obj_add,

.switchdev_port_obj_del = mlxsw_sp_port_obj_del,

.switchdev_port_obj_dump = mlxsw_sp_port_obj_dump,

};

© 2016 Mellanox Technologies 20

switchdev_attr

enum switchdev_attr_id {

SWITCHDEV_ATTR_ID_UNDEFINED,

SWITCHDEV_ATTR_ID_PORT_PARENT_ID,

SWITCHDEV_ATTR_ID_PORT_STP_STATE,

SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS,

SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME,

SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING,

};

struct switchdev_attr {

struct net_device *orig_dev;

enum switchdev_attr_id id;

u32 flags;

void *complete_priv;

void (*complete)(struct net_device *dev, int err, void *priv);

union {

struct netdev_phys_item_id ppid; /* PORT_PARENT_ID */

u8 stp_state; /* PORT_STP_STATE */

unsigned long brport_flags; /* PORT_BRIDGE_FLAGS */

u32 ageing_time; /* BRIDGE_AGEING_TIME */

bool vlan_filtering; /* BRIDGE_VLAN_FILTERING */

} u;

};

© 2016 Mellanox Technologies 21

switchdev_obj

enum switchdev_obj_id {

SWITCHDEV_OBJ_ID_UNDEFINED,

SWITCHDEV_OBJ_ID_PORT_VLAN,

SWITCHDEV_OBJ_ID_IPV4_FIB,

SWITCHDEV_OBJ_ID_PORT_FDB,

SWITCHDEV_OBJ_ID_PORT_MDB,

};

struct switchdev_obj {

struct net_device *orig_dev;

enum switchdev_obj_id id;

u32 flags;

void *complete_priv;

void (*complete)(struct net_device *dev, int err, void *priv);

};

/* SWITCHDEV_OBJ_ID_PORT_FDB */

struct switchdev_obj_port_fdb {

struct switchdev_obj obj;

unsigned char addr[ETH_ALEN];

u16 vid;

u16 ndm_state;

};

© 2016 Mellanox Technologies 22

call_switchdev_notifiers

info.addr = mac;

info.vid = vid;

notifier_type = adding ? SWITCHDEV_FDB_ADD : SWITCHDEV_FDB_DEL;

call_switchdev_notifiers(notifier_type, dev, &info.info);

© 2016 Mellanox Technologies 23

NETDEV_CHANGEUPPER

register_netdevice_notifier informs using

NETDEV_(PRE)CHANGEUPPER about:

• VLANs

• Bridges

• LAGs (Team/bond)

Thank You

top related