1/*
2 * Copyright (c) 2011-2016 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15/**
16 * @file
17 * @brief BFD protocol implementation
18 */
19#include <vnet/bfd/bfd_protocol.h>
20
21u8
22bfd_pkt_get_version (const bfd_pkt_t * pkt)
23{
24  return pkt->head.vers_diag >> 5;
25}
26
27void
28bfd_pkt_set_version (bfd_pkt_t * pkt, int version)
29{
30  pkt->head.vers_diag =
31    (version << 5) | (pkt->head.vers_diag & ((1 << 5) - 1));
32}
33
34u8
35bfd_pkt_get_diag_code (const bfd_pkt_t * pkt)
36{
37  return pkt->head.vers_diag & ((1 << 5) - 1);
38}
39
40void
41bfd_pkt_set_diag_code (bfd_pkt_t * pkt, int value)
42{
43  pkt->head.vers_diag =
44    (pkt->head.vers_diag & ~((1 << 5) - 1)) | (value & ((1 << 5) - 1));
45}
46
47u8
48bfd_pkt_get_state (const bfd_pkt_t * pkt)
49{
50  return pkt->head.sta_flags >> 6;
51}
52
53void
54bfd_pkt_set_state (bfd_pkt_t * pkt, int value)
55{
56  pkt->head.sta_flags = (value << 6) | (pkt->head.sta_flags & ((1 << 6) - 1));
57}
58
59u8
60bfd_pkt_get_poll (const bfd_pkt_t * pkt)
61{
62  return (pkt->head.sta_flags >> 5) & 1;
63}
64
65void
66bfd_pkt_set_poll (bfd_pkt_t * pkt)
67{
68  pkt->head.sta_flags |= 1 << 5;
69}
70
71u8
72bfd_pkt_get_final (const bfd_pkt_t * pkt)
73{
74  return (pkt->head.sta_flags >> 4) & 1;
75}
76
77void
78bfd_pkt_set_final (bfd_pkt_t * pkt)
79{
80  pkt->head.sta_flags |= 1 << 4;
81}
82
83u8
84bfd_pkt_get_control_plane_independent (const bfd_pkt_t * pkt)
85{
86  return (pkt->head.sta_flags >> 3) & 1;
87}
88
89#if 0
90void
91bfd_pkt_set_control_plane_independent (bfd_pkt_t * pkt)
92{
93  pkt->head.sta_flags |= 1 << 3;
94}
95#endif
96
97u8
98bfd_pkt_get_auth_present (const bfd_pkt_t * pkt)
99{
100  return (pkt->head.sta_flags >> 2) & 1;
101}
102
103void
104bfd_pkt_set_auth_present (bfd_pkt_t * pkt)
105{
106  pkt->head.sta_flags |= 1 << 2;
107}
108
109u8
110bfd_pkt_get_demand (const bfd_pkt_t * pkt)
111{
112  return (pkt->head.sta_flags >> 1) & 1;
113}
114
115#if 0
116void
117bfd_pkt_set_demand (bfd_pkt_t * pkt)
118{
119  pkt->head.sta_flags |= 1 << 1;
120}
121#endif
122
123u8
124bfd_pkt_get_multipoint (const bfd_pkt_t * pkt)
125{
126  return (pkt->head.sta_flags >> 0) & 1;
127}
128
129#if 0
130void
131bfd_pkt_set_multipoint (bfd_pkt_t * pkt)
132{
133  pkt->head.sta_flags |= 1 << 0;
134}
135#endif
136
137u32
138bfd_max_key_len_for_auth_type (bfd_auth_type_e auth_type)
139{
140#define F(t, l, n, s) \
141  if (auth_type == t) \
142    {                 \
143      return l;       \
144    }
145  foreach_bfd_auth_type (F);
146#undef F
147  return 0;
148}
149
150const char *
151bfd_auth_type_str (bfd_auth_type_e auth_type)
152{
153#define F(t, l, n, s) \
154  if (auth_type == t) \
155    {                 \
156      return s;       \
157    }
158  foreach_bfd_auth_type (F);
159#undef F
160  return "UNKNOWN";
161}
162
163const char *
164bfd_diag_code_string (bfd_diag_code_e diag)
165{
166#define F(n, t, s)             \
167  case BFD_DIAG_CODE_NAME (t): \
168    return s;
169  switch (diag)
170    {
171    foreach_bfd_diag_code (F)}
172  return "UNKNOWN";
173#undef F
174}
175
176const char *
177bfd_state_string (bfd_state_e state)
178{
179#define F(n, t, s)         \
180  case BFD_STATE_NAME (t): \
181    return s;
182  switch (state)
183    {
184    foreach_bfd_state (F)}
185  return "UNKNOWN";
186#undef F
187}
188
189/*
190 * fd.io coding-style-patch-verification: ON
191 *
192 * Local Variables:
193 * eval: (c-set-style "gnu")
194 * End:
195 */
196