// proto_bfd_t const *inst = talloc_get_type_abort_const(instance, proto_bfd_t);
fr_io_track_t *track = talloc_get_type_abort(request->async->packet_ctx, fr_io_track_t);
fr_io_address_t const *address = track->address;
- ssize_t data_len;
- fr_client_t const *client;
+ fr_client_t const *client;
/*
* Process layer NAK, or "Do not respond".
}
/*
- * Overwrite the src ip address on the outbound packet
- * with the one specified by the client. This is useful
- * to work around broken DSR implementations and other
- * routing issues.
+ * @todo - change our state based on the reply packet.
*/
- if (client->src_ipaddr.af != AF_UNSPEC) {
- request->reply->socket.inet.src_ipaddr = client->src_ipaddr;
- }
-
- data_len = fr_bfd_encode(buffer, buffer_len, request->packet->data,
- client->secret, talloc_array_length(client->secret) - 1,
- &request->reply_pairs);
- if (data_len < 0) {
- RPEDEBUG("Failed encoding BFD reply");
- return -1;
- }
-
- if (RDEBUG_ENABLED) {
- RDEBUG("Sending %s ID %i from %pV:%i to %pV:%i length %zu via socket %s",
- fr_bfd_packet_names[request->reply->code],
- request->reply->id,
- fr_box_ipaddr(request->reply->socket.inet.src_ipaddr),
- request->reply->socket.inet.src_port,
- fr_box_ipaddr(request->reply->socket.inet.dst_ipaddr),
- request->reply->socket.inet.dst_port,
- data_len,
- request->async->listen->name);
-
- log_request_pair_list(L_DBG_LVL_1, request, NULL, &request->reply_pairs, NULL);
- }
-
- return data_len;
+ *buffer = 0x00;
+ return 1;
}
/** Open listen sockets/connect to external event source
};
static fr_dict_attr_t const *attr_packet_type;
+static fr_dict_attr_t const *attr_bfd_packet;
+static fr_dict_attr_t const *attr_bfd_state;
extern fr_dict_attr_autoload_t process_bfd_dict_attr[];
fr_dict_attr_autoload_t process_bfd_dict_attr[] = {
{ .out = &attr_packet_type, .name = "Packet-Type", .type = FR_TYPE_UINT32, .dict = &dict_bfd},
+
+ { .out = &attr_bfd_packet, .name = "Packet", .type = FR_TYPE_STRUCT, .dict = &dict_bfd},
+ { .out = &attr_bfd_state, .name = "Packet.state", .type = FR_TYPE_UINT8, .dict = &dict_bfd},
+
{ NULL }
};
}
}
+RESUME_NO_MCTX(recv_bfd)
+{
+ rlm_rcode_t rcode = *p_result;
+ fr_pair_t *vp;
+ uint32_t state = 0;
+
+ PROCESS_TRACE;
+
+ fr_assert(rcode < RLM_MODULE_NUMCODES);
+
+ /*
+ * Check for a state / reply code.
+ */
+ vp = fr_pair_find_by_da(&request->reply_pairs, NULL, attr_packet_type);
+ if (vp) {
+ state = vp->vp_uint32;
+ } else {
+ vp = fr_pair_find_by_da(&request->reply_pairs, NULL, attr_bfd_packet);
+ if (vp) vp = fr_pair_find_by_da(&vp->vp_group, NULL, attr_bfd_state);
+ if (vp) state = vp->vp_uint8;
+ }
+
+ fr_assert(PROCESS_PACKET_CODE_VALID(state));
+
+ request->reply->code = state;
+
+ request->reply->timestamp = fr_time();
+
+ return UNLANG_ACTION_CALCULATE_RESULT;
+}
+
+
/*
* recv FOO
*/
.default_reply = FR_BFD_DOWN,
.rcode = RLM_MODULE_NOOP,
.recv = recv_generic,
- .resume = resume_recv_generic,
+ .resume = resume_recv_bfd,
.section_offset = offsetof(process_bfd_sections_t, recv_admin_down),
},
.default_reply = FR_BFD_DOWN,
.rcode = RLM_MODULE_NOOP,
.recv = recv_generic,
- .resume = resume_recv_generic,
+ .resume = resume_recv_bfd,
.section_offset = offsetof(process_bfd_sections_t, recv_down),
},
.default_reply = FR_BFD_UP,
.rcode = RLM_MODULE_NOOP,
.recv = recv_generic,
- .resume = resume_recv_generic,
+ .resume = resume_recv_bfd,
.section_offset = offsetof(process_bfd_sections_t, recv_init),
},
.default_reply = FR_BFD_UP,
.rcode = RLM_MODULE_NOOP,
.recv = recv_generic,
- .resume = resume_recv_generic,
+ .resume = resume_recv_bfd,
.section_offset = offsetof(process_bfd_sections_t, recv_up),
},
};