예제 #1
0
static void test_set_last_update(void **state)
{
	struct rtr_socket socket;

	UNUSED(state);

	socket.connection_state_fp = NULL;

	will_return(__wrap_lrtr_get_monotonic_time, RTR_ERROR);
	assert_int_equal(rtr_set_last_update(&socket), RTR_ERROR);

	will_return(__wrap_lrtr_get_monotonic_time, RTR_SUCCESS);
	assert_int_equal(rtr_set_last_update(&socket), RTR_SUCCESS);
}
예제 #2
0
파일: packets.c 프로젝트: CZ-NIC/rtrlib
int rtr_sync(struct rtr_socket *rtr_socket)
{
    char pdu[RTR_MAX_PDU_LEN];
    int rtval = rtr_receive_pdu(rtr_socket, pdu, RTR_MAX_PDU_LEN, RTR_RECV_TIMEOUT);
    //If the cache has closed the connection and we dont have a session_id
    //(no packages where exchanged) we should downgrade.
    if(rtval == TR_CLOSED && rtr_socket->request_session_id){
        RTR_DBG1("The cache server closed the connection and we have no session_id!");
        if (rtr_socket->version > RTR_PROTOCOL_MIN_SUPPORTED_VERSION)
        {
            RTR_DBG("Downgrading from %i to version %i", rtr_socket->version, rtr_socket->version-1);
            rtr_socket->version = rtr_socket->version - 1;
            rtr_change_socket_state(rtr_socket, RTR_FAST_RECONNECT);
            return RTR_ERROR;
        }
    }
    if (rtval == TR_WOULDBLOCK) {
        rtr_change_socket_state(rtr_socket, RTR_ERROR_TRANSPORT);
        return RTR_ERROR;
    } else if (rtval < 0)
        return RTR_ERROR;

    enum pdu_type type = rtr_get_pdu_type(pdu);
    //ignore serial_notify PDUs, we already sent a serial_query, must be old messages
    while (type == SERIAL_NOTIFY) {
        RTR_DBG1("Ignoring Serial Notify");
        rtval = rtr_receive_pdu(rtr_socket, pdu, RTR_MAX_PDU_LEN, RTR_RECV_TIMEOUT);
        if (rtval == TR_WOULDBLOCK) {
            rtr_change_socket_state(rtr_socket, RTR_ERROR_TRANSPORT);
            return RTR_ERROR;
        } else if (rtval < 0)
            return RTR_ERROR;
        type = rtr_get_pdu_type(pdu);
    }

    if (type == ERROR) {
        rtr_handle_error_pdu(rtr_socket, pdu);
        return RTR_ERROR;
    } else if (type == CACHE_RESET) {
        RTR_DBG1("Cache Reset PDU received");
        rtr_change_socket_state(rtr_socket, RTR_ERROR_NO_INCR_UPDATE_AVAIL);
        return RTR_ERROR;
    } else if (type == CACHE_RESPONSE) {
        rtr_handle_cache_response_pdu(rtr_socket,pdu);
    } else if (type == ERROR) {
        rtr_handle_error_pdu(rtr_socket, pdu);
        return RTR_ERROR;
    } else {
        RTR_DBG("Expected Cache Response PDU but received PDU Type (Type: %u)", ((struct pdu_header *) pdu)->type);
        const char txt[] = "Unexpected PDU received in data synchronisation";
        rtr_send_error_pdu(rtr_socket, pdu, sizeof(struct pdu_header), CORRUPT_DATA, txt, sizeof(txt));
        return RTR_ERROR;
    }

    //Receive all PDUs until EOD PDU
    if(rtr_sync_receive_and_store_pdus(rtr_socket) == RTR_ERROR){
        return RTR_ERROR;
    }

    rtr_socket->request_session_id = false;
    if (rtr_set_last_update(rtr_socket) == RTR_ERROR)
        return RTR_ERROR;
    return RTR_SUCCESS;
}