]> git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/tests/unit/network_interface_test.cc
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / seastar / tests / unit / network_interface_test.cc
1 /*
2 * This file is open source software, licensed to you under the terms
3 * of the Apache License, Version 2.0 (the "License"). See the NOTICE file
4 * distributed with this work for additional information regarding copyright
5 * ownership. You may not use this file except in compliance with the License.
6 *
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing,
12 * software distributed under the License is distributed on an
13 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 * KIND, either express or implied. See the License for the
15 * specific language governing permissions and limitations
16 * under the License.
17 */
18 /*
19 * Copyright (C) 2019 Cloudius Systems, Ltd.
20 */
21
22 #include <seastar/testing/test_case.hh>
23 #include <seastar/net/api.hh>
24 #include <seastar/net/inet_address.hh>
25 #include <seastar/net/ethernet.hh>
26 #include <seastar/net/ip.hh>
27 #include <seastar/core/reactor.hh>
28 #include <seastar/core/thread.hh>
29 #include <seastar/util/log.hh>
30
31 using namespace seastar;
32
33 static logger niflog("network_interface_test");
34
35 SEASTAR_TEST_CASE(list_interfaces) {
36 // just verifying we have something. And can access all the stuff.
37 auto interfaces = engine().net().network_interfaces();
38 BOOST_REQUIRE_GT(interfaces.size(), 0);
39
40 for (auto& nif : interfaces) {
41 niflog.info("Iface: {}, index = {}, mtu = {}, loopback = {}, virtual = {}, up = {}",
42 nif.name(), nif.index(), nif.mtu(), nif.is_loopback(), nif.is_virtual(), nif.is_up()
43 );
44 if (nif.hardware_address().size() >= 6) {
45 niflog.info(" HW: {}", net::ethernet_address(nif.hardware_address().data()));
46 }
47 for (auto& addr : nif.addresses()) {
48 niflog.info(" Addr: {}", addr);
49 }
50 }
51
52 return make_ready_future();
53 }
54
55 SEASTAR_TEST_CASE(match_ipv6_scope) {
56 auto interfaces = engine().net().network_interfaces();
57
58 for (auto& nif : interfaces) {
59 if (nif.is_loopback()) {
60 continue;
61 }
62 auto i = std::find_if(nif.addresses().begin(), nif.addresses().end(), std::mem_fn(&net::inet_address::is_ipv6));
63 if (i == nif.addresses().end()) {
64 continue;
65 }
66
67 std::ostringstream ss;
68 ss << net::inet_address(i->as_ipv6_address()) << "%" << nif.name();
69 auto text = ss.str();
70
71 net::inet_address na(text);
72
73 BOOST_REQUIRE_EQUAL(na.as_ipv6_address(), i->as_ipv6_address());
74 // also verify that the inet_address itself matches
75 BOOST_REQUIRE_EQUAL(na, *i);
76 // and that inet_address _without_ scope matches.
77 BOOST_REQUIRE_EQUAL(net::inet_address(na.as_ipv6_address()), *i);
78 BOOST_REQUIRE_EQUAL(na.scope(), nif.index());
79 // and that they are not ipv4 addresses
80 BOOST_REQUIRE_THROW(i->as_ipv4_address(), std::invalid_argument);
81 BOOST_REQUIRE_THROW(na.as_ipv4_address(), std::invalid_argument);
82
83 niflog.info("Org: {}, Parsed: {}, Text: {}", *i, na, text);
84
85 }
86
87 return make_ready_future();
88 }