1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 /* Make sure the net/if.h header is included before any linux/ one */
6 #include <linux/if_tunnel.h>
11 #include "sd-netlink.h"
14 #include "module-util.h"
17 static int load_module(const char *mod_name
) {
18 _cleanup_(sym_kmod_unrefp
) struct kmod_ctx
*ctx
= NULL
;
19 _cleanup_(sym_kmod_module_unref_listp
) struct kmod_list
*list
= NULL
;
25 return log_error_errno(r
, "Failed to load libkmod: %m");
27 ctx
= sym_kmod_new(NULL
, NULL
);
31 r
= sym_kmod_module_new_from_lookup(ctx
, mod_name
, &list
);
35 sym_kmod_list_foreach(l
, list
) {
36 _cleanup_(sym_kmod_module_unrefp
) struct kmod_module
*mod
= NULL
;
38 mod
= sym_kmod_module_get_module(l
);
40 r
= sym_kmod_module_probe_insert_module(mod
, 0, NULL
, NULL
, NULL
, NULL
);
48 static int test_tunnel_configure(sd_netlink
*rtnl
) {
50 sd_netlink_message
*m
, *n
;
51 struct in_addr local
, remote
;
53 /* skip test if module cannot be loaded */
54 r
= load_module("ipip");
56 return log_tests_skipped_errno(r
, "failed to load module 'ipip'");
58 r
= load_module("sit");
60 return log_tests_skipped_errno(r
, "failed to load module 'sit'");
63 return log_tests_skipped("not root");
66 assert_se(sd_rtnl_message_new_link(rtnl
, &m
, RTM_NEWLINK
, 0) >= 0);
69 assert_se(sd_netlink_message_append_string(m
, IFLA_IFNAME
, "ipip-tunnel") >= 0);
70 assert_se(sd_netlink_message_append_u32(m
, IFLA_MTU
, 1234)>= 0);
72 assert_se(sd_netlink_message_open_container(m
, IFLA_LINKINFO
) >= 0);
74 assert_se(sd_netlink_message_open_container_union(m
, IFLA_INFO_DATA
, "ipip") >= 0);
76 inet_pton(AF_INET
, "192.168.21.1", &local
.s_addr
);
77 assert_se(sd_netlink_message_append_u32(m
, IFLA_IPTUN_LOCAL
, local
.s_addr
) >= 0);
79 inet_pton(AF_INET
, "192.168.21.2", &remote
.s_addr
);
80 assert_se(sd_netlink_message_append_u32(m
, IFLA_IPTUN_REMOTE
, remote
.s_addr
) >= 0);
82 assert_se(sd_netlink_message_close_container(m
) >= 0);
83 assert_se(sd_netlink_message_close_container(m
) >= 0);
85 assert_se(sd_netlink_call(rtnl
, m
, -1, 0) == 1);
87 assert_se((m
= sd_netlink_message_unref(m
)) == NULL
);
90 assert_se(sd_rtnl_message_new_link(rtnl
, &n
, RTM_NEWLINK
, 0) >= 0);
93 assert_se(sd_netlink_message_append_string(n
, IFLA_IFNAME
, "sit-tunnel") >= 0);
94 assert_se(sd_netlink_message_append_u32(n
, IFLA_MTU
, 1234)>= 0);
96 assert_se(sd_netlink_message_open_container(n
, IFLA_LINKINFO
) >= 0);
98 assert_se(sd_netlink_message_open_container_union(n
, IFLA_INFO_DATA
, "sit") >= 0);
100 assert_se(sd_netlink_message_append_u8(n
, IFLA_IPTUN_PROTO
, IPPROTO_IPIP
) >= 0);
102 inet_pton(AF_INET
, "192.168.21.3", &local
.s_addr
);
103 assert_se(sd_netlink_message_append_u32(n
, IFLA_IPTUN_LOCAL
, local
.s_addr
) >= 0);
105 inet_pton(AF_INET
, "192.168.21.4", &remote
.s_addr
);
106 assert_se(sd_netlink_message_append_u32(n
, IFLA_IPTUN_REMOTE
, remote
.s_addr
) >= 0);
108 assert_se(sd_netlink_message_close_container(n
) >= 0);
109 assert_se(sd_netlink_message_close_container(n
) >= 0);
111 assert_se(sd_netlink_call(rtnl
, n
, -1, 0) == 1);
113 assert_se((n
= sd_netlink_message_unref(n
)) == NULL
);
118 int main(int argc
, char *argv
[]) {
122 test_setup_logging(LOG_INFO
);
124 assert_se(sd_netlink_open(&rtnl
) >= 0);
127 r
= test_tunnel_configure(rtnl
);
129 assert_se((rtnl
= sd_netlink_unref(rtnl
)) == NULL
);