switchdev.h 4.7 KB
Newer Older
1 2 3
/*
 * include/net/switchdev.h - Switch device API
 * Copyright (c) 2014 Jiri Pirko <jiri@resnulli.us>
4
 * Copyright (c) 2014-2015 Scott Feldman <sfeldma@gmail.com>
5 6 7 8 9 10 11 12 13 14
 *
 * 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.
 */
#ifndef _LINUX_SWITCHDEV_H_
#define _LINUX_SWITCHDEV_H_

#include <linux/netdevice.h>
15 16
#include <linux/notifier.h>

S
Scott Feldman 已提交
17 18 19 20 21
struct fib_info;

/**
 * struct switchdev_ops - switchdev operations
 *
22 23 24
 * @swdev_parent_id_get: Called to get an ID of the switch chip this port
 *   is part of.  If driver implements this, it indicates that it
 *   represents a port of a switch chip.
S
Scott Feldman 已提交
25
 *
26 27
 * @swdev_port_stp_update: Called to notify switch device port of bridge
 *   port STP state change.
S
Scott Feldman 已提交
28
 *
29
 * @swdev_fib_ipv4_add: Called to add/modify IPv4 route to switch device.
S
Scott Feldman 已提交
30
 *
31
 * @swdev_fib_ipv4_del: Called to delete IPv4 route from switch device.
S
Scott Feldman 已提交
32 33 34 35 36 37 38 39 40 41 42 43 44 45
 */
struct swdev_ops {
	int	(*swdev_parent_id_get)(struct net_device *dev,
				       struct netdev_phys_item_id *psid);
	int	(*swdev_port_stp_update)(struct net_device *dev, u8 state);
	int	(*swdev_fib_ipv4_add)(struct net_device *dev, __be32 dst,
				      int dst_len, struct fib_info *fi,
				      u8 tos, u8 type, u32 nlflags,
				      u32 tb_id);
	int	(*swdev_fib_ipv4_del)(struct net_device *dev, __be32 dst,
				      int dst_len, struct fib_info *fi,
				      u8 tos, u8 type, u32 tb_id);
};

46 47 48 49 50
enum netdev_switch_notifier_type {
	NETDEV_SWITCH_FDB_ADD = 1,
	NETDEV_SWITCH_FDB_DEL,
};

51 52 53 54
struct netdev_switch_notifier_info {
	struct net_device *dev;
};

55 56 57 58 59 60
struct netdev_switch_notifier_fdb_info {
	struct netdev_switch_notifier_info info; /* must be first */
	const unsigned char *addr;
	u16 vid;
};

61 62 63 64 65
static inline struct net_device *
netdev_switch_notifier_info_to_dev(const struct netdev_switch_notifier_info *info)
{
	return info->dev;
}
66 67 68 69 70

#ifdef CONFIG_NET_SWITCHDEV

int netdev_switch_parent_id_get(struct net_device *dev,
				struct netdev_phys_item_id *psid);
71
int netdev_switch_port_stp_update(struct net_device *dev, u8 state);
72 73 74 75
int register_netdev_switch_notifier(struct notifier_block *nb);
int unregister_netdev_switch_notifier(struct notifier_block *nb);
int call_netdev_switch_notifiers(unsigned long val, struct net_device *dev,
				 struct netdev_switch_notifier_info *info);
76 77 78 79 80 81 82 83
int netdev_switch_port_bridge_setlink(struct net_device *dev,
				struct nlmsghdr *nlh, u16 flags);
int netdev_switch_port_bridge_dellink(struct net_device *dev,
				struct nlmsghdr *nlh, u16 flags);
int ndo_dflt_netdev_switch_port_bridge_dellink(struct net_device *dev,
					       struct nlmsghdr *nlh, u16 flags);
int ndo_dflt_netdev_switch_port_bridge_setlink(struct net_device *dev,
					       struct nlmsghdr *nlh, u16 flags);
84
int netdev_switch_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
85
			       u8 tos, u8 type, u32 nlflags, u32 tb_id);
86 87
int netdev_switch_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
			       u8 tos, u8 type, u32 tb_id);
88
void netdev_switch_fib_ipv4_abort(struct fib_info *fi);
89

90 91 92 93 94 95 96 97
#else

static inline int netdev_switch_parent_id_get(struct net_device *dev,
					      struct netdev_phys_item_id *psid)
{
	return -EOPNOTSUPP;
}

98 99 100 101 102 103
static inline int netdev_switch_port_stp_update(struct net_device *dev,
						u8 state)
{
	return -EOPNOTSUPP;
}

104 105 106 107 108 109 110 111 112 113 114
static inline int register_netdev_switch_notifier(struct notifier_block *nb)
{
	return 0;
}

static inline int unregister_netdev_switch_notifier(struct notifier_block *nb)
{
	return 0;
}

static inline int call_netdev_switch_notifiers(unsigned long val, struct net_device *dev,
115
					       struct netdev_switch_notifier_info *info)
116 117 118 119
{
	return NOTIFY_DONE;
}

120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
static inline int netdev_switch_port_bridge_setlink(struct net_device *dev,
						    struct nlmsghdr *nlh,
						    u16 flags)
{
	return -EOPNOTSUPP;
}

static inline int netdev_switch_port_bridge_dellink(struct net_device *dev,
						    struct nlmsghdr *nlh,
						    u16 flags)
{
	return -EOPNOTSUPP;
}

static inline int ndo_dflt_netdev_switch_port_bridge_dellink(struct net_device *dev,
							struct nlmsghdr *nlh,
							u16 flags)
{
	return 0;
}

static inline int ndo_dflt_netdev_switch_port_bridge_setlink(struct net_device *dev,
							struct nlmsghdr *nlh,
							u16 flags)
{
	return 0;
}

148 149
static inline int netdev_switch_fib_ipv4_add(u32 dst, int dst_len,
					     struct fib_info *fi,
150 151
					     u8 tos, u8 type,
					     u32 nlflags, u32 tb_id)
152 153 154 155 156 157 158 159 160 161 162
{
	return 0;
}

static inline int netdev_switch_fib_ipv4_del(u32 dst, int dst_len,
					     struct fib_info *fi,
					     u8 tos, u8 type, u32 tb_id)
{
	return 0;
}

163
static inline void netdev_switch_fib_ipv4_abort(struct fib_info *fi)
164 165 166
{
}

167 168 169
#endif

#endif /* _LINUX_SWITCHDEV_H_ */