RDEBUG2("Merging cache entry into request");
- if (c->control) {
- rdebug_pair_list(L_DBG_LVL_2, request, c->control, "&control:");
- radius_pairmove(request, &request->config, paircopy(request, c->control), false);
- }
-
if (c->packet && request->packet) {
rdebug_pair_list(L_DBG_LVL_2, request, c->packet, "&request:");
radius_pairmove(request, &request->packet->vps, paircopy(request->packet, c->packet), false);
radius_pairmove(request, &request->reply->vps, paircopy(request->reply, c->reply), false);
}
+ if (c->control) {
+ rdebug_pair_list(L_DBG_LVL_2, request, c->control, "&control:");
+ radius_pairmove(request, &request->config, paircopy(request, c->control), false);
+ }
+
+ if (c->state) {
+ rdebug_pair_list(L_DBG_LVL_2, request, c->state, "&session-state:");
+ radius_pairmove(request, &request->state, paircopy(request->state, c->state), false);
+ }
+
if (inst->stats) {
rad_assert(request->packet != NULL);
vp = pairfind(request->packet->vps, PW_CACHE_ENTRY_HITS, 0, TAG_ANY);
char const *key, int ttl)
{
VALUE_PAIR *vp, *to_cache;
- vp_cursor_t src_list, cached_request, cached_reply, cached_control;
+ vp_cursor_t src_list, packet, reply, control, state;
value_pair_map_t const *map;
RDEBUG("Creating new cache entry");
- fr_cursor_init(&cached_request, &c->packet);
- fr_cursor_init(&cached_reply, &c->reply);
- fr_cursor_init(&cached_control, &c->control);
+ fr_cursor_init(&packet, &c->packet);
+ fr_cursor_init(&reply, &c->reply);
+ fr_cursor_init(&control, &c->control);
+ fr_cursor_init(&state, &c->state);
for (map = inst->maps; map != NULL; map = map->next) {
rad_assert(map->lhs && map->rhs);
switch (map->lhs->tmpl_list) {
case PAIR_LIST_REQUEST:
- fr_cursor_insert(&cached_request, vp);
+ fr_cursor_insert(&packet, vp);
break;
case PAIR_LIST_REPLY:
- fr_cursor_insert(&cached_reply, vp);
+ fr_cursor_insert(&reply, vp);
break;
case PAIR_LIST_CONTROL:
- fr_cursor_insert(&cached_control, vp);
+ fr_cursor_insert(&control, vp);
+ break;
+
+ case PAIR_LIST_STATE:
+ fr_cursor_insert(&state, vp);
break;
default:
vps = c->control;
break;
+ case PAIR_LIST_STATE:
+ vps = c->state;
+ break;
+
default:
REDEBUG("Unsupported list \"%s\"", fr_int2str(pair_lists, list, "<UNKNOWN>"));
ret = -1;
}
}
+ if (c->state) {
+ for (vp = fr_cursor_init(&cursor, &c->state);
+ vp;
+ vp = fr_cursor_next(&cursor)) {
+ pair = vp_aprints(pairs, vp, '\'');
+ if (!pair) goto error;
+
+ to_store = talloc_asprintf_append_buffer(to_store, "&session-state:%s\n", pair);
+ if (!to_store) goto error;
+ }
+ }
+
finish:
talloc_free(pairs);
*out = to_store;
*/
int cache_deserialize(rlm_cache_entry_t *c, char *in, ssize_t inlen)
{
- vp_cursor_t packet, control, reply;
+ vp_cursor_t packet, control, reply, state;
TALLOC_CTX *store = NULL;
char *p, *q;
fr_cursor_init(&packet, &c->packet);
fr_cursor_init(&control, &c->control);
fr_cursor_init(&reply, &c->reply);
+ fr_cursor_init(&state, &c->state);
p = in;
fr_cursor_insert(&reply, vp);
break;
+ case PAIR_LIST_STATE:
+ fr_cursor_insert(&state, vp);
+ break;
+
default:
fr_strerror_printf("Invalid cache list for pair: %s", p);
error: