MCPcopy Create free account
hub / github.com/SNAS/openbmp / parseRouteDistinguisher

Method parseRouteDistinguisher

Server/src/bgp/EVPN.cpp:159–241  ·  view source on GitHub ↗

* Parse Route Distinguisher * * \details * Will parse the Route Distinguisher. Based on https://tools.ietf.org/html/rfc4364#section-4.2 * * \param [in/out] data_pointer Pointer to the beginning of Route Distinguisher * \param [out] rd_type Reference to RD type. * \param [out] rd_assigned_number Reference to Assigned Numbe

Source from the content-addressed store, hash-verified

157 * \param [out] rd_administrator_subfield Reference to Administrator subfield
158 */
159 void EVPN::parseRouteDistinguisher(u_char *data_pointer, uint8_t *rd_type, std::string *rd_assigned_number,
160 std::string *rd_administrator_subfield) {
161 std::stringstream val_ss;
162
163 data_pointer++;
164 *rd_type = *data_pointer;
165 data_pointer++;
166
167 switch (*rd_type) {
168 case 0: {
169 uint16_t administration_subfield;
170 bzero(&administration_subfield, 2);
171 memcpy(&administration_subfield, data_pointer, 2);
172
173 data_pointer += 2;
174
175 uint32_t assigned_number_subfield;
176 bzero(&assigned_number_subfield, 4);
177 memcpy(&assigned_number_subfield, data_pointer, 4);
178
179 bgp::SWAP_BYTES(&administration_subfield);
180 bgp::SWAP_BYTES(&assigned_number_subfield);
181
182 val_ss << assigned_number_subfield;
183
184 *rd_assigned_number = val_ss.str();
185
186 val_ss.clear();
187 val_ss << administration_subfield;
188 *rd_administrator_subfield = val_ss.str();
189
190 break;
191 };
192
193 case 1: {
194 u_char administration_subfield[4];
195 bzero(&administration_subfield, 4);
196 memcpy(&administration_subfield, data_pointer, 4);
197
198 data_pointer += 4;
199
200 uint16_t assigned_number_subfield;
201 bzero(&assigned_number_subfield, 2);
202 memcpy(&assigned_number_subfield, data_pointer, 2);
203
204 bgp::SWAP_BYTES(&assigned_number_subfield);
205
206 char administration_subfield_chars[INET_ADDRSTRLEN];
207 inet_ntop(AF_INET, administration_subfield, administration_subfield_chars, INET_ADDRSTRLEN);
208
209 val_ss << assigned_number_subfield;
210 *rd_assigned_number = val_ss.str();
211
212 *rd_administrator_subfield = administration_subfield_chars;
213
214 break;
215 };
216

Callers

nothing calls this directly

Calls 1

SWAP_BYTESFunction · 0.85

Tested by

no test coverage detected