19#include "nl-default.h"
21#include <linux/if_link.h>
23#include <netlink/netlink.h>
24#include <netlink/attr.h>
25#include <netlink/utils.h>
26#include <netlink/object.h>
27#include <netlink/route/rtnl.h>
28#include <netlink/route/link/ipvlan.h>
34#define IPVLAN_HAS_MODE (1<<0)
44static struct nla_policy ipvlan_policy[IFLA_IPVLAN_MAX+1] = {
48static int ipvlan_alloc(
struct rtnl_link *link)
50 struct ipvlan_info *ipi;
53 memset(link->l_info, 0,
sizeof(*ipi));
55 if ((ipi = calloc(1,
sizeof(*ipi))) == NULL)
64static int ipvlan_parse(
struct rtnl_link *link,
struct nlattr *data,
65 struct nlattr *xstats)
67 struct nlattr *tb[IFLA_IPVLAN_MAX+1];
68 struct ipvlan_info *ipi;
71 NL_DBG(3,
"Parsing IPVLAN link info\n");
76 if ((err = ipvlan_alloc(link)) < 0)
81 if (tb[IFLA_IPVLAN_MODE]) {
83 ipi->ipi_mask |= IPVLAN_HAS_MODE;
91static void ipvlan_free(
struct rtnl_link *link)
100 struct ipvlan_info *ipi = link->l_info;
102 if (ipi->ipi_mask & IPVLAN_HAS_MODE) {
103 rtnl_link_ipvlan_mode2str(ipi->ipi_mode, buf,
sizeof(buf));
104 nl_dump(p,
"ipvlan-mode %s", buf);
110 struct ipvlan_info *vdst, *vsrc = src->l_info;
121 memcpy(vdst, vsrc,
sizeof(
struct ipvlan_info));
126static int ipvlan_put_attrs(
struct nl_msg *msg,
struct rtnl_link *link)
128 struct ipvlan_info *ipi = link->l_info;
134 if (ipi->ipi_mask & IPVLAN_HAS_MODE)
146 .io_alloc = ipvlan_alloc,
147 .io_parse = ipvlan_parse,
152 .io_clone = ipvlan_clone,
153 .io_put_attrs = ipvlan_put_attrs,
154 .io_free = ipvlan_free,
158#define IS_IPVLAN_LINK_ASSERT(link) \
159 if ((link)->l_info_ops != &ipvlan_info_ops) { \
160 APPBUG("Link is not a ipvlan link. set type \"ipvlan\" first."); \
161 return -NLE_OPNOTSUPP; \
198 return link->l_info_ops && !strcmp(link->l_info_ops->
io_name,
"ipvlan");
210 struct ipvlan_info *ipi = link->l_info;
212 IS_IPVLAN_LINK_ASSERT(link);
214 ipi->ipi_mode = mode;
215 ipi->ipi_mask |= IPVLAN_HAS_MODE;
229 struct ipvlan_info *ipi = link->l_info;
231 IS_IPVLAN_LINK_ASSERT(link);
233 if (!(ipi->ipi_mask & IPVLAN_HAS_MODE))
235 *out_mode = ipi->ipi_mode;
241static const struct trans_tbl ipvlan_modes[] = {
242 __ADD(IPVLAN_MODE_L2, l2),
243 __ADD(IPVLAN_MODE_L3, l3),
251char *rtnl_link_ipvlan_mode2str(
int mode,
char *buf,
size_t len)
253 return __type2str(mode, buf, len, ipvlan_modes, ARRAY_SIZE(ipvlan_modes));
256int rtnl_link_ipvlan_str2mode(
const char *name)
258 return __str2type(name, ipvlan_modes, ARRAY_SIZE(ipvlan_modes));
263static void _nl_init ipvlan_init(
void)
268static void _nl_exit ipvlan_exit(
void)
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.
struct nlattr * nla_nest_start(struct nl_msg *msg, int attrtype)
Start a new level of nested attributes.
int nla_parse_nested(struct nlattr *tb[], int maxtype, struct nlattr *nla, const struct nla_policy *policy)
Create attribute index based on nested attribute.
int nla_nest_end(struct nl_msg *msg, struct nlattr *start)
Finalize nesting of attributes.
int rtnl_link_ipvlan_set_mode(struct rtnl_link *link, uint16_t mode)
Set IPVLAN MODE.
int rtnl_link_ipvlan_get_mode(struct rtnl_link *link, uint16_t *out_mode)
Get IPVLAN Mode.
struct rtnl_link * rtnl_link_ipvlan_alloc(void)
Allocate link object of type IPVLAN.
int rtnl_link_is_ipvlan(struct rtnl_link *link)
Check if link is a IPVLAN link.
int rtnl_link_register_info(struct rtnl_link_info_ops *ops)
Register operations for a link info type.
int rtnl_link_unregister_info(struct rtnl_link_info_ops *ops)
Unregister operations for a link info type.
struct rtnl_link * rtnl_link_alloc(void)
Allocate link object.
void rtnl_link_put(struct rtnl_link *link)
Release a link object reference.
int rtnl_link_set_type(struct rtnl_link *link, const char *type)
Set type of link object.
void nl_dump(struct nl_dump_params *params, const char *fmt,...)
Dump a formatted character string.
@ NL_DUMP_LINE
Dump object briefly on one line.
@ NL_DUMP_DETAILS
Dump all attributes but no statistics.
Attribute validation policy.
uint16_t type
Type of attribute or NLA_UNSPEC.
Available operations to modules implementing a link info type.
char * io_name
Name of link info type, must match name on kernel side.