aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/igmp/igmp_src.h
blob: e366494cf429a006139a42952f8d69a269bfacdf (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
/*
 *------------------------------------------------------------------
 * Copyright (c) 2018 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 __IGMP_SOURCE_H__
#define __IGMP_SOURCE_H__

#include <igmp/igmp_types.h>

/**
 * IGMP Source timers
 */
typedef enum igmp_src_timer_t_
{
  /**
   * On expiry the source has not been refreshed by a query
   * and can now be reaped
   */
  IGMP_SRC_TIMER_EXP,
} igmp_src_timer_t;

#define IGMP_SRC_N_TIMERS (IGMP_SRC_TIMER_EXP + 1)

/**
 *  @brief IGMP source
 *  The representation of a specified source address with in multicast group.
 */
typedef struct igmp_src_t_
{
  /**
   * The source's key
   */
  igmp_key_t *key;

  /**
   * The liveness timer. Reset with each received report. on expiry
   * the source is removed from the group.
   */
  u32 exp_timer;

  /**
   * The group this source is on
   */
  u32 group;

  /**
   * the mode that provided this source
   */
  igmp_mode_t mode;

  /**
   * Timers
   */
  u32 timers[IGMP_SRC_N_TIMERS];

  /**
   * Tells us which configurations
   * have this source.
   */
  u8 *referance_by_config_index;
} igmp_src_t;

extern void igmp_src_free (igmp_src_t * src);

extern igmp_src_t *igmp_src_alloc (u32 group_index,
				   const igmp_key_t * skey, igmp_mode_t mode);

extern u32 igmp_src_index (igmp_src_t * src);

extern void igmp_src_refresh (igmp_src_t * src);
extern void igmp_src_blocked (igmp_src_t * src);
extern u8 *format_igmp_src (u8 * s, va_list * args);

#endif

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */
each_vec64f _(f,32,2) #define foreach_vec128i _(i,8,16) _(i,16,8) _(i,32,4) _(i,64,2) #define foreach_vec128u _(u,8,16) _(u,16,8) _(u,32,4) _(u,64,2) #define foreach_vec128f _(f,32,4) _(f,64,2) #define foreach_vec256i _(i,8,32) _(i,16,16) _(i,32,8) _(i,64,4) #define foreach_vec256u _(u,8,32) _(u,16,16) _(u,32,8) _(u,64,4) #define foreach_vec256f _(f,32,8) _(f,64,4) #define foreach_vec512i _(i,8,64) _(i,16,32) _(i,32,16) _(i,64,8) #define foreach_vec512u _(u,8,64) _(u,16,32) _(u,32,16) _(u,64,8) #define foreach_vec512f _(f,32,16) _(f,64,8) #if defined (CLIB_HAVE_VEC512) #define foreach_int_vec foreach_vec64i foreach_vec128i foreach_vec256i foreach_vec512i #define foreach_uint_vec foreach_vec64u foreach_vec128u foreach_vec256u foreach_vec512u #define foreach_float_vec foreach_vec64f foreach_vec128f foreach_vec256f foreach_vec512f #elif defined (CLIB_HAVE_VEC256) #define foreach_int_vec foreach_vec64i foreach_vec128i foreach_vec256i #define foreach_uint_vec foreach_vec64u foreach_vec128u foreach_vec256u #define foreach_float_vec foreach_vec64f foreach_vec128f foreach_vec256f #else #define foreach_int_vec foreach_vec64i foreach_vec128i #define foreach_uint_vec foreach_vec64u foreach_vec128u #define foreach_float_vec foreach_vec64f foreach_vec128f #endif #define foreach_vec foreach_int_vec foreach_uint_vec foreach_float_vec /* *INDENT-OFF* */ /* Type Definitions */ #define _(t,s,c) \ typedef t##s t##s##x##c _vector_size (s/8*c); \ typedef t##s t##s##x##c##u _vector_size_unaligned (s/8*c); \ typedef union { \ t##s##x##c as_##t##s##x##c; \ t##s as_##t##s[c]; \ } t##s##x##c##_union_t; foreach_vec64i foreach_vec64u foreach_vec64f foreach_vec128i foreach_vec128u foreach_vec128f foreach_vec256i foreach_vec256u foreach_vec256f foreach_vec512i foreach_vec512u foreach_vec512f #undef _ /* universal inlines */ #define _(t, s, c) \ static_always_inline t##s##x##c \ t##s##x##c##_zero () \ { return (t##s##x##c) {}; } \ foreach_vec #undef _ #undef _vector_size #define VECTOR_WORD_TYPE(t) t##x #define VECTOR_WORD_TYPE_LEN(t) (sizeof (VECTOR_WORD_TYPE(t)) / sizeof (t)) #if defined (__SSE4_2__) && __GNUC__ >= 4 #include <vppinfra/vector_sse42.h> #endif #if defined (__AVX2__) #include <vppinfra/vector_avx2.h> #endif #if defined(__AVX512F__) #include <vppinfra/vector_avx512.h> #endif #if defined (__ALTIVEC__) #include <vppinfra/vector_altivec.h> #endif #if defined (__aarch64__) #include <vppinfra/vector_neon.h> #endif /* this macro generate _splat inline functions for each scalar vector type */ #ifndef CLIB_VEC128_SPLAT_DEFINED #define _(t, s, c) \ static_always_inline t##s##x##c \ t##s##x##c##_splat (t##s x) \ { \ t##s##x##c r; \ int i; \ \ for (i = 0; i < c; i++) \ r[i] = x; \ \ return r; \ } foreach_vec128i foreach_vec128u #undef _ #endif /* *INDENT-ON* */ #endif /* included_clib_vector_h */ /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */