mirror of
https://gitee.com/openharmony/third_party_libnl
synced 2025-02-26 22:38:03 +00:00
Add VXLAN support.
This commit is contained in:
parent
b3fb89f445
commit
162c906bf2
@ -763,6 +763,101 @@ if ((err = rtnl_link_add(sk, link, NLM_F_CREATE)) < 0)
|
||||
rtnl_link_put(link);
|
||||
-----
|
||||
|
||||
[[link_vxlan]]
|
||||
==== VXLAN
|
||||
|
||||
[source,c]
|
||||
-----
|
||||
extern struct rtnl_link *rtnl_link_vxlan_alloc(void);
|
||||
|
||||
extern int rtnl_link_is_vxlan(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_id(struct rtnl_link *, uint32_t);
|
||||
extern int rtnl_link_vxlan_get_id(struct rtnl_link *, uint32_t *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_group(struct rtnl_link *, struct nl_addr *);
|
||||
extern int rtnl_link_vxlan_get_group(struct rtnl_link *, struct nl_addr **);
|
||||
|
||||
extern int rtnl_link_vxlan_set_link(struct rtnl_link *, uint32_t);
|
||||
extern int rtnl_link_vxlan_get_link(struct rtnl_link *, uint32_t *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_local(struct rtnl_link *, struct nl_addr *);
|
||||
extern int rtnl_link_vxlan_get_local(struct rtnl_link *, struct nl_addr **);
|
||||
|
||||
extern int rtnl_link_vxlan_set_ttl(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_ttl(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_tos(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_tos(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_learning(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_learning(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_enable_learning(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_learning(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_ageing(struct rtnl_link *, uint32_t);
|
||||
extern int rtnl_link_vxlan_get_ageing(struct rtnl_link *, uint32_t *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_limit(struct rtnl_link *, uint32_t);
|
||||
extern int rtnl_link_vxlan_get_limit(struct rtnl_link *, uint32_t *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_port_range(struct rtnl_link *,
|
||||
struct ifla_vxlan_port_range *);
|
||||
extern int rtnl_link_vxlan_get_port_range(struct rtnl_link *,
|
||||
struct ifla_vxlan_port_range *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_proxy(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_proxy(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_enable_proxy(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_proxy(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_rsc(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_rsc(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_enable_rsc(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_rsc(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_l2miss(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_l2miss(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_enable_l2miss(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_l2miss(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_l3miss(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_l3miss(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_enable_l3miss(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_l3miss(struct rtnl_link *);
|
||||
-----
|
||||
|
||||
.Example: Add a VXLAN device
|
||||
[source,c]
|
||||
-----
|
||||
struct rtnl_link *link;
|
||||
struct nl_addr* addr;
|
||||
|
||||
/* allocate new link object of type vxlan */
|
||||
link = rtnl_link_vxlan_alloc();
|
||||
|
||||
/* set interface name */
|
||||
rtnl_link_set_name(link, "vxlan128");
|
||||
|
||||
/* set VXLAN network identifier */
|
||||
if ((err = rtnl_link_vxlan_set_id(link, 128)) < 0)
|
||||
/* error */
|
||||
|
||||
/* set multicast address to join */
|
||||
if ((err = nl_addr_parse("239.0.0.1", AF_INET, &addr)) < 0)
|
||||
/* error */
|
||||
|
||||
if ((err = rtnl_link_set_group(link, addr)) < 0)
|
||||
/* error */
|
||||
|
||||
nl_addr_put(addr);
|
||||
|
||||
if ((err = rtnl_link_add(sk, link, NLM_F_CREATE)) < 0)
|
||||
/* error */
|
||||
|
||||
rtnl_link_put(link);
|
||||
-----
|
||||
|
||||
== Neighbouring
|
||||
|
||||
== Routing
|
||||
|
86
include/netlink/route/link/vxlan.h
Normal file
86
include/netlink/route/link/vxlan.h
Normal file
@ -0,0 +1,86 @@
|
||||
/*
|
||||
* netlink/route/link/vxlan.h VXLAN interface
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation version 2.1
|
||||
* of the License.
|
||||
*
|
||||
* Copyright (c) 2013 Yasunobu Chiba <yasu@dsl.gr.jp>
|
||||
*/
|
||||
|
||||
#ifndef NETLINK_LINK_VXLAN_H_
|
||||
#define NETLINK_LINK_VXLAN_H_
|
||||
|
||||
#include <netlink/netlink.h>
|
||||
#include <netlink/route/link.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define VXLAN_ID_MAX 16777215
|
||||
|
||||
extern struct rtnl_link *rtnl_link_vxlan_alloc(void);
|
||||
|
||||
extern int rtnl_link_is_vxlan(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_id(struct rtnl_link *, uint32_t);
|
||||
extern int rtnl_link_vxlan_get_id(struct rtnl_link *, uint32_t *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_group(struct rtnl_link *, struct nl_addr *);
|
||||
extern int rtnl_link_vxlan_get_group(struct rtnl_link *, struct nl_addr **);
|
||||
|
||||
extern int rtnl_link_vxlan_set_link(struct rtnl_link *, uint32_t);
|
||||
extern int rtnl_link_vxlan_get_link(struct rtnl_link *, uint32_t *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_local(struct rtnl_link *, struct nl_addr *);
|
||||
extern int rtnl_link_vxlan_get_local(struct rtnl_link *, struct nl_addr **);
|
||||
|
||||
extern int rtnl_link_vxlan_set_ttl(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_ttl(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_tos(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_tos(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_learning(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_learning(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_enable_learning(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_learning(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_ageing(struct rtnl_link *, uint32_t);
|
||||
extern int rtnl_link_vxlan_get_ageing(struct rtnl_link *, uint32_t *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_limit(struct rtnl_link *, uint32_t);
|
||||
extern int rtnl_link_vxlan_get_limit(struct rtnl_link *, uint32_t *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_port_range(struct rtnl_link *,
|
||||
struct ifla_vxlan_port_range *);
|
||||
extern int rtnl_link_vxlan_get_port_range(struct rtnl_link *,
|
||||
struct ifla_vxlan_port_range *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_proxy(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_proxy(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_enable_proxy(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_proxy(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_rsc(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_rsc(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_enable_rsc(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_rsc(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_l2miss(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_l2miss(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_enable_l2miss(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_l2miss(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_l3miss(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_l3miss(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_enable_l3miss(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_l3miss(struct rtnl_link *);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -75,6 +75,7 @@ libnl_route_3_la_SOURCES = \
|
||||
route/link/api.c route/link/vlan.c route/link/dummy.c \
|
||||
route/link/bridge.c route/link/inet6.c route/link/inet.c \
|
||||
route/link/bonding.c route/link/can.c route/link/macvlan.c \
|
||||
route/link/vxlan.c \
|
||||
\
|
||||
route/qdisc/blackhole.c route/qdisc/cbq.c route/qdisc/dsmark.c \
|
||||
route/qdisc/fifo.c route/qdisc/htb.c route/qdisc/netem.c \
|
||||
|
1157
lib/route/link/vxlan.c
Normal file
1157
lib/route/link/vxlan.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -4,6 +4,7 @@
|
||||
#include <netlink/route/link.h>
|
||||
#include <netlink/route/link/vlan.h>
|
||||
#include <netlink/route/link/macvlan.h>
|
||||
#include <netlink/route/link/vxlan.h>
|
||||
#include <netlink/route/link/inet.h>
|
||||
|
||||
#include <netlink/route/tc.h>
|
||||
@ -185,6 +186,68 @@ extern int rtnl_link_macvlan_set_flags(struct rtnl_link *, uint16_t);
|
||||
extern int rtnl_link_macvlan_unset_flags(struct rtnl_link *, uint16_t);
|
||||
extern uint16_t rtnl_link_macvlan_get_flags(struct rtnl_link *);
|
||||
|
||||
/* <netlink/route/link/vxlan.h> */
|
||||
|
||||
#define VXLAN_ID_MAX 16777215
|
||||
|
||||
extern struct rtnl_link *rtnl_link_vxlan_alloc(void);
|
||||
|
||||
extern int rtnl_link_is_vxlan(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_id(struct rtnl_link *, uint32_t);
|
||||
extern int rtnl_link_vxlan_get_id(struct rtnl_link *, uint32_t *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_group(struct rtnl_link *, struct nl_addr *);
|
||||
extern int rtnl_link_vxlan_get_group(struct rtnl_link *, struct nl_addr **);
|
||||
|
||||
extern int rtnl_link_vxlan_set_link(struct rtnl_link *, uint32_t);
|
||||
extern int rtnl_link_vxlan_get_link(struct rtnl_link *, uint32_t *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_local(struct rtnl_link *, struct nl_addr *);
|
||||
extern int rtnl_link_vxlan_get_local(struct rtnl_link *, struct nl_addr **);
|
||||
|
||||
extern int rtnl_link_vxlan_set_ttl(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_ttl(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_tos(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_tos(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_learning(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_learning(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_enable_learning(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_learning(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_ageing(struct rtnl_link *, uint32_t);
|
||||
extern int rtnl_link_vxlan_get_ageing(struct rtnl_link *, uint32_t *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_limit(struct rtnl_link *, uint32_t);
|
||||
extern int rtnl_link_vxlan_get_limit(struct rtnl_link *, uint32_t *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_port_range(struct rtnl_link *,
|
||||
struct ifla_vxlan_port_range *);
|
||||
extern int rtnl_link_vxlan_get_port_range(struct rtnl_link *,
|
||||
struct ifla_vxlan_port_range *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_proxy(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_proxy(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_enable_proxy(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_proxy(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_rsc(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_rsc(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_enable_rsc(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_rsc(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_l2miss(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_l2miss(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_enable_l2miss(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_l2miss(struct rtnl_link *);
|
||||
|
||||
extern int rtnl_link_vxlan_set_l3miss(struct rtnl_link *, uint8_t);
|
||||
extern int rtnl_link_vxlan_get_l3miss(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_enable_l3miss(struct rtnl_link *);
|
||||
extern int rtnl_link_vxlan_disable_l3miss(struct rtnl_link *);
|
||||
|
||||
/* <netlink/route/link/inet.h> */
|
||||
%cstring_output_maxsize(char *buf, size_t len)
|
||||
extern const char *rtnl_link_inet_devconf2str(int, char *buf, size_t len);
|
||||
|
47
tests/test-create-vxlan.c
Normal file
47
tests/test-create-vxlan.c
Normal file
@ -0,0 +1,47 @@
|
||||
#include <netlink/netlink.h>
|
||||
#include <netlink/route/link.h>
|
||||
#include <netlink/route/link/vxlan.h>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct rtnl_link *link;
|
||||
struct nl_addr *addr;
|
||||
struct nl_sock *sk;
|
||||
int err;
|
||||
|
||||
sk = nl_socket_alloc();
|
||||
if ((err = nl_connect(sk, NETLINK_ROUTE)) < 0) {
|
||||
nl_perror(err, "Unable to connect socket");
|
||||
return err;
|
||||
}
|
||||
|
||||
link = rtnl_link_vxlan_alloc();
|
||||
|
||||
rtnl_link_set_name(link, "vxlan128");
|
||||
|
||||
if ((err = rtnl_link_vxlan_set_id(link, 128)) < 0) {
|
||||
nl_perror(err, "Unable to set VXLAN network identifier");
|
||||
return err;
|
||||
}
|
||||
|
||||
if ((err = nl_addr_parse("239.0.0.1", AF_INET, &addr)) < 0) {
|
||||
nl_perror(err, "Unable to parse IP address");
|
||||
return err;
|
||||
}
|
||||
|
||||
if ((err = rtnl_link_vxlan_set_group(link, addr)) < 0) {
|
||||
nl_perror(err, "Unable to set multicast IP address");
|
||||
return err;
|
||||
}
|
||||
nl_addr_put(addr);
|
||||
|
||||
if ((err = rtnl_link_add(sk, link, NLM_F_CREATE)) < 0) {
|
||||
nl_perror(err, "Unable to add link");
|
||||
return err;
|
||||
}
|
||||
|
||||
rtnl_link_put(link);
|
||||
nl_close(sk);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user