summaryrefslogtreecommitdiffstats
path: root/src/vnet/ip/ip.c
blob: caa553dd6d79197b5de0f75a3517dc0a1c1832aa (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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
 * Copyright (c) 2017 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.
 */

#include <vnet/ip/ip.h>
#include <vnet/fib/fib_table.h>

u8
ip_is_zero (ip46_address_t * ip46_address, u8 is_ip4)
{
  if (is_ip4)
    return (ip46_address->ip4.as_u32 == 0);
  else
    return (ip46_address->as_u64[0] == 0 && ip46_address->as_u64[1] == 0);
}

u8
ip_is_local_host (ip46_address_t * ip46_address, u8 is_ip4)
{
  if (is_ip4)
    return (ip46_address->ip4.as_u8[0] == 127);
  else
    return (ip46_address->as_u64[0] == 0 && ip46_address->as_u64[1] == 1);
}

/**
 * Checks that an ip is local to the requested fib
 */
u8
ip_is_local (u32 fib_index, ip46_address_t * ip46_address, u8 is_ip4)
{
  fib_node_index_t fei;
  fib_entry_flag_t flags;
  fib_prefix_t prefix;

  /* Check if requester is local */
  if (is_ip4)
    {
      prefix.fp_len = 32;
      prefix.fp_proto = FIB_PROTOCOL_IP4;
    }
  else
    {
      prefix.fp_len = 128;
      prefix.fp_proto = FIB_PROTOCOL_IP6;
    }

  clib_memcpy (&prefix.fp_addr, ip46_address, sizeof (ip46_address_t));
  fei = fib_table_lookup (0, &prefix);
  flags = fib_entry_get_flags (fei);

  return (flags & FIB_ENTRY_FLAG_LOCAL);
}

u8
ip_interface_has_address (u32 sw_if_index, ip46_address_t * ip, u8 is_ip4)
{
  ip_interface_address_t *ia = 0;

  if (is_ip4)
    {
      ip_lookup_main_t *lm4 = &ip4_main.lookup_main;
      ip4_address_t *ip4;
      /* *INDENT-OFF* */
      foreach_ip_interface_address (lm4, ia, sw_if_index, 1 /* unnumbered */ ,
      ({
        ip4 = ip_interface_address_get_address (lm4, ia);
        if (ip4_address_compare (ip4, &ip->ip4) == 0)
          return 1;
      }));
      /* *INDENT-ON* */
    }
  else
    {
      ip_lookup_main_t *lm6 = &ip6_main.lookup_main;
      ip6_address_t *ip6;
      /* *INDENT-OFF* */
      foreach_ip_interface_address (lm6, ia, sw_if_index, 1 /* unnumbered */ ,
      ({
        ip6 = ip_interface_address_get_address (lm6, ia);
        if (ip6_address_compare (ip6, &ip->ip6) == 0)
          return 1;
      }));
      /* *INDENT-ON* */
    }
  return 0;
}

void
ip_copy (ip46_address_t * dst, ip46_address_t * src, u8 is_ip4)
{
  if (is_ip4)
    dst->ip4.as_u32 = src->ip4.as_u32;
  else
    clib_memcpy (&dst->ip6, &src->ip6, sizeof (ip6_address_t));
}

void
ip_set (ip46_address_t * dst, void *src, u8 is_ip4)
{
  if (is_ip4)
    dst->ip4.as_u32 = ((ip4_address_t *) src)->as_u32;
  else
    clib_memcpy (&dst->ip6, (ip6_address_t *) src, sizeof (ip6_address_t));
}

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */
IPv4 header | ... | with IP protocol=61 and static payload. MAC addresses are matching MAC | ... | addresses of the TG node interfaces. | ... | *[Ref] Applicable standard specifications:* RFC2544. *** Variables *** # X710 bandwidth limit | ${s_limit}= | ${10000000000} # ACL test setup | ${acl_action}= | permit | ${acl_apply_type}= | input | ${no_hit_aces_number}= | 50 | ${flows_per_dir}= | 10k # starting points for non-hitting ACLs | ${src_ip_start}= | 30.30.30.1 | ${dst_ip_start}= | 40.40.40.1 | ${ip_step}= | ${1} | ${sport_start}= | ${1000} | ${dport_start}= | ${1000} | ${port_step}= | ${1} | ${trex_stream1_subnet}= | 10.10.10.0/24 | ${trex_stream2_subnet}= | 20.20.20.0/24 | ${traffic_profile}= | trex-sl-3n-ethip4udp-10u1000p-conc *** Keywords *** | Local Template | | ... | | [Documentation] | | ... | [Cfg] DUT runs IPv4 routing config. | | ... | Each DUT uses ${phy_cores} physical core(s) for worker threads. | | ... | [Ver] Measure NDR and PDR values using MLRsearch algorithm.\ | | ... | | ... | *Arguments:* | | ... | - framesize - Framesize in Bytes in integer or string (IMIX_v4_1). | | ... | Type: integer, string | | ... | - phy_cores - Number of physical cores. Type: integer | | ... | - rxq - Number of RX queues, default value: ${None}. Type: integer | | ... | | [Arguments] | ${framesize} | ${phy_cores} | ${rxq}=${None} | | ... | | Set Test Variable | ${framesize} | | Set Test Variable | ${min_rate} | ${10000} | | ... | | Given Add worker threads and rxqueues to all DUTs | ${phy_cores} | ${rxq} | | And Add PCI devices to all DUTs | | ${max_rate} | ${jumbo} = | Get Max Rate And Jumbo And Handle Multi Seg | | ... | ${s_limit} | ${framesize} | | And Apply startup configuration on all VPP DUTs | | ${ip_nr}= | Set Variable | 10 | | When Initialize IPv4 routing for '${ip_nr}' addresses with IPv4 ACLs on DUT1 in 3-node circular topology | | Then Find NDR and PDR intervals using optimized search | | ... | ${framesize} | ${traffic_profile} | ${min_rate} | ${max_rate} *** Test Cases *** | tc01-64B-1c-ethip4udp-ip4base-iacl50sl-10kflows-ndrpdr | | [Tags] | 64B | 1C | | framesize=${64} | phy_cores=${1} | tc02-64B-2c-ethip4udp-ip4base-iacl50sl-10kflows-ndrpdr | | [Tags] | 64B | 2C | | framesize=${64} | phy_cores=${2} | tc03-64B-4c-ethip4udp-ip4base-iacl50sl-10kflows-ndrpdr | | [Tags] | 64B | 4C | | framesize=${64} | phy_cores=${4} | tc04-1518B-1c-ethip4udp-ip4base-iacl50sl-10kflows-ndrpdr | | [Tags] | 1518B | 1C | | framesize=${1518} | phy_cores=${1} | tc05-1518B-2c-ethip4udp-ip4base-iacl50sl-10kflows-ndrpdr | | [Tags] | 1518B | 2C | | framesize=${1518} | phy_cores=${2} | tc06-1518B-4c-ethip4udp-ip4base-iacl50sl-10kflows-ndrpdr | | [Tags] | 1518B | 4C | | framesize=${1518} | phy_cores=${4} | tc07-9000B-1c-ethip4udp-ip4base-iacl50sl-10kflows-ndrpdr | | [Tags] | 9000B | 1C | | framesize=${9000} | phy_cores=${1} | tc08-9000B-2c-ethip4udp-ip4base-iacl50sl-10kflows-ndrpdr | | [Tags] | 9000B | 2C | | framesize=${9000} | phy_cores=${2} | tc09-9000B-4c-ethip4udp-ip4base-iacl50sl-10kflows-ndrpdr | | [Tags] | 9000B | 4C | | framesize=${9000} | phy_cores=${4} | tc10-IMIX-1c-ethip4udp-ip4base-iacl50sl-10kflows-ndrpdr | | [Tags] | IMIX | 1C | | framesize=IMIX_v4_1 | phy_cores=${1} | tc11-IMIX-2c-ethip4udp-ip4base-iacl50sl-10kflows-ndrpdr | | [Tags] | IMIX | 2C | | framesize=IMIX_v4_1 | phy_cores=${2} | tc12-IMIX-4c-ethip4udp-ip4base-iacl50sl-10kflows-ndrpdr | | [Tags] | IMIX | 4C | | framesize=IMIX_v4_1 | phy_cores=${4}