From 0fd0bc59d0258a896909e0d35414f08f02236058 Mon Sep 17 00:00:00 2001 From: lion Date: Tue, 16 Sep 2025 22:09:49 +0800 Subject: [PATCH] bytes ip utils prototype --- binding/c/test_util | Bin 17464 -> 17720 bytes binding/c/xdb_api.h | 37 +++++++++++++++++++++---- binding/c/xdb_util.c | 64 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 93 insertions(+), 8 deletions(-) diff --git a/binding/c/test_util b/binding/c/test_util index bc93a2910b3357dd564b6ab16aae3237f1bad92a..6f2c779ba84e35826c806baeca3fb8422218ff3b 100755 GIT binary patch delta 5271 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 delta 4143 zcmZ`+3s6+o8NTq%I=mzLux7GNN* zYhphip`RRa?dd(=`|jz)x27$CZP7oZE#c$|kCtVQAt-LlWx?`-aPysb@W-q_au z^y9S2=8u~joJXCuTzb#8Y^x|p`k#fPAzLAd0(-M23Kn4xkS9#&@U|k)R^c_yrMI>w z39#ws@}b^WF#9;+AeW!ew@v@h1vQCfRr*%=1T_&g9DQ>1PdRy$yB#Ys!zqio_u>D|-OdG1*)C+bL?AyrDOpq6jK^Z+Nq2x1V20iD{XVwUB0}JuuS>PIzW^y|TUR(>drW(F+|; zrMv7i2fzheC6`Ez zx9N!N%dbWS8DTEnHp2MfuS9>ZE@i2Xo>ihBs*m0#P0pQrdrH%q@8yM+LB*=@sUs{l zo6}0Q6*1VbwMQ+2T~L?ard6I9((n{L>+woEr|1<=ZhjNao-txV%!q66jo3a#XFa*n z^eKw-2C8;oU>0@@+spxc1lz?UBUrNInypOl%^fg*hv_EIs{FARg@ zFxVeY*L_7_&HOz*!r;6COIs zF1c?<&neMM710s37M``y&zQA{?v9~nUPqO)UoI9;ef=i&PM;t64-TpBh@*Gurlwt7 zfz+wn&|{^-PWCk$U7DWlfnRlZ#FFy9B6Ua7>$~(P5~;K>g_io#yI!69ZG3wm4j8F6p4ZMU=4| zy?O9vg@S;r4g5T(Rop60k1J(Anm#-wUuc>O1?{<_X(hk{U>$H0Sd9yN%a@uq3A>hY zO=|%^2<&2d;HyB-RZV*bI077E@-p084;&WLE)Z0!OcDYc&NO&vi}f0G0rE z0tbOZz)9d`roW+S_z@EZff3*&unk!773_iPgr|d75Qp`LpSalKf*d)C%j@@2!Vz@ahOZRaFu#12TfYWc{#mTN0 zr5Z}i^V-_L?;NLDd3ipT^w(gLVMG_^0oexhkJF~ShivE39XBjp$f5k zF}3Z|_Y;!s%MjPfrH zoYHn?Y>tRz>himEF8GAhQbq@)Y19~MrB@vxvKI}CyXjbw>>lEuyv9I+P);X{KL(=9PdLbN?lzciE4vH;w4j$%rtQqjS?%{!l`=NZV57SF! z1;w||TuVOXJS2Ooxpr)t;cf2mS~>vjMx?{fau+dU8~8)!EB;h}?gGr*&{ zV#Yeoc*!l8yJ1HA1GkUxUD9g;%5yAQ_-n2mN_R7QHc7-cZc7 z`_m0tKVIloalVe%Ne%Z}#(6)_z|)-H0N(XK*8U_L#oNif1U`y+uz$w1);?(c*#0!} zJvuf|uK9plkMXh1YWy>JH`XHfjX`n!={^cd_G-HiWuh?HqWw9vw_`n=@Oz`=z}L~@pv)4I~{ z3>+)HDbkQ+8yGBW6vYwpmWSMZR%03_Ces?Q@A4bN#5~$t9!fCpkx?6+Dqr9z;3uzqDSC4rGmC%~VR{I!VBy~n)x*2ghP(DT@cSW(s#U&F@m`Y~;qY8Jbx$P!qIA~u* zFu^>RlRi3Cu|&Eck*_l7Ht!V^Pt%&pQ0mBoMo<&G;%HxGkd!JHjaC*p%>Vrw$z4_K wxc86uimKwfmuy4G2+>b_t2C+KM*FH4IMf9O*-oES7bmPPH6))%|0v7)FM$3E+5i9m diff --git a/binding/c/xdb_api.h b/binding/c/xdb_api.h index 21e28d3..af846cc 100644 --- a/binding/c/xdb_api.h +++ b/binding/c/xdb_api.h @@ -34,9 +34,19 @@ #define xdb_vector_index_size 8 #define xdb_segment_index_size 14 +// --- ip version info +#define xdb_ipv4_version_no 4 +#define xdb_ipv6_version_no 6 +#define XDB_IPV4 4 +#define XDB_IPv6 6 + // cache of vector_index_row × vector_index_rows × vector_index_size #define xdb_vector_index_length 524288 +// types type define +typedef char string_ip_t; +typedef unsigned char bytes_ip_t; + // --- xdb util functions // get the current time in microseconds @@ -55,15 +65,32 @@ XDB_PUBLIC(int) xdb_check_ip(const char *, unsigned int *); XDB_PUBLIC(void) xdb_long2ip(unsigned int, char *); -// parse the specified IP address to byte array -XDB_PUBLIC(int) xdb_parse_ip(const char *, const char *, size_t); +// parse the specified IP address to byte array. +// returns: 4 for valid ipv4, 16 for valid ipv6, or -1 for failed +XDB_PUBLIC(int) xdb_parse_ip(const string_ip_t *, bytes_ip_t *, size_t); -// convert a specified ip bytes to humen-readable string -XDB_PUBLIC(int) xdb_ip_to_string(const char *, size_t); +// parse the specified IPv4 address to byte array +// returns: 4 for valid ipv4, or -1 for failed +XDB_PUBLIC(int) xdb_parse_v4_ip(const string_ip_t *, bytes_ip_t *, size_t); + +// parse the specified IPv6 address to byte array +// returns: 16 for valid ipv6, or -1 for failed +XDB_PUBLIC(int) xdb_parse_v6_ip(const string_ip_t *, bytes_ip_t *, size_t); + +// convert a specified ip bytes to humen-readable string. +// returns: 0 for success or -1 for failed. +XDB_PUBLIC(int) xdb_ip_to_string(const bytes_ip_t *, size_t, char *, size_t); + +// ipv4 bytes to string +XDB_PUBLIC(int) xdb_v4_ip_to_string(const bytes_ip_t *, char *, size_t); + +// ipv6 bytes to string +XDB_PUBLIC(int) xdb_v6_ip_to_string(const bytes_ip_t *, char *, size_t); // compare the specified ip bytes with another ip bytes in the specified buff from offset. +// ip args must be the return value from #xdb_parse_ip. // returns: -1 if ip1 < ip2, 1 if ip1 > ip2 or 0 -XDB_PUBLIC(int) xdb_ip_sub_compare(const char *, const char *, int, size_t); +XDB_PUBLIC(int) xdb_ip_sub_compare(const bytes_ip_t *, size_t, const char *, int); // --- END xdb utils diff --git a/binding/c/xdb_util.c b/binding/c/xdb_util.c index 2c0f034..812f7b4 100644 --- a/binding/c/xdb_util.c +++ b/binding/c/xdb_util.c @@ -96,15 +96,73 @@ XDB_PUBLIC(void) xdb_long2ip(unsigned int ip, char *buffer) { sprintf(buffer, "%d.%d.%d.%d", (ip >> 24) & 0xFF, (ip >> 16) & 0xFF, (ip >> 8) & 0xFF, ip & 0xFF); } -XDB_PUBLIC(int) xdb_parse_ip(const char *ip, const char *buffer, size_t length) { +XDB_PUBLIC(int) xdb_parse_ip(const string_ip_t *ip, bytes_ip_t *buffer, size_t length) { + // where there is a . there is a IPV4 even though there are IPv6 wrapped IPv4 like + // ::ffff:192.168.1.100, lets just keep it in this way. + if (strchr(ip, '.') != NULL) { + return xdb_parse_v4_ip(ip, buffer, length); + } else if (strchr(ip, ':') != NULL) { + return xdb_parse_v6_ip(ip, buffer, length); + } + + return -1; +} + +XDB_PUBLIC(int) xdb_parse_v4_ip(const string_ip_t *ip, bytes_ip_t *buffer, size_t length) { return 0; } -XDB_PUBLIC(int) xdb_ip_to_string(const char *bytes, size_t length) { +XDB_PUBLIC(int) xdb_parse_v6_ip(const string_ip_t *ip, bytes_ip_t *buffer, size_t length) { return 0; } -XDB_PUBLIC(int) xdb_ip_sub_compare(const char *ip1, const char *buffer, int offset, size_t length) { +XDB_PUBLIC(int) xdb_ip_to_string(const bytes_ip_t *ip, size_t bytes, char *buffer, size_t length) { + if (bytes == 4) { + return xdb_v4_ip_to_string(ip, buffer, length); + } else if (bytes == 16) { + return xdb_v6_ip_to_string(ip, buffer, length); + } + + return -1; +} + +XDB_PUBLIC(int) xdb_v4_ip_to_string(const bytes_ip_t *ip, char *buffer, size_t length) { + snprintf( + buffer, length, + "%d.%d.%d.%d", + ip[0], ip[1], ip[2], ip[3] + ); + return 0; +} + +XDB_PUBLIC(int) xdb_v6_ip_to_string(const bytes_ip_t *ip, char *buffer, size_t length) { + // temp solution for testing ONLY, we will handle the :: later + snprintf( + buffer, length, + "%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x", + ip[0], ip[1], + ip[2], ip[3], + ip[4], ip[5], + ip[6], ip[7], + ip[8], ip[9], + ip[10], ip[11], + ip[12], ip[13], + ip[14], ip[15] + ); + return 0; +} + +XDB_PUBLIC(int) xdb_ip_sub_compare(const bytes_ip_t *ip1, size_t length, const char *buffer, int offset) { + int i, i1, i2; + for (i = 0; i < length; i++) { + i1 = ip1[i] & 0xFF; + i2 = buffer[offset + i] & 0xFF; + if (i1 > i2) { + return 1; + } else if (i1 < i2) { + return -1; + } + } return 0; }