aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/switchdev.h
blob: 1a9382febcc3b3ab3e63a183ccc49d647dc8e83e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
 * include/net/switchdev.h - Switch device API
 * Copyright (c) 2014 Jiri Pirko <jiri@resnulli.us>
 * Copyright (c) 2014-2015 Scott Feldman <sfeldma@gmail.com>
 *
 * 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>
#include <linux/notifier.h>

enum netdev_switch_notifier_type {
	NETDEV_SWITCH_FDB_ADD = 1,
	NETDEV_SWITCH_FDB_DEL,
};

struct netdev_switch_notifier_info {
	struct net_device *dev;
};

struct netdev_switch_notifier_fdb_info {
	struct netdev_switch_notifier_info info; /* must be first */
	const unsigned char *addr;
	u16 vid;
};

static inline struct net_device *
netdev_switch_notifier_info_to_dev(const struct netdev_switch_notifier_info *info)
{
	return info->dev;
}

#ifdef CONFIG_NET_SWITCHDEV

int netdev_switch_parent_id_get(struct net_device *dev,
				struct netdev_phys_item_id *psid);
int netdev_switch_port_stp_update(struct net_device *dev, u8 state);
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);
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);
int netdev_switch_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
			       u8 tos, u8 type, u32 nlflags, u32 tb_id);
int netdev_switch_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
			       u8 tos, u8 type, u32 tb_id);
void netdev_switch_fib_ipv4_abort(struct fib_info *fi);

#else

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

static inline int netdev_switch_port_stp_update(struct net_device *dev,
						u8 state)
{
	return -EOPNOTSUPP;
}

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,
					       struct netdev_switch_notifier_info *info)
{
	return NOTIFY_DONE;
}

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;
}

static inline int netdev_switch_fib_ipv4_add(u32 dst, int dst_len,
					     struct fib_info *fi,
					     u8 tos, u8 type,
					     u32 nlflags, u32 tb_id)
{
	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;
}

static inline void netdev_switch_fib_ipv4_abort(struct fib_info *fi)
{
}

#endif

#endif /* _LINUX_SWITCHDEV_H_ */