* 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
| 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 |
nothing calls this directly
no test coverage detected