From 2afc4893bf802700a1decfff57673cefc861c7e7 Mon Sep 17 00:00:00 2001 From: Dirk Engling Date: Wed, 3 Apr 2024 22:25:30 +0200 Subject: Prepare opentracker for dual stack capabilities --- trackerlogic.h | 54 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 22 deletions(-) (limited to 'trackerlogic.h') diff --git a/trackerlogic.h b/trackerlogic.h index f43b4f1..24ef097 100644 --- a/trackerlogic.h +++ b/trackerlogic.h @@ -24,16 +24,12 @@ typedef time_t ot_time; typedef char ot_ip6[16]; typedef struct { ot_ip6 address; int bits; } ot_net; -#ifdef WANT_V6 -#define OT_IP_SIZE 16 -#define PEERS_BENCODED "6:peers6" /* List of peers should fit in a single UDP packet (around 1200 bytes) */ -#define OT_MAX_PEERS_UDP 66 -#else -#define OT_IP_SIZE 4 -#define PEERS_BENCODED "5:peers" -#define OT_MAX_PEERS_UDP 200 -#endif +#define OT_MAX_PEERS_UDP6 66 +#define OT_MAX_PEERS_UDP4 200 + +#define OT_IP_SIZE6 16 +#define OT_IP_SIZE4 4 #define OT_PORT_SIZE 2 #define OT_FLAG_SIZE 1 #define OT_TIME_SIZE 1 @@ -61,6 +57,7 @@ typedef struct { ot_ip6 address; int bits; } #define OT_ADMINIP_MAX 64 #define OT_MAX_THREADS 64 +/* Number of minutes after announce before peer is removed */ #define OT_PEER_TIMEOUT 45 /* We maintain a list of 1024 pointers to sorted list of ot_torrent structs @@ -78,23 +75,35 @@ extern volatile int g_opentracker_running; extern uint32_t g_tracker_id; typedef enum { FLAG_TCP, FLAG_UDP, FLAG_MCA, FLAG_SELFPIPE } PROTO_FLAG; -#define OT_PEER_COMPARE_SIZE ((OT_IP_SIZE)+(OT_PORT_SIZE)) -#define OT_PEER_SIZE ((OT_TIME_SIZE)+(OT_FLAG_SIZE)+(OT_PEER_COMPARE_SIZE)) -typedef uint8_t ot_peer[OT_PEER_SIZE]; +#define OT_PEER_COMPARE_SIZE6 ((OT_IP_SIZE6)+(OT_PORT_SIZE)) +#define OT_PEER_COMPARE_SIZE4 ((OT_IP_SIZE4)+(OT_PORT_SIZE)) +#define OT_PEER_COMPARE_SIZE_FROM_PEER_SIZE(PEER_SIZE) ((PEER_SIZE)-(OT_TIME_SIZE)-(OT_FLAG_SIZE)) + +#define OT_PEER_SIZE6 ((OT_TIME_SIZE)+(OT_FLAG_SIZE)+(OT_PEER_COMPARE_SIZE6)) +#define OT_PEER_SIZE4 ((OT_TIME_SIZE)+(OT_FLAG_SIZE)+(OT_PEER_COMPARE_SIZE4)) + +typedef uint8_t ot_peer[1]; +typedef uint8_t ot_peer6[OT_PEER_SIZE6]; +typedef uint8_t ot_peer4[OT_PEER_SIZE4]; static const uint8_t PEER_FLAG_SEEDING = 0x80; static const uint8_t PEER_FLAG_COMPLETED = 0x40; static const uint8_t PEER_FLAG_STOPPED = 0x20; static const uint8_t PEER_FLAG_FROM_SYNC = 0x10; static const uint8_t PEER_FLAG_LEECHING = 0x00; -#ifdef WANT_V6 -#define OT_SETIP(peer,ip) memcpy((peer),(ip),(OT_IP_SIZE)) -#else -#define OT_SETIP(peer,ip) memcpy((peer),(((uint8_t*)ip)+12),(OT_IP_SIZE)) -#endif -#define OT_SETPORT(peer,port) memcpy(((uint8_t*)(peer))+(OT_IP_SIZE),(port),2) -#define OT_PEERFLAG(peer) (((uint8_t*)(peer))[(OT_IP_SIZE)+2]) -#define OT_PEERTIME(peer) (((uint8_t*)(peer))[(OT_IP_SIZE)+3]) +/* Takes an ot_peer6 and returns the proper pointer to the peer and sets peer_size */ +ot_peer *peer_from_peer6(ot_peer6 *peer, size_t *peer_size); +size_t peer_size_from_peer6(ot_peer6 *peer); + +/* New style */ +#define OT_SETIP(peer,ip) memcpy((peer),(ip),OT_IP_SIZE6) +#define OT_SETPORT(peer,port) memcpy(((uint8_t*)(peer))+(OT_IP_SIZE6),(port),2) +#define OT_PEERFLAG(peer) (((uint8_t*)(peer))[(OT_IP_SIZE6)+2]) +#define OT_PEERFLAG_D(peer,peersize) (((uint8_t*)(peer))[(peersize)-2]) +#define OT_PEERTIME(peer,peersize) (((uint8_t*)(peer))[(peersize)-1]) + +#define PEERS_BENCODED6 "6:peers6" +#define PEERS_BENCODED4 "5:peers" #define OT_HASH_COMPARE_SIZE (sizeof(ot_hash)) @@ -102,7 +111,8 @@ struct ot_peerlist; typedef struct ot_peerlist ot_peerlist; typedef struct { ot_hash hash; - ot_peerlist *peer_list; + ot_peerlist *peer_list6; + ot_peerlist *peer_list4; } ot_torrent; #include "ot_vector.h" @@ -131,7 +141,7 @@ struct ot_workstruct { #endif /* The peer currently in the working */ - ot_peer peer; + ot_peer6 peer; /* Can fit v6 and v4 peers */ /* Pointers into the request buffer */ ot_hash *hash; -- cgit v1.2.3