]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd/sd-netlink/rtnl-message.c
2 This file is part of systemd.
4 Copyright 2013 Tom Gundersen <teg@jklm.no>
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 #include <netinet/in.h>
21 #include <linux/if_addrlabel.h>
25 #include "sd-netlink.h"
27 #include "format-util.h"
29 #include "netlink-internal.h"
30 #include "netlink-types.h"
31 #include "netlink-util.h"
33 #include "socket-util.h"
36 int sd_rtnl_message_route_set_dst_prefixlen(sd_netlink_message
*m
, unsigned char prefixlen
) {
39 assert_return(m
, -EINVAL
);
40 assert_return(m
->hdr
, -EINVAL
);
41 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
43 rtm
= NLMSG_DATA(m
->hdr
);
45 if ((rtm
->rtm_family
== AF_INET
&& prefixlen
> 32) ||
46 (rtm
->rtm_family
== AF_INET6
&& prefixlen
> 128))
49 rtm
->rtm_dst_len
= prefixlen
;
54 int sd_rtnl_message_route_set_src_prefixlen(sd_netlink_message
*m
, unsigned char prefixlen
) {
57 assert_return(m
, -EINVAL
);
58 assert_return(m
->hdr
, -EINVAL
);
59 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
61 rtm
= NLMSG_DATA(m
->hdr
);
63 if ((rtm
->rtm_family
== AF_INET
&& prefixlen
> 32) ||
64 (rtm
->rtm_family
== AF_INET6
&& prefixlen
> 128))
67 rtm
->rtm_src_len
= prefixlen
;
72 int sd_rtnl_message_route_set_scope(sd_netlink_message
*m
, unsigned char scope
) {
75 assert_return(m
, -EINVAL
);
76 assert_return(m
->hdr
, -EINVAL
);
77 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
79 rtm
= NLMSG_DATA(m
->hdr
);
81 rtm
->rtm_scope
= scope
;
86 int sd_rtnl_message_route_set_flags(sd_netlink_message
*m
, unsigned flags
) {
89 assert_return(m
, -EINVAL
);
90 assert_return(m
->hdr
, -EINVAL
);
91 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
93 rtm
= NLMSG_DATA(m
->hdr
);
95 rtm
->rtm_flags
= flags
;
100 int sd_rtnl_message_route_get_flags(sd_netlink_message
*m
, unsigned *flags
) {
103 assert_return(m
, -EINVAL
);
104 assert_return(m
->hdr
, -EINVAL
);
105 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
106 assert_return(flags
, -EINVAL
);
108 rtm
= NLMSG_DATA(m
->hdr
);
110 *flags
= rtm
->rtm_flags
;
115 int sd_rtnl_message_route_set_table(sd_netlink_message
*m
, unsigned char table
) {
118 assert_return(m
, -EINVAL
);
119 assert_return(m
->hdr
, -EINVAL
);
120 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
122 rtm
= NLMSG_DATA(m
->hdr
);
124 rtm
->rtm_table
= table
;
129 int sd_rtnl_message_route_get_family(sd_netlink_message
*m
, int *family
) {
132 assert_return(m
, -EINVAL
);
133 assert_return(m
->hdr
, -EINVAL
);
134 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
135 assert_return(family
, -EINVAL
);
137 rtm
= NLMSG_DATA(m
->hdr
);
139 *family
= rtm
->rtm_family
;
144 int sd_rtnl_message_route_set_family(sd_netlink_message
*m
, int family
) {
147 assert_return(m
, -EINVAL
);
148 assert_return(m
->hdr
, -EINVAL
);
149 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
151 rtm
= NLMSG_DATA(m
->hdr
);
153 rtm
->rtm_family
= family
;
158 int sd_rtnl_message_route_get_type(sd_netlink_message
*m
, unsigned char *type
) {
161 assert_return(m
, -EINVAL
);
162 assert_return(m
->hdr
, -EINVAL
);
163 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
164 assert_return(type
, -EINVAL
);
166 rtm
= NLMSG_DATA(m
->hdr
);
168 *type
= rtm
->rtm_type
;
173 int sd_rtnl_message_route_set_type(sd_netlink_message
*m
, unsigned char type
) {
176 assert_return(m
, -EINVAL
);
177 assert_return(m
->hdr
, -EINVAL
);
178 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
180 rtm
= NLMSG_DATA(m
->hdr
);
182 rtm
->rtm_type
= type
;
187 int sd_rtnl_message_route_get_protocol(sd_netlink_message
*m
, unsigned char *protocol
) {
190 assert_return(m
, -EINVAL
);
191 assert_return(m
->hdr
, -EINVAL
);
192 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
193 assert_return(protocol
, -EINVAL
);
195 rtm
= NLMSG_DATA(m
->hdr
);
197 *protocol
= rtm
->rtm_protocol
;
202 int sd_rtnl_message_route_get_scope(sd_netlink_message
*m
, unsigned char *scope
) {
205 assert_return(m
, -EINVAL
);
206 assert_return(m
->hdr
, -EINVAL
);
207 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
208 assert_return(scope
, -EINVAL
);
210 rtm
= NLMSG_DATA(m
->hdr
);
212 *scope
= rtm
->rtm_scope
;
217 int sd_rtnl_message_route_get_tos(sd_netlink_message
*m
, unsigned char *tos
) {
220 assert_return(m
, -EINVAL
);
221 assert_return(m
->hdr
, -EINVAL
);
222 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
223 assert_return(tos
, -EINVAL
);
225 rtm
= NLMSG_DATA(m
->hdr
);
232 int sd_rtnl_message_route_get_table(sd_netlink_message
*m
, unsigned char *table
) {
235 assert_return(m
, -EINVAL
);
236 assert_return(m
->hdr
, -EINVAL
);
237 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
238 assert_return(table
, -EINVAL
);
240 rtm
= NLMSG_DATA(m
->hdr
);
242 *table
= rtm
->rtm_table
;
247 int sd_rtnl_message_route_get_dst_prefixlen(sd_netlink_message
*m
, unsigned char *dst_len
) {
250 assert_return(m
, -EINVAL
);
251 assert_return(m
->hdr
, -EINVAL
);
252 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
253 assert_return(dst_len
, -EINVAL
);
255 rtm
= NLMSG_DATA(m
->hdr
);
257 *dst_len
= rtm
->rtm_dst_len
;
262 int sd_rtnl_message_route_get_src_prefixlen(sd_netlink_message
*m
, unsigned char *src_len
) {
265 assert_return(m
, -EINVAL
);
266 assert_return(m
->hdr
, -EINVAL
);
267 assert_return(rtnl_message_type_is_route(m
->hdr
->nlmsg_type
), -EINVAL
);
268 assert_return(src_len
, -EINVAL
);
270 rtm
= NLMSG_DATA(m
->hdr
);
272 *src_len
= rtm
->rtm_src_len
;
277 int sd_rtnl_message_new_route(sd_netlink
*rtnl
, sd_netlink_message
**ret
,
278 uint16_t nlmsg_type
, int rtm_family
,
279 unsigned char rtm_protocol
) {
283 assert_return(rtnl_message_type_is_route(nlmsg_type
), -EINVAL
);
284 assert_return((nlmsg_type
== RTM_GETROUTE
&& rtm_family
== AF_UNSPEC
) ||
285 IN_SET(rtm_family
, AF_INET
, AF_INET6
), -EINVAL
);
286 assert_return(ret
, -EINVAL
);
288 r
= message_new(rtnl
, ret
, nlmsg_type
);
292 if (nlmsg_type
== RTM_NEWROUTE
)
293 (*ret
)->hdr
->nlmsg_flags
|= NLM_F_CREATE
| NLM_F_APPEND
;
295 rtm
= NLMSG_DATA((*ret
)->hdr
);
297 rtm
->rtm_family
= rtm_family
;
298 rtm
->rtm_scope
= RT_SCOPE_UNIVERSE
;
299 rtm
->rtm_type
= RTN_UNICAST
;
300 rtm
->rtm_table
= RT_TABLE_MAIN
;
301 rtm
->rtm_protocol
= rtm_protocol
;
306 int sd_rtnl_message_neigh_set_flags(sd_netlink_message
*m
, uint8_t flags
) {
309 assert_return(m
, -EINVAL
);
310 assert_return(m
->hdr
, -EINVAL
);
311 assert_return(rtnl_message_type_is_neigh(m
->hdr
->nlmsg_type
), -EINVAL
);
313 ndm
= NLMSG_DATA(m
->hdr
);
314 ndm
->ndm_flags
|= flags
;
319 int sd_rtnl_message_neigh_set_state(sd_netlink_message
*m
, uint16_t state
) {
322 assert_return(m
, -EINVAL
);
323 assert_return(m
->hdr
, -EINVAL
);
324 assert_return(rtnl_message_type_is_neigh(m
->hdr
->nlmsg_type
), -EINVAL
);
326 ndm
= NLMSG_DATA(m
->hdr
);
327 ndm
->ndm_state
|= state
;
332 int sd_rtnl_message_neigh_get_flags(sd_netlink_message
*m
, uint8_t *flags
) {
335 assert_return(m
, -EINVAL
);
336 assert_return(m
->hdr
, -EINVAL
);
337 assert_return(rtnl_message_type_is_neigh(m
->hdr
->nlmsg_type
), -EINVAL
);
339 ndm
= NLMSG_DATA(m
->hdr
);
340 *flags
= ndm
->ndm_flags
;
345 int sd_rtnl_message_neigh_get_state(sd_netlink_message
*m
, uint16_t *state
) {
348 assert_return(m
, -EINVAL
);
349 assert_return(m
->hdr
, -EINVAL
);
350 assert_return(rtnl_message_type_is_neigh(m
->hdr
->nlmsg_type
), -EINVAL
);
352 ndm
= NLMSG_DATA(m
->hdr
);
353 *state
= ndm
->ndm_state
;
358 int sd_rtnl_message_neigh_get_family(sd_netlink_message
*m
, int *family
) {
361 assert_return(m
, -EINVAL
);
362 assert_return(m
->hdr
, -EINVAL
);
363 assert_return(rtnl_message_type_is_neigh(m
->hdr
->nlmsg_type
), -EINVAL
);
364 assert_return(family
, -EINVAL
);
366 ndm
= NLMSG_DATA(m
->hdr
);
368 *family
= ndm
->ndm_family
;
373 int sd_rtnl_message_neigh_get_ifindex(sd_netlink_message
*m
, int *index
) {
376 assert_return(m
, -EINVAL
);
377 assert_return(m
->hdr
, -EINVAL
);
378 assert_return(rtnl_message_type_is_neigh(m
->hdr
->nlmsg_type
), -EINVAL
);
379 assert_return(index
, -EINVAL
);
381 ndm
= NLMSG_DATA(m
->hdr
);
383 *index
= ndm
->ndm_ifindex
;
388 int sd_rtnl_message_new_neigh(sd_netlink
*rtnl
, sd_netlink_message
**ret
, uint16_t nlmsg_type
, int index
, int ndm_family
) {
392 assert_return(rtnl_message_type_is_neigh(nlmsg_type
), -EINVAL
);
393 assert_return(IN_SET(ndm_family
, AF_INET
, AF_INET6
, PF_BRIDGE
), -EINVAL
);
394 assert_return(ret
, -EINVAL
);
396 r
= message_new(rtnl
, ret
, nlmsg_type
);
400 if (nlmsg_type
== RTM_NEWNEIGH
)
401 (*ret
)->hdr
->nlmsg_flags
|= NLM_F_CREATE
| NLM_F_APPEND
;
403 ndm
= NLMSG_DATA((*ret
)->hdr
);
405 ndm
->ndm_family
= ndm_family
;
406 ndm
->ndm_ifindex
= index
;
411 int sd_rtnl_message_link_set_flags(sd_netlink_message
*m
, unsigned flags
, unsigned change
) {
412 struct ifinfomsg
*ifi
;
414 assert_return(m
, -EINVAL
);
415 assert_return(m
->hdr
, -EINVAL
);
416 assert_return(rtnl_message_type_is_link(m
->hdr
->nlmsg_type
), -EINVAL
);
417 assert_return(change
, -EINVAL
);
419 ifi
= NLMSG_DATA(m
->hdr
);
421 ifi
->ifi_flags
= flags
;
422 ifi
->ifi_change
= change
;
427 int sd_rtnl_message_link_set_type(sd_netlink_message
*m
, unsigned type
) {
428 struct ifinfomsg
*ifi
;
430 assert_return(m
, -EINVAL
);
431 assert_return(m
->hdr
, -EINVAL
);
432 assert_return(rtnl_message_type_is_link(m
->hdr
->nlmsg_type
), -EINVAL
);
434 ifi
= NLMSG_DATA(m
->hdr
);
436 ifi
->ifi_type
= type
;
441 int sd_rtnl_message_link_set_family(sd_netlink_message
*m
, unsigned family
) {
442 struct ifinfomsg
*ifi
;
444 assert_return(m
, -EINVAL
);
445 assert_return(m
->hdr
, -EINVAL
);
446 assert_return(rtnl_message_type_is_link(m
->hdr
->nlmsg_type
), -EINVAL
);
448 ifi
= NLMSG_DATA(m
->hdr
);
450 ifi
->ifi_family
= family
;
455 int sd_rtnl_message_new_link(sd_netlink
*rtnl
, sd_netlink_message
**ret
,
456 uint16_t nlmsg_type
, int index
) {
457 struct ifinfomsg
*ifi
;
460 assert_return(rtnl_message_type_is_link(nlmsg_type
), -EINVAL
);
461 assert_return(ret
, -EINVAL
);
463 r
= message_new(rtnl
, ret
, nlmsg_type
);
467 if (nlmsg_type
== RTM_NEWLINK
)
468 (*ret
)->hdr
->nlmsg_flags
|= NLM_F_CREATE
| NLM_F_EXCL
;
470 ifi
= NLMSG_DATA((*ret
)->hdr
);
472 ifi
->ifi_family
= AF_UNSPEC
;
473 ifi
->ifi_index
= index
;
478 int sd_rtnl_message_addr_set_prefixlen(sd_netlink_message
*m
, unsigned char prefixlen
) {
479 struct ifaddrmsg
*ifa
;
481 assert_return(m
, -EINVAL
);
482 assert_return(m
->hdr
, -EINVAL
);
483 assert_return(rtnl_message_type_is_addr(m
->hdr
->nlmsg_type
), -EINVAL
);
485 ifa
= NLMSG_DATA(m
->hdr
);
487 if ((ifa
->ifa_family
== AF_INET
&& prefixlen
> 32) ||
488 (ifa
->ifa_family
== AF_INET6
&& prefixlen
> 128))
491 ifa
->ifa_prefixlen
= prefixlen
;
496 int sd_rtnl_message_addr_set_flags(sd_netlink_message
*m
, unsigned char flags
) {
497 struct ifaddrmsg
*ifa
;
499 assert_return(m
, -EINVAL
);
500 assert_return(m
->hdr
, -EINVAL
);
501 assert_return(rtnl_message_type_is_addr(m
->hdr
->nlmsg_type
), -EINVAL
);
503 ifa
= NLMSG_DATA(m
->hdr
);
505 ifa
->ifa_flags
= flags
;
510 int sd_rtnl_message_addr_set_scope(sd_netlink_message
*m
, unsigned char scope
) {
511 struct ifaddrmsg
*ifa
;
513 assert_return(m
, -EINVAL
);
514 assert_return(m
->hdr
, -EINVAL
);
515 assert_return(rtnl_message_type_is_addr(m
->hdr
->nlmsg_type
), -EINVAL
);
517 ifa
= NLMSG_DATA(m
->hdr
);
519 ifa
->ifa_scope
= scope
;
524 int sd_rtnl_message_addr_get_family(sd_netlink_message
*m
, int *family
) {
525 struct ifaddrmsg
*ifa
;
527 assert_return(m
, -EINVAL
);
528 assert_return(m
->hdr
, -EINVAL
);
529 assert_return(rtnl_message_type_is_addr(m
->hdr
->nlmsg_type
), -EINVAL
);
530 assert_return(family
, -EINVAL
);
532 ifa
= NLMSG_DATA(m
->hdr
);
534 *family
= ifa
->ifa_family
;
539 int sd_rtnl_message_addr_get_prefixlen(sd_netlink_message
*m
, unsigned char *prefixlen
) {
540 struct ifaddrmsg
*ifa
;
542 assert_return(m
, -EINVAL
);
543 assert_return(m
->hdr
, -EINVAL
);
544 assert_return(rtnl_message_type_is_addr(m
->hdr
->nlmsg_type
), -EINVAL
);
545 assert_return(prefixlen
, -EINVAL
);
547 ifa
= NLMSG_DATA(m
->hdr
);
549 *prefixlen
= ifa
->ifa_prefixlen
;
554 int sd_rtnl_message_addr_get_scope(sd_netlink_message
*m
, unsigned char *scope
) {
555 struct ifaddrmsg
*ifa
;
557 assert_return(m
, -EINVAL
);
558 assert_return(m
->hdr
, -EINVAL
);
559 assert_return(rtnl_message_type_is_addr(m
->hdr
->nlmsg_type
), -EINVAL
);
560 assert_return(scope
, -EINVAL
);
562 ifa
= NLMSG_DATA(m
->hdr
);
564 *scope
= ifa
->ifa_scope
;
569 int sd_rtnl_message_addr_get_flags(sd_netlink_message
*m
, unsigned char *flags
) {
570 struct ifaddrmsg
*ifa
;
572 assert_return(m
, -EINVAL
);
573 assert_return(m
->hdr
, -EINVAL
);
574 assert_return(rtnl_message_type_is_addr(m
->hdr
->nlmsg_type
), -EINVAL
);
575 assert_return(flags
, -EINVAL
);
577 ifa
= NLMSG_DATA(m
->hdr
);
579 *flags
= ifa
->ifa_flags
;
584 int sd_rtnl_message_addr_get_ifindex(sd_netlink_message
*m
, int *ifindex
) {
585 struct ifaddrmsg
*ifa
;
587 assert_return(m
, -EINVAL
);
588 assert_return(m
->hdr
, -EINVAL
);
589 assert_return(rtnl_message_type_is_addr(m
->hdr
->nlmsg_type
), -EINVAL
);
590 assert_return(ifindex
, -EINVAL
);
592 ifa
= NLMSG_DATA(m
->hdr
);
594 *ifindex
= ifa
->ifa_index
;
599 int sd_rtnl_message_new_addr(sd_netlink
*rtnl
, sd_netlink_message
**ret
,
600 uint16_t nlmsg_type
, int index
,
602 struct ifaddrmsg
*ifa
;
605 assert_return(rtnl_message_type_is_addr(nlmsg_type
), -EINVAL
);
606 assert_return((nlmsg_type
== RTM_GETADDR
&& index
== 0) ||
608 assert_return((nlmsg_type
== RTM_GETADDR
&& family
== AF_UNSPEC
) ||
609 IN_SET(family
, AF_INET
, AF_INET6
), -EINVAL
);
610 assert_return(ret
, -EINVAL
);
612 r
= message_new(rtnl
, ret
, nlmsg_type
);
616 if (nlmsg_type
== RTM_GETADDR
)
617 (*ret
)->hdr
->nlmsg_flags
|= NLM_F_DUMP
;
619 ifa
= NLMSG_DATA((*ret
)->hdr
);
621 ifa
->ifa_index
= index
;
622 ifa
->ifa_family
= family
;
623 if (family
== AF_INET
)
624 ifa
->ifa_prefixlen
= 32;
625 else if (family
== AF_INET6
)
626 ifa
->ifa_prefixlen
= 128;
631 int sd_rtnl_message_new_addr_update(sd_netlink
*rtnl
, sd_netlink_message
**ret
,
632 int index
, int family
) {
635 r
= sd_rtnl_message_new_addr(rtnl
, ret
, RTM_NEWADDR
, index
, family
);
639 (*ret
)->hdr
->nlmsg_flags
|= NLM_F_REPLACE
;
644 int sd_rtnl_message_link_get_ifindex(sd_netlink_message
*m
, int *ifindex
) {
645 struct ifinfomsg
*ifi
;
647 assert_return(m
, -EINVAL
);
648 assert_return(m
->hdr
, -EINVAL
);
649 assert_return(rtnl_message_type_is_link(m
->hdr
->nlmsg_type
), -EINVAL
);
650 assert_return(ifindex
, -EINVAL
);
652 ifi
= NLMSG_DATA(m
->hdr
);
654 *ifindex
= ifi
->ifi_index
;
659 int sd_rtnl_message_link_get_flags(sd_netlink_message
*m
, unsigned *flags
) {
660 struct ifinfomsg
*ifi
;
662 assert_return(m
, -EINVAL
);
663 assert_return(m
->hdr
, -EINVAL
);
664 assert_return(rtnl_message_type_is_link(m
->hdr
->nlmsg_type
), -EINVAL
);
665 assert_return(flags
, -EINVAL
);
667 ifi
= NLMSG_DATA(m
->hdr
);
669 *flags
= ifi
->ifi_flags
;
674 int sd_rtnl_message_link_get_type(sd_netlink_message
*m
, unsigned short *type
) {
675 struct ifinfomsg
*ifi
;
677 assert_return(m
, -EINVAL
);
678 assert_return(m
->hdr
, -EINVAL
);
679 assert_return(rtnl_message_type_is_link(m
->hdr
->nlmsg_type
), -EINVAL
);
680 assert_return(type
, -EINVAL
);
682 ifi
= NLMSG_DATA(m
->hdr
);
684 *type
= ifi
->ifi_type
;
689 int sd_rtnl_message_get_family(sd_netlink_message
*m
, int *family
) {
690 assert_return(m
, -EINVAL
);
691 assert_return(family
, -EINVAL
);
695 if (rtnl_message_type_is_link(m
->hdr
->nlmsg_type
)) {
696 struct ifinfomsg
*ifi
;
698 ifi
= NLMSG_DATA(m
->hdr
);
700 *family
= ifi
->ifi_family
;
703 } else if (rtnl_message_type_is_route(m
->hdr
->nlmsg_type
)) {
706 rtm
= NLMSG_DATA(m
->hdr
);
708 *family
= rtm
->rtm_family
;
711 } else if (rtnl_message_type_is_neigh(m
->hdr
->nlmsg_type
)) {
714 ndm
= NLMSG_DATA(m
->hdr
);
716 *family
= ndm
->ndm_family
;
719 } else if (rtnl_message_type_is_addr(m
->hdr
->nlmsg_type
)) {
720 struct ifaddrmsg
*ifa
;
722 ifa
= NLMSG_DATA(m
->hdr
);
724 *family
= ifa
->ifa_family
;
727 } else if (rtnl_message_type_is_routing_policy_rule(m
->hdr
->nlmsg_type
)) {
730 rtm
= NLMSG_DATA(m
->hdr
);
732 *family
= rtm
->rtm_family
;
740 int sd_rtnl_message_new_addrlabel(sd_netlink
*rtnl
, sd_netlink_message
**ret
, uint16_t nlmsg_type
, int ifindex
, int ifal_family
) {
741 struct ifaddrlblmsg
*addrlabel
;
744 assert_return(rtnl_message_type_is_addrlabel(nlmsg_type
), -EINVAL
);
745 assert_return(ret
, -EINVAL
);
747 r
= message_new(rtnl
, ret
, nlmsg_type
);
751 if (nlmsg_type
== RTM_NEWADDRLABEL
)
752 (*ret
)->hdr
->nlmsg_flags
|= NLM_F_CREATE
| NLM_F_EXCL
;
754 addrlabel
= NLMSG_DATA((*ret
)->hdr
);
756 addrlabel
->ifal_family
= ifal_family
;
757 addrlabel
->ifal_index
= ifindex
;
762 int sd_rtnl_message_addrlabel_set_prefixlen(sd_netlink_message
*m
, unsigned char prefixlen
) {
763 struct ifaddrlblmsg
*addrlabel
;
765 assert_return(m
, -EINVAL
);
766 assert_return(m
->hdr
, -EINVAL
);
767 assert_return(rtnl_message_type_is_addrlabel(m
->hdr
->nlmsg_type
), -EINVAL
);
769 addrlabel
= NLMSG_DATA(m
->hdr
);
774 addrlabel
->ifal_prefixlen
= prefixlen
;
779 int sd_rtnl_message_addrlabel_get_prefixlen(sd_netlink_message
*m
, unsigned char *prefixlen
) {
780 struct ifaddrlblmsg
*addrlabel
;
782 assert_return(m
, -EINVAL
);
783 assert_return(m
->hdr
, -EINVAL
);
784 assert_return(rtnl_message_type_is_addrlabel(m
->hdr
->nlmsg_type
), -EINVAL
);
786 addrlabel
= NLMSG_DATA(m
->hdr
);
788 *prefixlen
= addrlabel
->ifal_prefixlen
;
793 int sd_rtnl_message_new_routing_policy_rule(sd_netlink
*rtnl
, sd_netlink_message
**ret
, uint16_t nlmsg_type
, int ifal_family
) {
797 assert_return(rtnl_message_type_is_routing_policy_rule(nlmsg_type
), -EINVAL
);
798 assert_return(ret
, -EINVAL
);
800 r
= message_new(rtnl
, ret
, nlmsg_type
);
804 if (nlmsg_type
== RTM_NEWRULE
)
805 (*ret
)->hdr
->nlmsg_flags
|= NLM_F_CREATE
| NLM_F_EXCL
;
807 rtm
= NLMSG_DATA((*ret
)->hdr
);
808 rtm
->rtm_family
= ifal_family
;
809 rtm
->rtm_protocol
= RTPROT_BOOT
;
810 rtm
->rtm_scope
= RT_SCOPE_UNIVERSE
;
811 rtm
->rtm_type
= RTN_UNICAST
;
816 int sd_rtnl_message_routing_policy_rule_set_tos(sd_netlink_message
*m
, unsigned char tos
) {
817 struct rtmsg
*routing_policy_rule
;
819 assert_return(m
, -EINVAL
);
820 assert_return(m
->hdr
, -EINVAL
);
821 assert_return(rtnl_message_type_is_routing_policy_rule(m
->hdr
->nlmsg_type
), -EINVAL
);
823 routing_policy_rule
= NLMSG_DATA(m
->hdr
);
825 routing_policy_rule
->rtm_tos
= tos
;
830 int sd_rtnl_message_routing_policy_rule_get_tos(sd_netlink_message
*m
, unsigned char *tos
) {
831 struct rtmsg
*routing_policy_rule
;
833 assert_return(m
, -EINVAL
);
834 assert_return(m
->hdr
, -EINVAL
);
835 assert_return(rtnl_message_type_is_routing_policy_rule(m
->hdr
->nlmsg_type
), -EINVAL
);
837 routing_policy_rule
= NLMSG_DATA(m
->hdr
);
839 *tos
= routing_policy_rule
->rtm_tos
;
844 int sd_rtnl_message_routing_policy_rule_set_table(sd_netlink_message
*m
, unsigned char table
) {
845 struct rtmsg
*routing_policy_rule
;
847 assert_return(m
, -EINVAL
);
848 assert_return(m
->hdr
, -EINVAL
);
849 assert_return(rtnl_message_type_is_routing_policy_rule(m
->hdr
->nlmsg_type
), -EINVAL
);
851 routing_policy_rule
= NLMSG_DATA(m
->hdr
);
853 routing_policy_rule
->rtm_table
= table
;
858 int sd_rtnl_message_routing_policy_rule_get_table(sd_netlink_message
*m
, unsigned char *table
) {
859 struct rtmsg
*routing_policy_rule
;
861 assert_return(m
, -EINVAL
);
862 assert_return(m
->hdr
, -EINVAL
);
863 assert_return(rtnl_message_type_is_routing_policy_rule(m
->hdr
->nlmsg_type
), -EINVAL
);
865 routing_policy_rule
= NLMSG_DATA(m
->hdr
);
867 *table
= routing_policy_rule
->rtm_table
;
872 int sd_rtnl_message_routing_policy_rule_set_rtm_type(sd_netlink_message
*m
, unsigned char type
) {
873 struct rtmsg
*routing_policy_rule
;
875 assert_return(m
, -EINVAL
);
876 assert_return(m
->hdr
, -EINVAL
);
877 assert_return(rtnl_message_type_is_routing_policy_rule(m
->hdr
->nlmsg_type
), -EINVAL
);
879 routing_policy_rule
= NLMSG_DATA(m
->hdr
);
881 routing_policy_rule
->rtm_type
= type
;
886 int sd_rtnl_message_routing_policy_rule_get_rtm_type(sd_netlink_message
*m
, unsigned char *type
) {
887 struct rtmsg
*routing_policy_rule
;
889 assert_return(m
, -EINVAL
);
890 assert_return(m
->hdr
, -EINVAL
);
891 assert_return(rtnl_message_type_is_routing_policy_rule(m
->hdr
->nlmsg_type
), -EINVAL
);
893 routing_policy_rule
= NLMSG_DATA(m
->hdr
);
895 *type
= routing_policy_rule
->rtm_type
;
900 int sd_rtnl_message_routing_policy_rule_set_rtm_dst_prefixlen(sd_netlink_message
*m
, unsigned char len
) {
901 struct rtmsg
*routing_policy_rule
;
903 assert_return(m
, -EINVAL
);
904 assert_return(m
->hdr
, -EINVAL
);
905 assert_return(rtnl_message_type_is_routing_policy_rule(m
->hdr
->nlmsg_type
), -EINVAL
);
907 routing_policy_rule
= NLMSG_DATA(m
->hdr
);
909 routing_policy_rule
->rtm_dst_len
= len
;
914 int sd_rtnl_message_routing_policy_rule_get_rtm_dst_prefixlen(sd_netlink_message
*m
, unsigned char *len
) {
915 struct rtmsg
*routing_policy_rule
;
917 assert_return(m
, -EINVAL
);
918 assert_return(m
->hdr
, -EINVAL
);
919 assert_return(rtnl_message_type_is_routing_policy_rule(m
->hdr
->nlmsg_type
), -EINVAL
);
921 routing_policy_rule
= NLMSG_DATA(m
->hdr
);
923 *len
= routing_policy_rule
->rtm_dst_len
;
928 int sd_rtnl_message_routing_policy_rule_set_rtm_src_prefixlen(sd_netlink_message
*m
, unsigned char len
) {
929 struct rtmsg
*routing_policy_rule
;
931 assert_return(m
, -EINVAL
);
932 assert_return(m
->hdr
, -EINVAL
);
933 assert_return(rtnl_message_type_is_routing_policy_rule(m
->hdr
->nlmsg_type
), -EINVAL
);
935 routing_policy_rule
= NLMSG_DATA(m
->hdr
);
937 routing_policy_rule
->rtm_src_len
= len
;
942 int sd_rtnl_message_routing_policy_rule_get_rtm_src_prefixlen(sd_netlink_message
*m
, unsigned char *len
) {
943 struct rtmsg
*routing_policy_rule
;
945 assert_return(m
, -EINVAL
);
946 assert_return(m
->hdr
, -EINVAL
);
947 assert_return(rtnl_message_type_is_routing_policy_rule(m
->hdr
->nlmsg_type
), -EINVAL
);
949 routing_policy_rule
= NLMSG_DATA(m
->hdr
);
951 *len
= routing_policy_rule
->rtm_src_len
;