summaryrefslogtreecommitdiffstats
path: root/src/vnet/api_errno.h
blob: 4e91e132b8967c8e806774d8aaeaeb536ddd8869 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
 * Copyright (c) 2015 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef included_vnet_api_errno_h
#define included_vnet_api_errno_h

#include <stdarg.h>
#include <vppinfra/types.h>
#include <vppinfra/format.h>
#include <vnet/error.h>

#define foreach_vnet_api_error foreach_vnet_error

typedef enum
{
#define _(a,b,c) VNET_API_ERROR_##a = (b),
  foreach_vnet_api_error
#undef _
    VNET_API_N_ERROR,
} vnet_api_error_t;

format_function_t format_vnet_api_errno;

static_always_inline vnet_api_error_t
vnet_api_error (clib_error_t *err)
{
  if (err->code >= 0)
    return VNET_API_ERROR_BUG;
  return err->code;
}

#endif /* included_vnet_api_errno_h */

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */
t: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ }
from scapy.layers.l2 import ARP
from scapy.layers.inet6 import ICMPv6ND_NS, ICMPv6ND_NA, IPv6

from framework import VppTestCase

""" TestArping is a subclass of  VPPTestCase classes.

Basic test for sanity check of arping.

"""


class TestArping(VppTestCase):
    """ Arping Test Case """

    @classmethod
    def setUpClass(cls):
        super(TestArping, cls).setUpClass()
        try:
            cls.create_pg_interfaces(range(2))
            cls.interfaces = list(cls.pg_interfaces)

            for i in cls.interfaces:
                i.admin_up()
                i.config_ip4()
                i.config_ip6()
                i.disable_ipv6_ra()
                i.resolve_arp()
                i.resolve_ndp()
        except Exception:
            super(TestArping, cls).tearDownClass()
            raise

    @classmethod
    def tearDownClass(cls):
        super(TestArping, cls).tearDownClass()

    def tearDown(self):
        super(TestArping, self).tearDown()

    def show_commands_at_teardown(self):
        self.logger.info(self.vapi.cli("show hardware"))

    def verify_arping_request(self, p, src, dst):
        arp = p[ARP]
        self.assertEqual(arp.hwtype, 0x0001)
        self.assertEqual(arp.ptype, 0x0800)
        self.assertEqual(arp.hwlen, 6)
        self.assertEqual(arp.op, 1)
        self.assertEqual(arp.psrc, src)
        self.assertEqual(arp.pdst, dst)

    def verify_arping_ip6_ns(self, p, src, dst):
        icmpv6 = p[ICMPv6ND_NS]
        self.assertEqual(icmpv6.type, 135)
        self.assertEqual(icmpv6.tgt, dst)
        ipv6 = p[IPv6]
        self.assertEqual(src, ipv6.src)

    def verify_arping_ip6_na(self, p, src, dst):
        icmpv6 = p[ICMPv6ND_NA]
        self.assertEqual(icmpv6.type, 136)
        self.assertEqual(icmpv6.tgt, dst)
        ipv6 = p[IPv6]
        self.assertEqual(src, ipv6.src)

    def test_arping_ip4_arp_request_cli(self):
        """ arping IP4 arp request CLI test """
        try:
            self.pg_enable_capture(self.pg_interfaces)
            self.pg_start()
            remote_ip4 = self.pg1.remote_ip4

            ping_cmd = "arping " + remote_ip4 + "pg1 repeat 5 interval 0.1"
            ret = self.vapi.cli(ping_cmd)
            self.logger.info(ret)

            ping_cmd = "arping " + remote_ip4 + "pg1"
            ret = self.vapi.cli(ping_cmd)
            self.logger.info(ret)

            out = self.pg1.get_capture(6)
            for p in out:
                self.verify_arping_request(p, self.pg1.local_ip4,
                                           self.pg1.remote_ip4)
        finally:
            self.vapi.cli("show error")

    def test_arping_ip4_garp_cli(self):
        """ arping ip4 gratuitous arp CLI test """
        try:
            self.pg_enable_capture(self.pg_interfaces)
            self.pg_start()

            ping_cmd = ("arping gratuitous" + self.pg1.local_ip4 +
                        "pg1 repeat 5 interval 0.1")
            ret = self.vapi.cli(ping_cmd)
            self.logger.info(ret)

            ping_cmd = "arping gratuitous" + self.pg1.local_ip4 + "pg1"
            ret = self.vapi.cli(ping_cmd)
            self.logger.info(ret)

            out = self.pg1.get_capture(6)
            for p in out:
                self.verify_arping_request(p, self.pg1.local_ip4,
                                           self.pg1.local_ip4)
        finally:
            self.vapi.cli("show error")

    def test_arping_ip4_arp_request_api(self):
        """ arping ip4 arp request API test """
        try:
            self.pg_enable_capture(self.pg_interfaces)
            self.pg_start()
            remote_ip4 = self.pg1.remote_ip4

            ret = self.vapi.arping(address=remote_ip4,
                                   sw_if_index=self.pg1.sw_if_index,
                                   is_garp=0, repeat=5, interval=0.1)
            self.logger.info(ret)

            ret = self.vapi.arping(address=remote_ip4,
                                   sw_if_index=self.pg1.sw_if_index,
                                   is_garp=0)
            self.logger.info(ret)

            out = self.pg1.get_capture(6)
            for p in out:
                self.verify_arping_request(p, self.pg1.local_ip4,
                                           self.pg1.remote_ip4)
        finally:
            self.vapi.cli("show error")

    def test_arping_ip4_garp_api(self):
        """ arping ip4 gratuitous arp API test """
        try:
            self.pg_enable_capture(self.pg_interfaces)
            self.pg_start()

            ret = self.vapi.arping(address=self.pg1.local_ip4,
                                   sw_if_index=self.pg1.sw_if_index,
                                   is_garp=1, repeat=5, interval=0.1)
            self.logger.info(ret)

            ret = self.vapi.arping(address=self.pg1.local_ip4,
                                   sw_if_index=self.pg1.sw_if_index,
                                   is_garp=1)
            self.logger.info(ret)

            out = self.pg1.get_capture(6)
            for p in out:
                self.verify_arping_request(p, self.pg1.local_ip4,
                                           self.pg1.local_ip4)
        finally:
            self.vapi.cli("show error")

    def test_arping_ip6_ns_cli(self):
        """ arping IP6 neighbor solicitation CLI test """
        try:
            self.pg_enable_capture(self.pg_interfaces)
            self.pg_start()
            remote_ip6 = self.pg1.remote_ip6

            ping_cmd = "arping " + remote_ip6 + "pg1 repeat 5 interval 0.1"
            ret = self.vapi.cli(ping_cmd)
            self.logger.info(ret)

            ping_cmd = "arping " + remote_ip6 + "pg1"
            ret = self.vapi.cli(ping_cmd)
            self.logger.info(ret)

            out = self.pg1.get_capture(6)
            for p in out:
                self.verify_arping_ip6_ns(p, self.pg1.local_ip6,
                                          self.pg1.remote_ip6)
        finally:
            self.vapi.cli("show error")

    def test_arping_ip6_ns_api(self):
        """ arping ip6 neighbor solicitation API test """
        try:
            self.pg_enable_capture(self.pg_interfaces)
            self.pg_start()
            remote_ip6 = self.pg1.remote_ip6

            ret = self.vapi.arping(address=remote_ip6,
                                   sw_if_index=self.pg1.sw_if_index,
                                   is_garp=0, repeat=5, interval=0.1)
            self.logger.info(ret)

            ret = self.vapi.arping(address=remote_ip6,
                                   sw_if_index=self.pg1.sw_if_index,
                                   is_garp=0)
            self.logger.info(ret)

            out = self.pg1.get_capture(6)
            for p in out:
                self.verify_arping_ip6_ns(p, self.pg1.local_ip6,
                                          self.pg1.remote_ip6)
        finally:
            self.vapi.cli("show error")

    def test_arping_ip6_na_cli(self):
        """ arping ip6 neighbor advertisement CLI test """
        try:
            self.pg_enable_capture(self.pg_interfaces)
            self.pg_start()

            ping_cmd = ("arping gratuitous" + self.pg1.local_ip6 +
                        "pg1 repeat 5 interval 0.1")
            ret = self.vapi.cli(ping_cmd)
            self.logger.info(ret)

            ping_cmd = "arping gratuitous" + self.pg1.local_ip6 + "pg1"
            ret = self.vapi.cli(ping_cmd)
            self.logger.info(ret)

            out = self.pg1.get_capture(6)
            for p in out:
                self.verify_arping_ip6_na(p, self.pg1.local_ip6,
                                          self.pg1.local_ip6)
        finally:
            self.vapi.cli("show error")

    def test_arping_ip6_na_api(self):
        """ arping ip6 neighbor advertisement API test """
        try:
            self.pg_enable_capture(self.pg_interfaces)
            self.pg_start()

            ret = self.vapi.arping(address=self.pg1.local_ip6,
                                   sw_if_index=self.pg1.sw_if_index,
                                   is_garp=1, repeat=5, interval=0.1)
            self.logger.info(ret)

            ret = self.vapi.arping(address=self.pg1.local_ip6,
                                   sw_if_index=self.pg1.sw_if_index,
                                   is_garp=1)
            self.logger.info(ret)

            out = self.pg1.get_capture(6)
            for p in out:
                self.verify_arping_ip6_na(p, self.pg1.local_ip6,
                                          self.pg1.local_ip6)
        finally:
            self.vapi.cli("show error")


if __name__ == '__main__':
    unittest.main(testRunner=VppTestRunner)