summaryrefslogtreecommitdiffstats
path: root/test/vpp_vxlan_gbp_tunnel.py
AgeCommit message (Collapse)AuthorFilesLines
2019-11-15tests: Remove the unrequired VPP IP address/prefix class wrappersNeale Ranns1-12/+8
Type: refactor Change-Id: I204f3f8eebc5f5d5a377e91262f91c615fd00168 Signed-off-by: Neale Ranns <nranns@cisco.com>
2019-06-25tests: fix test_gbp.py.Paul Vinciguerra1-10/+24
A number of VppGbpContractRules were missing the hash_mode_t and were being replaced by an optional kwarg. Type: fix Change-Id: I6ca03c93b69e4355c237a6c9402e1e178b701b21 Signed-off-by: Paul Vinciguerra <pvinci@vinciconsulting.com>
2019-03-29tests: refactor vpp_object.pyPaul Vinciguerra1-3/+0
Move __str__ to super for all subclasses of VppObject Implement __repr__ in VppObject Implement __hash__ and __eq__ Change-Id: Ibd4ea37b84b17f499ab86630fb5b9ed9c8b4b1c2 Signed-off-by: Paul Vinciguerra <pvinci@vinciconsulting.com>
2019-03-27GBP: fixes for l3-out routingNeale Ranns1-1/+8
Change-Id: I4d73b712da911588d511a8401b73cdc3c66346fe Signed-off-by: Neale Ranns <nranns@cisco.com>
2018-12-06API: Change ip4_address and ip6_address to use type alias.Ole Troan1-2/+2
Change-Id: Id8669bbadd1d6b2054865a310a654e9b38d1667d Signed-off-by: Ole Troan <ot@cisco.com>
2018-11-07GBP Endpoint LearningNeale Ranns1-0/+69
Learning GBP endpoints over vxlan-gbp tunnels Change-Id: I1db9fda5a16802d9ad8b4efd4e475614f3b21502 Signed-off-by: Neale Ranns <neale.ranns@cisco.com>
id='n200' href='#n200'>200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
/*
 * 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.
 */
/*
  Copyright (c) 2005 Eliot Dresselhaus

  Permission is hereby granted, free of charge, to any person obtaining
  a copy of this software and associated documentation files (the
  "Software"), to deal in the Software without restriction, including
  without limitation the rights to use, copy, modify, merge, publish,
  distribute, sublicense, and/or sell copies of the Software, and to
  permit persons to whom the Software is furnished to do so, subject to
  the following conditions:

  The above copyright notice and this permission notice shall be
  included in all copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

#include <vppinfra/format.h>
#include <vppinfra/random.h>
#include <vppinfra/serialize.h>
#include <vppinfra/os.h>

#define foreach_my_vector_type			\
  _ (u8, a8)					\
  _ (u16, a16)					\
  _ (u32, a32)

typedef struct
{
#define _(t,f) t f;
  foreach_my_vector_type
#undef _
} my_vector_type_t;

static void
serialize_my_vector_type_single (serialize_main_t * m, va_list * va)
{
  my_vector_type_t *v = va_arg (*va, my_vector_type_t *);
  u32 n = va_arg (*va, u32);
  u32 i;

  for (i = 0; i < n; i++)
    {
#define _(t,f) serialize_integer (m, v[i].f, sizeof (v[i].f));
      foreach_my_vector_type;
    }
#undef _
}

static void
unserialize_my_vector_type_single (serialize_main_t * m, va_list * va)
{
  my_vector_type_t *v = va_arg (*va, my_vector_type_t *);
  u32 n = va_arg (*va, u32);
  u32 i;

  for (i = 0; i < n; i++)
    {
#define _(t,f) { u32 tmp; unserialize_integer (m, &tmp, sizeof (v[i].f)); v[i].f = tmp; }
      foreach_my_vector_type;
#undef _
    }
}

static void
serialize_my_vector_type_multiple (serialize_main_t * m, va_list * va)
{
  my_vector_type_t *v = va_arg (*va, my_vector_type_t *);
  u32 n = va_arg (*va, u32);

#define _(t,f)					\
  serialize_multiple				\
    (m,						\
     &v[0].f,					\
     STRUCT_SIZE_OF (my_vector_type_t, f),	\
     STRUCT_STRIDE_OF (my_vector_type_t, f),	\
     n);

  foreach_my_vector_type;

#undef _
}

static void
unserialize_my_vector_type_multiple (serialize_main_t * m, va_list * va)
{
  my_vector_type_t *v = va_arg (*va, my_vector_type_t *);
  u32 n = va_arg (*va, u32);

#define _(t,f)					\
  unserialize_multiple				\
    (m,						\
     &v[0].f,					\
     STRUCT_SIZE_OF (my_vector_type_t, f),	\
     STRUCT_STRIDE_OF (my_vector_type_t, f),	\
     n);

  foreach_my_vector_type;

#undef _
}

typedef struct
{
  u32 n_iter;
  u32 seed;
  u32 verbose;
  u32 multiple;
  u32 max_len;

  my_vector_type_t **test_vectors;

  char *dump_file;

  serialize_main_t serialize_main;
  serialize_main_t unserialize_main;
} test_serialize_main_t;

int
test_serialize_main (unformat_input_t * input)
{
  clib_error_t *error = 0;
  test_serialize_main_t _tm, *tm = &_tm;
  serialize_main_t *sm = &tm->serialize_main;
  serialize_main_t *um = &tm->unserialize_main;
  uword i;

  clib_memset (tm, 0, sizeof (tm[0]));
  tm->n_iter = 100;
  tm->seed = 1;
  tm->max_len = 128;
  tm->verbose = 0;
  tm->multiple = 1;

  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
    {
      if (unformat (input, "iter %d", &tm->n_iter))
	;
      else if (unformat (input, "seed %d", &tm->seed))
	;
      else if (unformat (input, "file %s", &tm->dump_file))
	;
      else if (unformat (input, "max-len %d", &tm->max_len))
	;
      else if (unformat (input, "multiple %=", &tm->multiple, 1))
	;
      else if (unformat (input, "single %=", &tm->multiple, 0))
	;
      else if (unformat (input, "verbose %=", &tm->verbose, 1))
	;
      else
	{
	  error = clib_error_create ("unknown input `%U'\n",
				     format_unformat_error, input);
	  goto done;
	}
    }

  if (tm->seed == 0)
    tm->seed = random_default_seed ();

  clib_warning ("iter %d seed %d max-len %d", tm->n_iter, tm->seed,
		tm->max_len);

#ifdef CLIB_UNIX
  if (tm->dump_file)
    serialize_open_clib_file (sm, tm->dump_file);
  else
#endif
    serialize_open_vector (sm, 0);

  vec_resize (tm->test_vectors, tm->n_iter);
  for (i = 0; i < tm->n_iter; i++)
    {
      uword l = 1 + (random_u32 (&tm->seed) % tm->max_len);
      my_vector_type_t *mv;

      vec_resize (tm->test_vectors[i], l);
      vec_foreach (mv, tm->test_vectors[i])
      {
#define _(t,f) mv->f = random_u32 (&tm->seed) & pow2_mask (31);
	foreach_my_vector_type;
#undef _
      }

      vec_serialize (sm, tm->test_vectors[i],
		     tm->multiple ? serialize_my_vector_type_multiple :
		     serialize_my_vector_type_single);
    }

  if (tm->verbose)
    clib_warning ("overflow vector max bytes %d",
		  vec_max_len (sm->stream.overflow_buffer));

  serialize_close (sm);

#ifdef CLIB_UNIX
  if (tm->dump_file)
    {
      if ((error = unserialize_open_clib_file (um, tm->dump_file)))
	goto done;
    }
  else
#endif
    {
      u8 *v = serialize_close_vector (sm);
      unserialize_open_data (um, v, vec_len (v));
    }

  for (i = 0; i < tm->n_iter; i++)
    {
      my_vector_type_t *mv0;
      my_vector_type_t *mv1;

      vec_unserialize (um, &mv0,
		       tm->multiple ? unserialize_my_vector_type_multiple :
		       unserialize_my_vector_type_single);
      mv1 = tm->test_vectors[i];

      if (vec_len (mv0) != vec_len (mv1))
	os_panic ();
      if (memcmp (mv0, mv1, vec_len (mv0) * sizeof (mv0[0])))
	os_panic ();

      vec_free (mv0);
    }

done:
  if (error)
    clib_error_report (error);
  return 0;
}

#ifdef CLIB_UNIX
int
main (int argc, char *argv[])
{
  unformat_input_t i;
  int r;

  clib_mem_init (0, 64ULL << 20);

  unformat_init_command_line (&i, argv);
  r = test_serialize_main (&i);
  unformat_free (&i);
  return r;
}
#endif

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */