Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5477a10

Browse files
committed
ynl-gen-cpp: add support for generating rt-addr
This patch add basic support for netlink-raw protocol. The support can correctly generate rt-addr. To test that, a rt-addr test added in samples/. Signed-off-by: Zibo Gong <[email protected]>
1 parent b0a49dc commit 5477a10

File tree

9 files changed

+648
-64
lines changed

9 files changed

+648
-64
lines changed

generated/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ TOOL:=../ynl-gen-cpp.py
1616
GENS_PATHS=$(shell grep -nrI --files-without-match \
1717
'protocol: netlink' ../Documentation/netlink/specs/)
1818
GENS_ALL=$(patsubst ../Documentation/netlink/specs/%.yaml,%,${GENS_PATHS})
19-
GENS=$(filter-out devlink ovs_datapath ovs_flow ovs_vport nlctrl,${GENS_ALL})
19+
GENS=rt-addr $(filter-out devlink ovs_datapath ovs_flow ovs_vport nlctrl,${GENS_ALL})
2020
SRCS=$(patsubst %,%-user.cpp,${GENS})
2121
HDRS=$(patsubst %,%-user.hpp,${GENS})
2222
OBJS=$(patsubst %,%-user.cpp.o,${GENS})

generated/rt-addr-user.cpp

Lines changed: 347 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,347 @@
1+
// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
2+
/* Do not edit directly, auto-generated from: */
3+
/* */
4+
/* YNL-GEN user source */
5+
6+
#include "rt-addr-user.hpp"
7+
8+
#include <array>
9+
10+
#include <linux/rtnetlink.h>
11+
12+
#include <linux/genetlink.h>
13+
14+
namespace ynl_cpp {
15+
16+
/* Enums */
17+
static constexpr std::array<std::string_view, RTM_GETMULTICAST + 1> rt_addr_op_strmap = []() {
18+
std::array<std::string_view, RTM_GETMULTICAST + 1> arr{};
19+
arr[20] = "getaddr";
20+
arr[RTM_GETMULTICAST] = "getmulticast";
21+
return arr;
22+
} ();
23+
24+
std::string_view rt_addr_op_str(int op)
25+
{
26+
if (op < 0 || op >= (int)(rt_addr_op_strmap.size()))
27+
return "";
28+
return rt_addr_op_strmap[op];
29+
}
30+
31+
static constexpr std::array<std::string_view, 11 + 1> rt_addr_ifa_flags_strmap = []() {
32+
std::array<std::string_view, 11 + 1> arr{};
33+
arr[0] = "secondary";
34+
arr[1] = "nodad";
35+
arr[2] = "optimistic";
36+
arr[3] = "dadfailed";
37+
arr[4] = "homeaddress";
38+
arr[5] = "deprecated";
39+
arr[6] = "tentative";
40+
arr[7] = "permanent";
41+
arr[8] = "managetempaddr";
42+
arr[9] = "noprefixroute";
43+
arr[10] = "mcautojoin";
44+
arr[11] = "stable-privacy";
45+
return arr;
46+
} ();
47+
48+
std::string_view rt_addr_ifa_flags_str(int value)
49+
{
50+
value = (int)(ffs(value) - 1);
51+
if (value < 0 || value >= (int)(rt_addr_ifa_flags_strmap.size()))
52+
return "";
53+
return rt_addr_ifa_flags_strmap[value];
54+
}
55+
56+
/* Policies */
57+
static std::array<ynl_policy_attr,IFA_MAX + 1> rt_addr_addr_attrs_policy = []() {
58+
std::array<ynl_policy_attr,IFA_MAX + 1> arr{};
59+
arr[IFA_ADDRESS].name = "address";
60+
arr[IFA_ADDRESS].type = YNL_PT_BINARY;
61+
arr[IFA_LOCAL].name = "local";
62+
arr[IFA_LOCAL].type = YNL_PT_BINARY;
63+
arr[IFA_LABEL].name = "label";
64+
arr[IFA_LABEL].type = YNL_PT_NUL_STR;
65+
arr[IFA_BROADCAST].name = "broadcast";
66+
arr[IFA_BROADCAST].type = YNL_PT_BINARY;
67+
arr[IFA_ANYCAST].name = "anycast";
68+
arr[IFA_ANYCAST].type = YNL_PT_BINARY;
69+
arr[IFA_CACHEINFO].name = "cacheinfo";
70+
arr[IFA_CACHEINFO].type = YNL_PT_BINARY;
71+
arr[IFA_MULTICAST].name = "multicast";
72+
arr[IFA_MULTICAST].type = YNL_PT_BINARY;
73+
arr[IFA_FLAGS].name = "flags";
74+
arr[IFA_FLAGS].type = YNL_PT_U32;
75+
arr[IFA_RT_PRIORITY].name = "rt-priority";
76+
arr[IFA_RT_PRIORITY].type = YNL_PT_U32;
77+
arr[IFA_TARGET_NETNSID].name = "target-netnsid";
78+
arr[IFA_TARGET_NETNSID].type = YNL_PT_BINARY;
79+
arr[IFA_PROTO].name = "proto";
80+
arr[IFA_PROTO].type = YNL_PT_U8;
81+
return arr;
82+
} ();
83+
84+
struct ynl_policy_nest rt_addr_addr_attrs_nest = {
85+
.max_attr = static_cast<unsigned int>(IFA_MAX),
86+
.table = rt_addr_addr_attrs_policy.data(),
87+
};
88+
89+
/* Common nested types */
90+
/* ============== RTM_NEWADDR ============== */
91+
/* RTM_NEWADDR - do */
92+
int rt_addr_newaddr(ynl_cpp::ynl_socket& ys, rt_addr_newaddr_req& req)
93+
{
94+
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
95+
struct nlmsghdr *nlh;
96+
size_t hdr_len;
97+
void *hdr;
98+
int err;
99+
100+
nlh = ynl_msg_start_req(ys, RTM_NEWADDR, req._nlmsg_flags);
101+
((struct ynl_sock*)ys)->req_policy = &rt_addr_addr_attrs_nest;
102+
103+
hdr_len = sizeof(req._hdr);
104+
hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len);
105+
memcpy(hdr, &req._hdr, hdr_len);
106+
107+
if (req.address.size() > 0)
108+
ynl_attr_put(nlh, IFA_ADDRESS, req.address.data(), req.address.size());
109+
if (req.label.size() > 0)
110+
ynl_attr_put_str(nlh, IFA_LABEL, req.label.data());
111+
if (req.local.size() > 0)
112+
ynl_attr_put(nlh, IFA_LOCAL, req.local.data(), req.local.size());
113+
if (req.cacheinfo.size() > 0)
114+
ynl_attr_put(nlh, IFA_CACHEINFO, req.cacheinfo.data(), req.cacheinfo.size());
115+
116+
err = ynl_exec(ys, nlh, &yrs);
117+
if (err < 0)
118+
return -1;
119+
120+
return 0;
121+
}
122+
123+
/* ============== RTM_DELADDR ============== */
124+
/* RTM_DELADDR - do */
125+
int rt_addr_deladdr(ynl_cpp::ynl_socket& ys, rt_addr_deladdr_req& req)
126+
{
127+
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
128+
struct nlmsghdr *nlh;
129+
size_t hdr_len;
130+
void *hdr;
131+
int err;
132+
133+
nlh = ynl_msg_start_req(ys, RTM_DELADDR, req._nlmsg_flags);
134+
((struct ynl_sock*)ys)->req_policy = &rt_addr_addr_attrs_nest;
135+
136+
hdr_len = sizeof(req._hdr);
137+
hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len);
138+
memcpy(hdr, &req._hdr, hdr_len);
139+
140+
if (req.address.size() > 0)
141+
ynl_attr_put(nlh, IFA_ADDRESS, req.address.data(), req.address.size());
142+
if (req.local.size() > 0)
143+
ynl_attr_put(nlh, IFA_LOCAL, req.local.data(), req.local.size());
144+
145+
err = ynl_exec(ys, nlh, &yrs);
146+
if (err < 0)
147+
return -1;
148+
149+
return 0;
150+
}
151+
152+
/* ============== RTM_GETADDR ============== */
153+
/* RTM_GETADDR - dump */
154+
int rt_addr_getaddr_rsp_dump_parse(const struct nlmsghdr *nlh,
155+
struct ynl_parse_arg *yarg)
156+
{
157+
rt_addr_getaddr_rsp_dump *dst;
158+
const struct nlattr *attr;
159+
void *hdr;
160+
161+
dst = (rt_addr_getaddr_rsp_dump*)yarg->data;
162+
163+
hdr = ynl_nlmsg_data(nlh);
164+
memcpy(&dst->_hdr, hdr, sizeof(struct ifaddrmsg));
165+
166+
ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) {
167+
unsigned int type = ynl_attr_type(attr);
168+
169+
if (type == IFA_ADDRESS) {
170+
if (ynl_attr_validate(yarg, attr))
171+
return YNL_PARSE_CB_ERROR;
172+
unsigned int len = ynl_attr_data_len(attr);
173+
__u8 *data = (__u8*)ynl_attr_data(attr);
174+
dst->address.assign(data, data + len);
175+
} else if (type == IFA_LABEL) {
176+
if (ynl_attr_validate(yarg, attr))
177+
return YNL_PARSE_CB_ERROR;
178+
dst->label.assign(ynl_attr_get_str(attr));
179+
} else if (type == IFA_LOCAL) {
180+
if (ynl_attr_validate(yarg, attr))
181+
return YNL_PARSE_CB_ERROR;
182+
unsigned int len = ynl_attr_data_len(attr);
183+
__u8 *data = (__u8*)ynl_attr_data(attr);
184+
dst->local.assign(data, data + len);
185+
} else if (type == IFA_CACHEINFO) {
186+
unsigned int len, struct_sz, count;
187+
188+
if (ynl_attr_validate(yarg, attr))
189+
return YNL_PARSE_CB_ERROR;
190+
191+
len = ynl_attr_data_len(attr);
192+
struct_sz = sizeof(struct ifa_cacheinfo);
193+
struct ifa_cacheinfo*data = (struct ifa_cacheinfo*)ynl_attr_data(attr);
194+
count = (len % struct_sz > 0) ? len / struct_sz + 1 : len / struct_sz;
195+
dst->cacheinfo.resize(count);
196+
memcpy(dst->cacheinfo.data(), data, len);
197+
}
198+
}
199+
200+
return YNL_PARSE_CB_OK;
201+
}
202+
203+
std::unique_ptr<rt_addr_getaddr_rsp_list>
204+
rt_addr_getaddr_dump(ynl_cpp::ynl_socket& ys, rt_addr_getaddr_req_dump& req)
205+
{
206+
struct ynl_dump_no_alloc_state yds = {};
207+
struct nlmsghdr *nlh;
208+
size_t hdr_len;
209+
void *hdr;
210+
int err;
211+
212+
auto ret = std::make_unique<rt_addr_getaddr_rsp_list>();
213+
yds.yarg.ys = ys;
214+
yds.yarg.rsp_policy = &rt_addr_addr_attrs_nest;
215+
yds.yarg.data = ret.get();
216+
yds.alloc_cb = [](void* arg)->void*{return &(static_cast<rt_addr_getaddr_rsp_list*>(arg)->objs.emplace_back());};
217+
yds.cb = rt_addr_getaddr_rsp_dump_parse;
218+
yds.rsp_cmd = 20;
219+
220+
nlh = ynl_msg_start_dump(ys, RTM_GETADDR);
221+
hdr_len = sizeof(req._hdr);
222+
hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len);
223+
memcpy(hdr, &req._hdr, hdr_len);
224+
225+
((struct ynl_sock*)ys)->req_policy = &rt_addr_addr_attrs_nest;
226+
227+
err = ynl_exec_dump_no_alloc(ys, nlh, &yds);
228+
if (err < 0)
229+
return nullptr;
230+
231+
return ret;
232+
}
233+
234+
/* ============== RTM_GETMULTICAST ============== */
235+
/* RTM_GETMULTICAST - do */
236+
int rt_addr_getmulticast_rsp_parse(const struct nlmsghdr *nlh,
237+
struct ynl_parse_arg *yarg)
238+
{
239+
rt_addr_getmulticast_rsp *dst;
240+
const struct nlattr *attr;
241+
void *hdr;
242+
243+
dst = (rt_addr_getmulticast_rsp*)yarg->data;
244+
245+
hdr = ynl_nlmsg_data(nlh);
246+
memcpy(&dst->_hdr, hdr, sizeof(struct ifaddrmsg));
247+
248+
ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) {
249+
unsigned int type = ynl_attr_type(attr);
250+
251+
if (type == IFA_MULTICAST) {
252+
if (ynl_attr_validate(yarg, attr))
253+
return YNL_PARSE_CB_ERROR;
254+
unsigned int len = ynl_attr_data_len(attr);
255+
__u8 *data = (__u8*)ynl_attr_data(attr);
256+
dst->multicast.assign(data, data + len);
257+
} else if (type == IFA_CACHEINFO) {
258+
unsigned int len, struct_sz, count;
259+
260+
if (ynl_attr_validate(yarg, attr))
261+
return YNL_PARSE_CB_ERROR;
262+
263+
len = ynl_attr_data_len(attr);
264+
struct_sz = sizeof(struct ifa_cacheinfo);
265+
struct ifa_cacheinfo*data = (struct ifa_cacheinfo*)ynl_attr_data(attr);
266+
count = (len % struct_sz > 0) ? len / struct_sz + 1 : len / struct_sz;
267+
dst->cacheinfo.resize(count);
268+
memcpy(dst->cacheinfo.data(), data, len);
269+
}
270+
}
271+
272+
return YNL_PARSE_CB_OK;
273+
}
274+
275+
std::unique_ptr<rt_addr_getmulticast_rsp>
276+
rt_addr_getmulticast(ynl_cpp::ynl_socket& ys, rt_addr_getmulticast_req& req)
277+
{
278+
struct ynl_req_state yrs = { .yarg = { .ys = ys, }, };
279+
std::unique_ptr<rt_addr_getmulticast_rsp> rsp;
280+
struct nlmsghdr *nlh;
281+
size_t hdr_len;
282+
void *hdr;
283+
int err;
284+
285+
nlh = ynl_msg_start_req(ys, RTM_GETMULTICAST, req._nlmsg_flags);
286+
((struct ynl_sock*)ys)->req_policy = &rt_addr_addr_attrs_nest;
287+
yrs.yarg.rsp_policy = &rt_addr_addr_attrs_nest;
288+
289+
hdr_len = sizeof(req._hdr);
290+
hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len);
291+
memcpy(hdr, &req._hdr, hdr_len);
292+
293+
rsp.reset(new rt_addr_getmulticast_rsp());
294+
yrs.yarg.data = rsp.get();
295+
yrs.cb = rt_addr_getmulticast_rsp_parse;
296+
yrs.rsp_cmd = RTM_GETMULTICAST;
297+
298+
err = ynl_exec(ys, nlh, &yrs);
299+
if (err < 0)
300+
return nullptr;
301+
302+
return rsp;
303+
}
304+
305+
/* RTM_GETMULTICAST - dump */
306+
std::unique_ptr<rt_addr_getmulticast_list>
307+
rt_addr_getmulticast_dump(ynl_cpp::ynl_socket& ys,
308+
rt_addr_getmulticast_req_dump& req)
309+
{
310+
struct ynl_dump_no_alloc_state yds = {};
311+
struct nlmsghdr *nlh;
312+
size_t hdr_len;
313+
void *hdr;
314+
int err;
315+
316+
auto ret = std::make_unique<rt_addr_getmulticast_list>();
317+
yds.yarg.ys = ys;
318+
yds.yarg.rsp_policy = &rt_addr_addr_attrs_nest;
319+
yds.yarg.data = ret.get();
320+
yds.alloc_cb = [](void* arg)->void*{return &(static_cast<rt_addr_getmulticast_list*>(arg)->objs.emplace_back());};
321+
yds.cb = rt_addr_getmulticast_rsp_parse;
322+
yds.rsp_cmd = RTM_GETMULTICAST;
323+
324+
nlh = ynl_msg_start_dump(ys, RTM_GETMULTICAST);
325+
hdr_len = sizeof(req._hdr);
326+
hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len);
327+
memcpy(hdr, &req._hdr, hdr_len);
328+
329+
((struct ynl_sock*)ys)->req_policy = &rt_addr_addr_attrs_nest;
330+
331+
err = ynl_exec_dump_no_alloc(ys, nlh, &yds);
332+
if (err < 0)
333+
return nullptr;
334+
335+
return ret;
336+
}
337+
338+
const struct ynl_family ynl_rt_addr_family = {
339+
.name = "rt_addr",
340+
.is_classic = true,
341+
.classic_id = 0,
342+
.hdr_len = sizeof(struct ifaddrmsg),
343+
};
344+
const struct ynl_family& get_ynl_rt_addr_family() {
345+
return ynl_rt_addr_family;
346+
};
347+
} //namespace ynl_cpp

0 commit comments

Comments
 (0)