This is with a view of removing packet->vps, and moving it to request_t, after which we can maybe merge all the list heads under a single root.
return 0;
}
-static int mschapv1_encode(fr_radius_packet_t *packet, fr_pair_list_t *request,
+static int mschapv1_encode(fr_radius_packet_t *packet, fr_pair_list_t *list,
char const *password)
{
unsigned int i;
MEM(challenge = fr_pair_afrom_da(packet, attr_ms_chap_challenge));
- fr_pair_add(request, challenge);
+ fr_pair_add(list, challenge);
challenge->vp_length = 8;
challenge->vp_octets = p = talloc_array(challenge, uint8_t, challenge->vp_length);
for (i = 0; i < challenge->vp_length; i++) {
}
MEM(reply = fr_pair_afrom_da(packet, attr_ms_chap_response));
- fr_pair_add(request, reply);
+ fr_pair_add(list, reply);
reply->vp_length = 50;
reply->vp_octets = p = talloc_array(reply, uint8_t, reply->vp_length);
memset(p, 0, reply->vp_length);
/*
* Send the packet.
*/
- if (fr_radius_packet_send(request->packet, NULL, secret) < 0) {
+ if (fr_radius_packet_send(request->packet, &request->request_pairs, NULL, secret) < 0) {
REDEBUG("Failed to send packet for ID %d", request->packet->id);
deallocate_id(request);
request->done = true;
/*
* If this fails, we're out of memory.
*/
- if (fr_radius_packet_decode(request->reply, request->packet, RADIUS_MAX_ATTRIBUTES, false, secret) != 0) {
+ if (fr_radius_packet_decode(request->reply, &request->reply_pairs,
+ request->packet, RADIUS_MAX_ATTRIBUTES, false, secret) != 0) {
REDEBUG("Reply decode failed");
stats.lost++;
goto packet_done;
FILE *log_fp = fr_log_fp;
fr_log_fp = NULL;
- ret = fr_radius_packet_decode(packet, original ? original->expect : NULL,
+ ret = fr_radius_packet_decode(packet, &packet->vps, original ? original->expect : NULL,
RADIUS_MAX_ATTRIBUTES, false, conf->radius_secret);
fr_log_fp = log_fp;
if (ret != 0) {
FILE *log_fp = fr_log_fp;
fr_log_fp = NULL;
- ret = fr_radius_packet_decode(packet, NULL,
+ ret = fr_radius_packet_decode(packet, &packet->vps, NULL,
RADIUS_MAX_ATTRIBUTES, false, conf->radius_secret);
fr_log_fp = log_fp;
*/
{
fr_radius_packet_t *reply = NULL;
- ssize_t rcode;
+ ssize_t rcode;
- fd_set set;
+ fd_set set;
- unsigned int ret;
- unsigned int i;
+ unsigned int ret;
+ unsigned int i;
- if (fr_radius_packet_encode(packet, NULL, conf->secret) < 0) {
+ if (fr_radius_packet_encode(packet, &packet->vps, NULL, conf->secret) < 0) {
fr_perror("Failed encoding packet");
return EXIT_FAILURE;
}
talloc_free(packet);
continue;
}
- if (fr_radius_packet_decode(reply, packet,
+ if (fr_radius_packet_decode(reply, &reply->vps, packet,
RADIUS_MAX_ATTRIBUTES, false, conf->secret) < 0) {
fr_perror("Failed decoding reply");
goto recv_error;
/** Encode a packet
*
*/
-ssize_t fr_radius_packet_encode(fr_radius_packet_t *packet, fr_radius_packet_t const *original, char const *secret)
+ssize_t fr_radius_packet_encode(fr_radius_packet_t *packet, fr_pair_list_t *list,
+ fr_radius_packet_t const *original, char const *secret)
{
uint8_t const *original_data;
ssize_t slen;
memcpy(data + 4, packet->vector, sizeof(packet->vector));
slen = fr_radius_encode(data, sizeof(data), original_data, secret, talloc_array_length(secret) - 1,
- packet->code, packet->id, &packet->vps);
+ packet->code, packet->id, list);
if (slen < 0) return slen;
/*
return 0;
}
-
/** Calculate/check digest, and decode radius attributes
*
+ * @param[in] packet to decode.
+ * @param[in] list to add pairs to.
+ * @param[in] original packet, if this is a reply.
+ * @param[in] max_attributes to decode.
+ * @param[in] tunnel_password_zeros set random elements of the tunnel password
+ * vectors to zero to aid in testing.
+ * @param[in] secret shared secret used for decoding encrypted
+ * password attributes.
* @return
* - 0 on success
* - -1 on decoding error.
*/
-int fr_radius_packet_decode(fr_radius_packet_t *packet, fr_radius_packet_t *original,
+int fr_radius_packet_decode(fr_radius_packet_t *packet, fr_pair_list_t *list,
+ fr_radius_packet_t *original,
uint32_t max_attributes, bool tunnel_password_zeros, char const *secret)
{
int packet_length;
talloc_free_children(packet_ctx.tmp_ctx);
}
- fr_cursor_init(&out, &packet->vps);
+ fr_cursor_init(&out, list);
fr_cursor_tail(&out); /* Move insertion point to the end of the list */
fr_cursor_head(&cursor);
fr_cursor_merge(&out, &cursor);
*
* Also attach reply attribute value pairs and any user message provided.
*/
-int fr_radius_packet_send(fr_radius_packet_t *packet, fr_radius_packet_t const *original,
- char const *secret)
+int fr_radius_packet_send(fr_radius_packet_t *packet, fr_pair_list_t *list,
+ fr_radius_packet_t const *original, char const *secret)
{
/*
* Maybe it's a fake packet. Don't send it.
/*
* Encode the packet.
*/
- if (fr_radius_packet_encode(packet, original, secret) < 0) {
+ if (fr_radius_packet_encode(packet, list, original, secret) < 0) {
return -1;
}
/*
* protocols/radius/packet.c
*/
-ssize_t fr_radius_packet_encode(fr_radius_packet_t *packet, fr_radius_packet_t const *original,
- char const *secret) CC_HINT(nonnull (1,3));
-int fr_radius_packet_decode(fr_radius_packet_t *packet, fr_radius_packet_t *original,
+ssize_t fr_radius_packet_encode(fr_radius_packet_t *packet, fr_pair_list_t *list,
+ fr_radius_packet_t const *original,
+ char const *secret) CC_HINT(nonnull (1,2,4));
+int fr_radius_packet_decode(fr_radius_packet_t *packet, fr_pair_list_t *list,
+ fr_radius_packet_t *original,
uint32_t max_attributes, bool tunnel_password_zeros,
- char const *secret) CC_HINT(nonnull (1,5));
+ char const *secret) CC_HINT(nonnull (1,2,6));
bool fr_radius_packet_ok(fr_radius_packet_t *packet, uint32_t max_attributes, bool require_ma,
decode_fail_t *reason) CC_HINT(nonnull (1));
char const *secret) CC_HINT(nonnull (1,3));
fr_radius_packet_t *fr_radius_packet_recv(TALLOC_CTX *ctx, int fd, int flags, uint32_t max_attributes, bool require_ma);
-int fr_radius_packet_send(fr_radius_packet_t *packet, fr_radius_packet_t const *original,
- char const *secret) CC_HINT(nonnull (1,3));
+int fr_radius_packet_send(fr_radius_packet_t *packet, fr_pair_list_t *list,
+ fr_radius_packet_t const *original, char const *secret) CC_HINT(nonnull (1,2,4));
#define fr_radius_packet_log_hex(_log, _packet) _fr_radius_packet_log_hex(_log, _packet, __FILE__, __LINE__);
void _fr_radius_packet_log_hex(fr_log_t const *log, fr_radius_packet_t const *packet, char const *file, int line) CC_HINT(nonnull);