/** * Select proper RX layer for semi-reliable UDP traffic. * * Source address is checked for hostile hosts in order to enforce a * total blackout. * * @param utp UDP traffic type * @param from source address * @param len length of message, for logging only * * @return the RX layer if found, NULL if none or the address is hostile. */ static rxdrv_t * udp_get_rx_semi_reliable(enum udp_traffic utp, host_addr_t from, size_t len) { unsigned i = 0; if (hostiles_is_bad(from)) { if (GNET_PROPERTY(udp_debug)) { hostiles_flags_t flags = hostiles_check(from); g_warning("UDP got %s (%zu bytes) from hostile %s (%s) -- dropped", udp_traffic_to_string(utp), len, host_addr_to_string(from), hostiles_flags_to_string(flags)); } gnet_stats_inc_general(GNR_UDP_SR_RX_FROM_HOSTILE_IP); return NULL; /* Ignore message */ } switch (host_addr_net(from)) { case NET_TYPE_IPV4: i = 0; break; case NET_TYPE_IPV6: i = 1; break; case NET_TYPE_LOCAL: case NET_TYPE_NONE: g_assert_not_reached(); } return SEMI_RELIABLE_GTA == utp ? rx_sr_gta[i] : SEMI_RELIABLE_GND == utp ? rx_sr_gnd[i] : NULL; }
/** * @return whether host's address is a valid DHT value creator. */ bool knode_addr_is_usable(const knode_t *kn) { knode_check(kn); if (!host_address_is_usable(kn->addr)) return FALSE; if (hostiles_is_bad(kn->addr)) return FALSE; return TRUE; }
/** * @return whether host can be kept as a valid contact */ bool knode_is_usable(const knode_t *kn) { knode_check(kn); if (!host_is_valid(kn->addr, kn->port)) return FALSE; if (hostiles_is_bad(kn->addr)) return FALSE; return TRUE; }
/** * Tree message iterator to handle "CH" nodes and extract their IP:port. */ static void g2_node_extract_ch(void *data, void *udata) { const g2_tree_t *t = data; (void) udata; if (0 == strcmp("CH", g2_tree_name(t))) { const char *payload; size_t paylen; payload = g2_tree_node_payload(t, &paylen); if (10 == paylen) { /* IPv4:port + 32-bit timestamp */ host_addr_t addr = host_addr_peek_ipv4(payload); uint16 port = peek_le16(&payload[4]); if (host_is_valid(addr, port) && !hostiles_is_bad(addr)) guess_add_hub(addr, port); } } }