switchdev.h 5.1 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 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
struct fib_info;

/**
 * struct switchdev_ops - switchdev operations
 *
 * int (*swdev_parent_id_get)(struct net_device *dev,
 *			      struct netdev_phys_item_id *psid);
 *	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.
 *
 * int (*swdev_port_stp_update)(struct net_device *dev, u8 state);
 *	Called to notify switch device port of bridge port STP
 *	state change.
 *
 * 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);
 *	Called to add/modify IPv4 route to switch device.
 *
 * 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);
 *	Called to delete IPv4 route from switch device.
 */
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);
};

55 56 57 58 59
enum netdev_switch_notifier_type {
	NETDEV_SWITCH_FDB_ADD = 1,
	NETDEV_SWITCH_FDB_DEL,
};

60 61 62 63
struct netdev_switch_notifier_info {
	struct net_device *dev;
};

64 65 66 67 68 69
struct netdev_switch_notifier_fdb_info {
	struct netdev_switch_notifier_info info; /* must be first */
	const unsigned char *addr;
	u16 vid;
};

70 71 72 73 74
static inline struct net_device *
netdev_switch_notifier_info_to_dev(const struct netdev_switch_notifier_info *info)
{
	return info->dev;
}
75 76 77 78 79

#ifdef CONFIG_NET_SWITCHDEV

int netdev_switch_parent_id_get(struct net_device *dev,
				struct netdev_phys_item_id *psid);
80
int netdev_switch_port_stp_update(struct net_device *dev, u8 state);
81 82 83 84
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);
85 86 87 88 89 90 91 92
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);
93
int netdev_switch_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
94
			       u8 tos, u8 type, u32 nlflags, u32 tb_id);
95 96
int netdev_switch_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
			       u8 tos, u8 type, u32 tb_id);
97
void netdev_switch_fib_ipv4_abort(struct fib_info *fi);
98

99 100 101 102 103 104 105 106
#else

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

107 108 109 110 111 112
static inline int netdev_switch_port_stp_update(struct net_device *dev,
						u8 state)
{
	return -EOPNOTSUPP;
}

113 114 115 116 117 118 119 120 121 122 123
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,
124
					       struct netdev_switch_notifier_info *info)
125 126 127 128
{
	return NOTIFY_DONE;
}

129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
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;
}

157 158
static inline int netdev_switch_fib_ipv4_add(u32 dst, int dst_len,
					     struct fib_info *fi,
159 160
					     u8 tos, u8 type,
					     u32 nlflags, u32 tb_id)
161 162 163 164 165 166 167 168 169 170 171
{
	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;
}

172
static inline void netdev_switch_fib_ipv4_abort(struct fib_info *fi)
173 174 175
{
}

176 177 178
#endif

#endif /* _LINUX_SWITCHDEV_H_ */