goto fail;
}
- if (packet->length < 24) {
- DEBUG("BFD packet has wrong length (%d < 24)", packet->length);
+ if (packet->length < FR_BFD_HEADER_LENGTH) {
+ DEBUG("BFD packet header has wrong length (%d < 24)", packet->length);
goto fail;
}
if (packet->length > sizeof(*packet)) {
- DEBUG("BFD packet has wrong length (%d > %zd)", packet->length, sizeof(*packet));
+ DEBUG("BFD packet length is larger than received packet (%d > %zd)", packet->length, sizeof(*packet));
goto fail;
}
if (packet->auth_present) {
if (packet->length < (FR_BFD_HEADER_LENGTH + 2)) { /* auth-type and auth-len */
- DEBUG("BFD packet has wrong length (%d < 26)",
+ DEBUG("BFD packet length is not enough for auth-type and auth-len (%d < 26)",
packet->length);
goto fail;
}
if (packet->length < 24 + packet->auth.basic.auth_len) {
- DEBUG("BFD packet is too short (%d < %d)",
+ DEBUG("BFD packet length is not enough for authentication data (%d < %d)",
packet->length, FR_BFD_HEADER_LENGTH + packet->auth.basic.auth_len);
goto fail;
snprintf(buffer, sizeof(buffer), "server.bfd.%s",
fr_bfd_packet_names[session->session_state]);
+ DEBUG("BFD %s trigger %s", session->client.shortname, buffer);
+
// bfd_request(session, request, &packet);
- trigger_exec(unlang_interpret_get_thread_default(), NULL, buffer, false, NULL);
+// trigger_exec(unlang_interpret_get_thread_default(), NULL, buffer, false, NULL);
}
/*
int bfd_session_process(proto_bfd_peer_t *session, bfd_packet_t *bfd)
{
+ bool state_change = false;
+
if (bfd->auth_present &&
(session->auth_type == BFD_AUTH_RESERVED)) {
DEBUG("BFD %s packet asked to authenticate an unauthenticated session.", session->client.shortname);
session->client.shortname, fr_bfd_packet_names[session->session_state]);
session->session_state = BFD_STATE_DOWN;
bfd_trigger(session);
+ state_change = true;
bfd_set_desired_min_tx_interval(session, fr_time_delta_from_usec(1));
session->client.shortname);
session->session_state = BFD_STATE_INIT;
bfd_trigger(session);
+ state_change = true;
bfd_set_desired_min_tx_interval(session, fr_time_delta_from_usec(1));
break;
session->client.shortname);
session->session_state = BFD_STATE_UP;
bfd_trigger(session);
+ state_change = true;
break;
default: /* don't change anything */
session->client.shortname);
session->session_state = BFD_STATE_UP;
bfd_trigger(session);
+ state_change = true;
break;
default: /* don't change anything */
DEBUG("BFD %s State UP -> DOWN (neighbor down)", session->client.shortname);
session->session_state = BFD_STATE_DOWN;
bfd_trigger(session);
+ state_change = true;
bfd_set_desired_min_tx_interval(session, fr_time_delta_from_usec(1));
break;
}
#endif
-
if ((!session->remote_demand_mode) ||
(session->session_state != BFD_STATE_UP) ||
(session->remote_session_state != BFD_STATE_UP)) {
bfd_start_control(session);
}
+ if (!state_change) return 0;
+
// @todo - send the packet through a "recv foo" section?
return 1;
* mean we start polling.
*/
+/*
+ * Verify and/or calculate passwords
+ */
+static void bfd_calc_simple(proto_bfd_peer_t *session, bfd_packet_t *bfd)
+{
+ bfd_auth_simple_t *simple = &bfd->auth.password;
+
+ fr_assert(session->secret_len <= sizeof(simple->password));
+
+ memcpy(simple->password, session->client.secret, session->secret_len);
+ simple->auth_len = session->secret_len;
+}
+
+static void bfd_auth_simple(proto_bfd_peer_t *session, bfd_packet_t *bfd)
+{
+ bfd_auth_simple_t *simple = &bfd->auth.password;
+
+ simple->auth_type = session->auth_type;
+ simple->auth_len = session->secret_len;
+ bfd->length += simple->auth_len;
+
+ simple->key_id = 0;
+
+ bfd_calc_simple(session, bfd);
+}
/*
* Verify and/or calculate auth-type digests.
return 1;
}
+static int bfd_verify_simple(proto_bfd_peer_t *session, bfd_packet_t *bfd)
+{
+ bfd_auth_simple_t *simple = &bfd->auth.password;
+
+ if (simple->auth_len != session->secret_len) return 0;
+
+ if (simple->key_id != 0) return 0;
+
+ return (fr_digest_cmp((uint8_t const *) session->client.secret, simple->password, session->secret_len) == 0);
+}
+
static int bfd_verify_md5(proto_bfd_peer_t *session, bfd_packet_t *bfd)
{
int rcode;
return 0;
case BFD_AUTH_SIMPLE:
+ bfd_verify_simple(session, bfd);
break;
case BFD_AUTH_KEYED_MD5:
break;
case BFD_AUTH_SIMPLE:
+ bfd_auth_simple(session, bfd);
break;
case BFD_AUTH_KEYED_MD5: