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>
This commit is contained in:
Jiri Pirko
2014-11-28 14:34:17 +01:00
committed by David S. Miller
parent 02637fce3e
commit 007f790c82
9 changed files with 161 additions and 0 deletions

13
net/switchdev/Kconfig Normal file
View File

@@ -0,0 +1,13 @@
#
# Configuration for Switch device support
#
config NET_SWITCHDEV
boolean "Switch (and switch-ish) device support (EXPERIMENTAL)"
depends on INET
---help---
This module provides glue between core networking code and device
drivers in order to support hardware switch chips in very generic
meaning of the word "switch". This include devices supporting L2/L3 but
also various flow offloading chips, including switches embedded into
SR-IOV NICs.

5
net/switchdev/Makefile Normal file
View File

@@ -0,0 +1,5 @@
#
# Makefile for the Switch device API
#
obj-$(CONFIG_NET_SWITCHDEV) += switchdev.o

33
net/switchdev/switchdev.c Normal file
View File

@@ -0,0 +1,33 @@
/*
* net/switchdev/switchdev.c - Switch device API
* Copyright (c) 2014 Jiri Pirko <jiri@resnulli.us>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/init.h>
#include <linux/netdevice.h>
#include <net/switchdev.h>
/**
* netdev_switch_parent_id_get - Get ID of a switch
* @dev: port device
* @psid: switch ID
*
* Get ID of a switch this port is part of.
*/
int netdev_switch_parent_id_get(struct net_device *dev,
struct netdev_phys_item_id *psid)
{
const struct net_device_ops *ops = dev->netdev_ops;
if (!ops->ndo_switch_parent_id_get)
return -EOPNOTSUPP;
return ops->ndo_switch_parent_id_get(dev, psid);
}
EXPORT_SYMBOL(netdev_switch_parent_id_get);