udp_result_t *r;
udp_request_t *u;
fr_trunk_request_t *treq;
+ fr_trunk_enqueue_t q;
fr_assert(request->packet->code > 0);
fr_assert(request->packet->code < FR_RADIUS_CODE_MAX);
pair_delete_request(attr_message_authenticator);
}
- if (fr_trunk_request_enqueue(&treq, t->trunk, request, u, r) < 0) {
+ q = fr_trunk_request_enqueue(&treq, t->trunk, request, u, r);
+ if (q < 0) {
fr_assert(!u->rr && !u->packet); /* Should not have been fed to the muxer */
fr_trunk_request_free(&treq); /* Return to the free list */
+ fail:
talloc_free(r);
RETURN_MODULE_FAIL;
}
+ /*
+ * All destinations are down.
+ */
+ if (q == FR_TRUNK_ENQUEUE_IN_BACKLOG) {
+ RDEBUG("All destinations are down - cannot send packet");
+ goto fail;
+ }
+
r->treq = treq; /* Remember for signalling purposes */
talloc_set_destructor(u, _udp_request_free);
udp_result_t *r;
udp_request_t *u;
fr_trunk_request_t *treq;
+ fr_trunk_enqueue_t q;
fr_assert(FR_TACACS_PACKET_CODE_VALID(request->packet->code));
r->rcode = RLM_MODULE_FAIL;
- if (fr_trunk_request_enqueue(&treq, t->trunk, request, u, r) < 0) {
+ q = fr_trunk_request_enqueue(&treq, t->trunk, request, u, r);
+ if (q < 0) {
fr_assert(!u->packet); /* Should not have been fed to the muxer */
fr_trunk_request_free(&treq); /* Return to the free list */
+ fail:
talloc_free(r);
RETURN_MODULE_FAIL;
}
+ /*
+ * All destinations are down.
+ */
+ if (q == FR_TRUNK_ENQUEUE_IN_BACKLOG) {
+ RDEBUG("All destinations are down - cannot send packet");
+ goto fail;
+ }
+
r->treq = treq; /* Remember for signalling purposes */
*rctx_out = r;