lsquic_version.c revision 10c492f0
110c492f0SDmitri Tikhonov/* Copyright (c) 2017 - 2018 LiteSpeed Technologies Inc. See LICENSE. */ 250aadb33SDmitri Tikhonov#include <string.h> 350aadb33SDmitri Tikhonov 450aadb33SDmitri Tikhonov#include "lsquic.h" 550aadb33SDmitri Tikhonov#include "lsquic_int_types.h" 650aadb33SDmitri Tikhonov#include "lsquic_version.h" 750aadb33SDmitri Tikhonov 850aadb33SDmitri Tikhonov 950aadb33SDmitri Tikhonovstatic const unsigned char version_tags[N_LSQVER][4] = 1050aadb33SDmitri Tikhonov{ 1150aadb33SDmitri Tikhonov [LSQVER_035] = { 'Q', '0', '3', '5', }, 1250aadb33SDmitri Tikhonov [LSQVER_037] = { 'Q', '0', '3', '7', }, 1350aadb33SDmitri Tikhonov [LSQVER_038] = { 'Q', '0', '3', '8', }, 1450aadb33SDmitri Tikhonov [LSQVER_039] = { 'Q', '0', '3', '9', }, 151b97e4afSDmitri Tikhonov [LSQVER_041] = { 'Q', '0', '4', '1', }, 1650aadb33SDmitri Tikhonov}; 1750aadb33SDmitri Tikhonov 1850aadb33SDmitri Tikhonov 1950aadb33SDmitri Tikhonovuint32_t 2050aadb33SDmitri Tikhonovlsquic_ver2tag (unsigned version) 2150aadb33SDmitri Tikhonov{ 2250aadb33SDmitri Tikhonov lsquic_ver_tag_t tag; 2350aadb33SDmitri Tikhonov if (version < N_LSQVER) 2450aadb33SDmitri Tikhonov { 2550aadb33SDmitri Tikhonov memcpy(&tag, version_tags[version], 4); 2650aadb33SDmitri Tikhonov return tag; 2750aadb33SDmitri Tikhonov } 2850aadb33SDmitri Tikhonov else 2950aadb33SDmitri Tikhonov return 0; 3050aadb33SDmitri Tikhonov} 3150aadb33SDmitri Tikhonov 3250aadb33SDmitri Tikhonov 3350aadb33SDmitri Tikhonovenum lsquic_version 3450aadb33SDmitri Tikhonovlsquic_tag2ver (uint32_t ver_tag) 3550aadb33SDmitri Tikhonov{ 3650aadb33SDmitri Tikhonov unsigned n; 3750aadb33SDmitri Tikhonov for (n = 0; n < sizeof(version_tags) / sizeof(version_tags[0]); ++n) 3850aadb33SDmitri Tikhonov if (0 == memcmp(version_tags[n], &ver_tag, sizeof(ver_tag))) 3950aadb33SDmitri Tikhonov return n; 4050aadb33SDmitri Tikhonov return -1; 4150aadb33SDmitri Tikhonov} 4250aadb33SDmitri Tikhonov 4350aadb33SDmitri Tikhonov 4450aadb33SDmitri Tikhonovenum lsquic_version 4550aadb33SDmitri Tikhonovlsquic_str2ver (const char *str, size_t len) 4650aadb33SDmitri Tikhonov{ 4750aadb33SDmitri Tikhonov uint32_t tag; 4850aadb33SDmitri Tikhonov 4950aadb33SDmitri Tikhonov if (len == sizeof(tag) && 'Q' == str[0]) 5050aadb33SDmitri Tikhonov { 5150aadb33SDmitri Tikhonov memcpy(&tag, str, sizeof(tag)); 5250aadb33SDmitri Tikhonov return lsquic_tag2ver(tag); 5350aadb33SDmitri Tikhonov } 5450aadb33SDmitri Tikhonov else 5550aadb33SDmitri Tikhonov return -1; 5650aadb33SDmitri Tikhonov} 5750aadb33SDmitri Tikhonov 5850aadb33SDmitri Tikhonov 5950aadb33SDmitri Tikhonovconst char *const lsquic_ver2str[N_LSQVER] = { 6050aadb33SDmitri Tikhonov [LSQVER_035] = "Q035", 6150aadb33SDmitri Tikhonov [LSQVER_037] = "Q037", 6250aadb33SDmitri Tikhonov [LSQVER_038] = "Q038", 6350aadb33SDmitri Tikhonov [LSQVER_039] = "Q039", 641b97e4afSDmitri Tikhonov [LSQVER_041] = "Q041", 6550aadb33SDmitri Tikhonov}; 6650aadb33SDmitri Tikhonov 6750aadb33SDmitri Tikhonov 6850aadb33SDmitri Tikhonovint 6950aadb33SDmitri Tikhonovgen_ver_tags (unsigned char *buf, size_t bufsz, unsigned version_bitmask) 7050aadb33SDmitri Tikhonov{ 7150aadb33SDmitri Tikhonov unsigned n; 7250aadb33SDmitri Tikhonov lsquic_ver_tag_t tag; 7350aadb33SDmitri Tikhonov unsigned char *p = buf; 7450aadb33SDmitri Tikhonov unsigned char *const pend = p + bufsz; 7550aadb33SDmitri Tikhonov for (n = 0; version_bitmask; ++n) 7650aadb33SDmitri Tikhonov { 7750aadb33SDmitri Tikhonov if (version_bitmask & (1 << n)) 7850aadb33SDmitri Tikhonov { 7950aadb33SDmitri Tikhonov if (p + 4 > pend) 8050aadb33SDmitri Tikhonov return -1; 8150aadb33SDmitri Tikhonov version_bitmask &= ~(1 << n); 8250aadb33SDmitri Tikhonov tag = lsquic_ver2tag(n); 8350aadb33SDmitri Tikhonov if (0 == tag) 8450aadb33SDmitri Tikhonov return -1; 8550aadb33SDmitri Tikhonov memcpy(p, &tag, 4); 8650aadb33SDmitri Tikhonov p += 4; 8750aadb33SDmitri Tikhonov } 8850aadb33SDmitri Tikhonov } 8950aadb33SDmitri Tikhonov return p - buf; 9050aadb33SDmitri Tikhonov} 91