goto internal_error;
}
+ request->stream->session = rtr.session;
+
error = send_cache_response_pdu(stream.fd, stream.ver, rtr.session);
if (error)
return error;
default: goto internal_error;
}
+ /* Negotiated session vs request session */
+ if (request->stream->session == -1)
+ request->stream->session = request->pdu.obj.sq.session_id;
+ else if (request->stream->session != request->pdu.obj.sq.session_id)
+ return err_pdu_send_corrupt_data(stream.fd, stream.ver,
+ &request->pdu.raw, "Session ID doesn't match.");
+
+ /* Request session vs existing cache session */
if (request->pdu.obj.sq.session_id != rtr.session)
return send_cache_reset_pdu(stream.fd, stream.ver);
result->fd = fd;
strcpy(result->addr, addr);
result->rtr_version = -1;
+ result->session = -1;
result->start = result->buffer;
result->end = result->buffer;
struct pdu_stream { /* It's an *input* stream. */
int fd;
- char addr[INET6_ADDRSTRLEN]; /* Printable address of the client. */
- int rtr_version; /* -1: unset; > 0: version number */
+ char addr[INET6_ADDRSTRLEN]; /* Printable address of the client. */
+ int rtr_version; /* -1: unset; > 0: version number */
+ int session; /* -1: unset; > 0: session */
unsigned char buffer[RTRPDU_MAX_LEN2];
/* buffer's active bytes */