blob: cd51e91a85680c78a23c820447aef9a692c838db [file] [log] [blame]
Klement Sekerab17dd962017-01-09 07:43:48 +01001/*
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 */
Klement Sekerab16bfe32017-02-28 11:56:48 +010015/**
16 * @file
17 * @brief BFD protocol implementation
18 */
Klement Sekera0e3c0de2016-09-29 14:43:44 +020019#include <vnet/bfd/bfd_protocol.h>
20
Klement Sekerab17dd962017-01-09 07:43:48 +010021u8
22bfd_pkt_get_version (const bfd_pkt_t * pkt)
Klement Sekera0e3c0de2016-09-29 14:43:44 +020023{
24 return pkt->head.vers_diag >> 5;
25}
26
Klement Sekerab17dd962017-01-09 07:43:48 +010027void
28bfd_pkt_set_version (bfd_pkt_t * pkt, int version)
Klement Sekera0e3c0de2016-09-29 14:43:44 +020029{
30 pkt->head.vers_diag =
Klement Sekerab17dd962017-01-09 07:43:48 +010031 (version << 5) | (pkt->head.vers_diag & ((1 << 5) - 1));
Klement Sekera0e3c0de2016-09-29 14:43:44 +020032}
33
Klement Sekerab17dd962017-01-09 07:43:48 +010034u8
35bfd_pkt_get_diag_code (const bfd_pkt_t * pkt)
Klement Sekera0e3c0de2016-09-29 14:43:44 +020036{
37 return pkt->head.vers_diag & ((1 << 5) - 1);
38}
39
Klement Sekerab17dd962017-01-09 07:43:48 +010040void
41bfd_pkt_set_diag_code (bfd_pkt_t * pkt, int value)
Klement Sekera0e3c0de2016-09-29 14:43:44 +020042{
43 pkt->head.vers_diag =
Klement Sekerab17dd962017-01-09 07:43:48 +010044 (pkt->head.vers_diag & ~((1 << 5) - 1)) | (value & ((1 << 5) - 1));
Klement Sekera0e3c0de2016-09-29 14:43:44 +020045}
46
Klement Sekerab17dd962017-01-09 07:43:48 +010047u8
48bfd_pkt_get_state (const bfd_pkt_t * pkt)
Klement Sekera0e3c0de2016-09-29 14:43:44 +020049{
50 return pkt->head.sta_flags >> 6;
51}
52
Klement Sekerab17dd962017-01-09 07:43:48 +010053void
54bfd_pkt_set_state (bfd_pkt_t * pkt, int value)
Klement Sekera0e3c0de2016-09-29 14:43:44 +020055{
56 pkt->head.sta_flags = (value << 6) | (pkt->head.sta_flags & ((1 << 6) - 1));
57}
58
Klement Sekerab17dd962017-01-09 07:43:48 +010059u8
60bfd_pkt_get_poll (const bfd_pkt_t * pkt)
Klement Sekera0e3c0de2016-09-29 14:43:44 +020061{
62 return (pkt->head.sta_flags >> 5) & 1;
63}
64
Klement Sekerab17dd962017-01-09 07:43:48 +010065void
66bfd_pkt_set_poll (bfd_pkt_t * pkt)
67{
68 pkt->head.sta_flags |= 1 << 5;
69}
Klement Sekera0e3c0de2016-09-29 14:43:44 +020070
Klement Sekerab17dd962017-01-09 07:43:48 +010071u8
72bfd_pkt_get_final (const bfd_pkt_t * pkt)
Klement Sekera0e3c0de2016-09-29 14:43:44 +020073{
74 return (pkt->head.sta_flags >> 4) & 1;
75}
76
Klement Sekerab17dd962017-01-09 07:43:48 +010077void
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)
Klement Sekera0e3c0de2016-09-29 14:43:44 +020085{
86 return (pkt->head.sta_flags >> 3) & 1;
87}
88
Klement Sekera73884482017-02-23 09:26:30 +010089#if 0
Klement Sekerab17dd962017-01-09 07:43:48 +010090void
91bfd_pkt_set_control_plane_independent (bfd_pkt_t * pkt)
92{
93 pkt->head.sta_flags |= 1 << 3;
94}
Klement Sekera73884482017-02-23 09:26:30 +010095#endif
Klement Sekera0e3c0de2016-09-29 14:43:44 +020096
Klement Sekerab17dd962017-01-09 07:43:48 +010097u8
98bfd_pkt_get_auth_present (const bfd_pkt_t * pkt)
Klement Sekera0e3c0de2016-09-29 14:43:44 +020099{
100 return (pkt->head.sta_flags >> 2) & 1;
101}
102
Klement Sekerab17dd962017-01-09 07:43:48 +0100103void
104bfd_pkt_set_auth_present (bfd_pkt_t * pkt)
105{
106 pkt->head.sta_flags |= 1 << 2;
107}
Klement Sekera0e3c0de2016-09-29 14:43:44 +0200108
Klement Sekerab17dd962017-01-09 07:43:48 +0100109u8
110bfd_pkt_get_demand (const bfd_pkt_t * pkt)
Klement Sekera0e3c0de2016-09-29 14:43:44 +0200111{
112 return (pkt->head.sta_flags >> 1) & 1;
113}
114
Klement Sekera73884482017-02-23 09:26:30 +0100115#if 0
Klement Sekerab17dd962017-01-09 07:43:48 +0100116void
117bfd_pkt_set_demand (bfd_pkt_t * pkt)
Klement Sekera0e3c0de2016-09-29 14:43:44 +0200118{
Klement Sekerab17dd962017-01-09 07:43:48 +0100119 pkt->head.sta_flags |= 1 << 1;
Klement Sekera0e3c0de2016-09-29 14:43:44 +0200120}
Klement Sekera73884482017-02-23 09:26:30 +0100121#endif
Klement Sekera0e3c0de2016-09-29 14:43:44 +0200122
Klement Sekerab17dd962017-01-09 07:43:48 +0100123u8
124bfd_pkt_get_multipoint (const bfd_pkt_t * pkt)
125{
126 return (pkt->head.sta_flags >> 0) & 1;
127}
128
Klement Sekera73884482017-02-23 09:26:30 +0100129#if 0
Klement Sekerab17dd962017-01-09 07:43:48 +0100130void
131bfd_pkt_set_multipoint (bfd_pkt_t * pkt)
132{
133 pkt->head.sta_flags |= 1 << 0;
134}
Klement Sekera73884482017-02-23 09:26:30 +0100135#endif
Klement Sekerab17dd962017-01-09 07:43:48 +0100136
137u32
Klement Sekerab16bfe32017-02-28 11:56:48 +0100138bfd_max_key_len_for_auth_type (bfd_auth_type_e auth_type)
Klement Sekerab17dd962017-01-09 07:43:48 +0100139{
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
Klement Sekeraa57a9702017-02-02 06:58:07 +0100163const 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
Klement Sekerab17dd962017-01-09 07:43:48 +0100189/*
190 * fd.io coding-style-patch-verification: ON
191 *
192 * Local Variables:
193 * eval: (c-set-style "gnu")
194 * End:
195 */