]> git.ipfire.org Git - thirdparty/FORT-validator.git/commitdiff
Parrot a different session number for each RTR version
authorAlberto Leiva Popper <ydahhrk@gmail.com>
Fri, 29 May 2026 01:07:01 +0000 (19:07 -0600)
committerAlberto Leiva Popper <ydahhrk@gmail.com>
Fri, 29 May 2026 01:07:01 +0000 (19:07 -0600)
I'd forgotten this requirement from 8210bis:

> To reduce the risk of confusion,
> cache servers SHOULD NOT use the same Session ID across multiple
> protocol versions

src/rtr/pdu_handler.c
src/rtr/pdu_sender.c
test/rtr/pdu_handler_test.c

index 40b3dddb2896f5c60fe9025d5ed61357e4a47e90..ad3ed4eb062840c5d1e0fdeae23877d6b91a474d 100644 (file)
@@ -230,7 +230,7 @@ send_aspas(int fd, uint8_t ver, serial_t serial)
 }
 
 static int
-load_rtr_metadata(struct rtr_metadata *rtr)
+load_rtr_metadata(struct rtr_metadata *rtr, uint8_t version)
 {
        struct rtr_index idx;
        int error;
@@ -243,7 +243,7 @@ load_rtr_metadata(struct rtr_metadata *rtr)
                goto end;
        }
 
-       rtr->session = idx.session;
+       rtr->session = idx.session + version;
        rtr->serial = idx.serials->serial;
 
 end:   rtridx_cleanup(&idx);
@@ -263,7 +263,7 @@ handle_reset_query_pdu(struct rtr_request *request)
        stream.fd = request->fd;
        stream.ver = request->pdu.rtr_version;
 
-       error = load_rtr_metadata(&rtr);
+       error = load_rtr_metadata(&rtr, stream.ver);
        switch (error) {
        case 0:
                break;
@@ -511,7 +511,7 @@ handle_serial_query_pdu(struct rtr_request *request)
        stream.fd = request->fd;
        stream.ver = request->pdu.rtr_version;
 
-       error = load_rtr_metadata(&rtr);
+       error = load_rtr_metadata(&rtr, stream.ver);
        switch (error) {
        case 0:      break;
        case ENOENT: return err_pdu_send_no_data_available(stream.fd, stream.ver);
index baf7d610fb2f7c71e285178eeb97fa9aa5d9eb35..1768d1109e8b56d32eb6650b3eb6a8c930de4abd 100644 (file)
@@ -94,7 +94,7 @@ send_serial_notify_pdu(int fd, uint8_t version, struct rtr_metadata *meta)
 
        pr_op_debug("Sending Serial Notify PDU.");
 
-       buf = serialize_hdr(data, version, type, meta->session, len);
+       buf = serialize_hdr(data, version, type, meta->session + version, len);
        buf = write_uint32(buf, meta->serial);
 
        return send_response(fd, type, data, len);
index 257d7d8c5c7cd0d89aabcd292e85294788210717..6d54a2404bb1fae8a16da780826bbf2421b8c218 100644 (file)
@@ -324,10 +324,10 @@ START_TEST(test_natural_flows)
        e = 0;
        expected_pdu_add(PDU_TYPE_ERROR_REPORT, 0, 0);
        rcv_reset_query();
-       rcv_serial_query(0x1234, 0);
+       rcv_serial_query(0x1236, 0);
 
        /* First cycle: One tree, no deltas */
-       session = mock_serial1();
+       session = mock_serial1() + RTR_V2;
 
        e = 0;
        expected_pdu_add(PDU_TYPE_CACHE_RESPONSE, 0, 0);
@@ -475,7 +475,7 @@ START_TEST(test_delta_forget)
        rcv_serial_query(0x1234, 0);
 
        /* First cycle: One tree, no deltas */
-       session = mock_serial1();
+       session = mock_serial1() + RTR_V2;
 
        e = 0;
        expected_pdu_add(PDU_TYPE_CACHE_RESPONSE, 0, 0);
@@ -601,7 +601,7 @@ START_TEST(test_no_incremental_update_available)
        deltas_lifetime = 5;
        if (file_exists("tmp/rtr") == 0)
                ck_assert_int_eq(0, file_rm_rf("tmp/rtr"));
-       session = mock_serial1();
+       session = mock_serial1() + RTR_V2;
        mock_serial2();
        mock_serial3();
        mock_serial4();