25 #include <netlink-private/netlink.h> 26 #include <netlink/netlink.h> 27 #include <netlink/attr.h> 28 #include <netlink/utils.h> 29 #include <netlink/object.h> 30 #include <netlink/route/rtnl.h> 31 #include <netlink-private/route/link/api.h> 32 #include <netlink/route/link/ipvlan.h> 34 #include <linux/if_link.h> 37 #define IPVLAN_HAS_MODE (1<<0) 47 static struct nla_policy ipvlan_policy[IFLA_IPVLAN_MAX+1] = {
51 static int ipvlan_alloc(
struct rtnl_link *link)
53 struct ipvlan_info *ipi;
56 memset(link->l_info, 0,
sizeof(*ipi));
58 if ((ipi = calloc(1,
sizeof(*ipi))) == NULL)
67 static int ipvlan_parse(
struct rtnl_link *link,
struct nlattr *data,
68 struct nlattr *xstats)
70 struct nlattr *tb[IFLA_IPVLAN_MAX+1];
71 struct ipvlan_info *ipi;
74 NL_DBG(3,
"Parsing IPVLAN link info\n");
79 if ((err = ipvlan_alloc(link)) < 0)
84 if (tb[IFLA_IPVLAN_MODE]) {
86 ipi->ipi_mask |= IPVLAN_HAS_MODE;
94 static void ipvlan_free(
struct rtnl_link *link)
103 struct ipvlan_info *ipi = link->l_info;
105 if (ipi->ipi_mask & IPVLAN_HAS_MODE) {
106 rtnl_link_ipvlan_mode2str(ipi->ipi_mode, buf,
sizeof(buf));
107 nl_dump(p,
"ipvlan-mode %s", buf);
113 struct ipvlan_info *vdst, *vsrc = src->l_info;
124 memcpy(vdst, vsrc,
sizeof(
struct ipvlan_info));
129 static int ipvlan_put_attrs(
struct nl_msg *msg,
struct rtnl_link *link)
131 struct ipvlan_info *ipi = link->l_info;
137 if (ipi->ipi_mask & IPVLAN_HAS_MODE)
147 static struct rtnl_link_info_ops ipvlan_info_ops = {
149 .io_alloc = ipvlan_alloc,
150 .io_parse = ipvlan_parse,
155 .io_clone = ipvlan_clone,
156 .io_put_attrs = ipvlan_put_attrs,
157 .io_free = ipvlan_free,
161 #define IS_IPVLAN_LINK_ASSERT(link) \ 162 if ((link)->l_info_ops != &ipvlan_info_ops) { \ 163 APPBUG("Link is not a ipvlan link. set type \"ipvlan\" first."); \ 164 return -NLE_OPNOTSUPP; \ 202 return link->l_info_ops && !strcmp(link->l_info_ops->io_name,
"ipvlan");
214 struct ipvlan_info *ipi = link->l_info;
216 IS_IPVLAN_LINK_ASSERT(link);
218 ipi->ipi_mode = mode;
219 ipi->ipi_mask |= IPVLAN_HAS_MODE;
233 struct ipvlan_info *ipi = link->l_info;
235 IS_IPVLAN_LINK_ASSERT(link);
237 if (!(ipi->ipi_mask & IPVLAN_HAS_MODE))
239 *out_mode = ipi->ipi_mode;
245 static const struct trans_tbl ipvlan_modes[] = {
246 __ADD(IPVLAN_MODE_L2, l2),
247 __ADD(IPVLAN_MODE_L3, l3),
255 char *rtnl_link_ipvlan_mode2str(
int mode,
char *buf,
size_t len)
257 return __type2str(mode, buf, len, ipvlan_modes, ARRAY_SIZE(ipvlan_modes));
260 int rtnl_link_ipvlan_str2mode(
const char *name)
262 return __str2type(name, ipvlan_modes, ARRAY_SIZE(ipvlan_modes));
267 static void __init ipvlan_init(
void)
272 static void __exit ipvlan_exit(
void)
Dump object briefly on one line.
struct rtnl_link * rtnl_link_ipvlan_alloc(void)
Allocate link object of type IPVLAN.
int rtnl_link_register_info(struct rtnl_link_info_ops *ops)
Register operations for a link info type.
Attribute validation policy.
struct rtnl_link * rtnl_link_alloc(void)
Allocate link object.
Dump all attributes but no statistics.
int nla_nest_end(struct nl_msg *msg, struct nlattr *start)
Finalize nesting of attributes.
int nla_parse_nested(struct nlattr *tb[], int maxtype, struct nlattr *nla, struct nla_policy *policy)
Create attribute index based on nested attribute.
int rtnl_link_is_ipvlan(struct rtnl_link *link)
Check if link is a IPVLAN link.
int rtnl_link_ipvlan_get_mode(struct rtnl_link *link, uint16_t *out_mode)
Get IPVLAN Mode.
int rtnl_link_set_type(struct rtnl_link *link, const char *type)
Set type of link object.
int rtnl_link_unregister_info(struct rtnl_link_info_ops *ops)
Unregister operations for a link info type.
uint16_t type
Type of attribute or NLA_UNSPEC.
uint16_t nla_get_u16(const struct nlattr *nla)
Return payload of 16 bit integer attribute.
#define NLA_PUT_U16(msg, attrtype, value)
Add 16 bit integer attribute to netlink message.
void nl_dump(struct nl_dump_params *params, const char *fmt,...)
Dump a formatted character string.
void rtnl_link_put(struct rtnl_link *link)
Return a link object reference.
int rtnl_link_ipvlan_set_mode(struct rtnl_link *link, uint16_t mode)
Set IPVLAN MODE.
struct nlattr * nla_nest_start(struct nl_msg *msg, int attrtype)
Start a new level of nested attributes.