LCOV - code coverage report
Current view: top level - feature/nodelist - routerinfo.c (source / functions) Hit Total Coverage
Test: lcov.info Lines: 10 44 22.7 %
Date: 2021-11-24 03:28:48 Functions: 3 6 50.0 %

          Line data    Source code
       1             : /* Copyright (c) 2001 Matej Pfajfar.
       2             :  * Copyright (c) 2001-2004, Roger Dingledine.
       3             :  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
       4             :  * Copyright (c) 2007-2021, The Tor Project, Inc. */
       5             : /* See LICENSE for licensing information */
       6             : 
       7             : /**
       8             :  * @file routerinfo.c
       9             :  * @brief Manipulate full router descriptors.
      10             :  **/
      11             : 
      12             : #include "core/or/or.h"
      13             : 
      14             : #include "feature/nodelist/nodelist.h"
      15             : #include "feature/nodelist/routerinfo.h"
      16             : #include "feature/nodelist/torcert.h"
      17             : 
      18             : #include "feature/nodelist/node_st.h"
      19             : #include "feature/nodelist/routerinfo_st.h"
      20             : 
      21             : /** Copy the OR port (IP address and TCP port) for <b>router</b> and
      22             :  * <b>family</b> into *<b>ap_out</b>.
      23             :  *
      24             :  * If the requested ORPort does not exist, sets *<b>ap_out</b> to the null
      25             :  * address and port, and returns -1. Otherwise, returns 0. */
      26             : int
      27           0 : router_get_orport(const routerinfo_t *router,
      28             :                   tor_addr_port_t *ap_out,
      29             :                   int family)
      30             : {
      31           0 :   tor_assert(ap_out != NULL);
      32           0 :   if (family == AF_INET) {
      33           0 :     tor_addr_copy(&ap_out->addr, &router->ipv4_addr);
      34           0 :     ap_out->port = router->ipv4_orport;
      35           0 :     return 0;
      36           0 :   } else if (family == AF_INET6) {
      37             :     /* IPv6 addresses are optional, so check if it is valid. */
      38           0 :     if (tor_addr_port_is_valid(&router->ipv6_addr, router->ipv6_orport, 0)) {
      39           0 :       tor_addr_copy(&ap_out->addr, &router->ipv6_addr);
      40           0 :       ap_out->port = router->ipv6_orport;
      41           0 :       return 0;
      42             :     } else {
      43           0 :       tor_addr_port_make_null_ap(ap_out, AF_INET6);
      44           0 :       return -1;
      45             :     }
      46             :   } else {
      47             :     /* Unsupported address family */
      48           0 :     tor_assert_nonfatal_unreached();
      49           0 :     tor_addr_port_make_null_ap(ap_out, AF_UNSPEC);
      50           0 :     return -1;
      51             :   }
      52             : }
      53             : 
      54             : int
      55           0 : router_has_orport(const routerinfo_t *router, const tor_addr_port_t *orport)
      56             : {
      57           0 :   return
      58           0 :     (tor_addr_eq(&orport->addr, &router->ipv4_addr) &&
      59           0 :      orport->port == router->ipv4_orport) ||
      60           0 :     (tor_addr_eq(&orport->addr, &router->ipv6_addr) &&
      61           0 :      orport->port == router->ipv6_orport);
      62             : }
      63             : 
      64             : /** Return a smartlist of tor_addr_port_t's with all the OR ports of
      65             :     <b>ri</b>. Note that freeing of the items in the list as well as
      66             :     the smartlist itself is the callers responsibility. */
      67             : smartlist_t *
      68           0 : router_get_all_orports(const routerinfo_t *ri)
      69             : {
      70           0 :   tor_assert(ri);
      71           0 :   node_t fake_node;
      72           0 :   memset(&fake_node, 0, sizeof(fake_node));
      73             :   /* we don't modify ri, fake_node is passed as a const node_t *
      74             :    */
      75           0 :   fake_node.ri = (routerinfo_t *)ri;
      76           0 :   return node_get_all_orports(&fake_node);
      77             : }
      78             : 
      79             : /** Return the Ed25519 identity key for this routerinfo, or NULL if it
      80             :  * doesn't have one. */
      81             : const ed25519_public_key_t *
      82          37 : routerinfo_get_ed25519_id(const routerinfo_t *ri)
      83             : {
      84          37 :   if (BUG(! ri))
      85           0 :     return NULL;
      86             : 
      87          37 :   const tor_cert_t *cert = ri->cache_info.signing_key_cert;
      88          37 :   if (cert && ! ed25519_public_key_is_zero(&cert->signing_key))
      89             :     return &cert->signing_key;
      90             :   else
      91           9 :     return NULL;
      92             : }
      93             : 
      94             : /** Given a router purpose, convert it to a string.  Don't call this on
      95             :  * ROUTER_PURPOSE_UNKNOWN: The whole point of that value is that we don't
      96             :  * know its string representation. */
      97             : const char *
      98          28 : router_purpose_to_string(uint8_t p)
      99             : {
     100          28 :   switch (p)
     101             :     {
     102             :     case ROUTER_PURPOSE_GENERAL: return "general";
     103           0 :     case ROUTER_PURPOSE_BRIDGE: return "bridge";
     104           0 :     case ROUTER_PURPOSE_CONTROLLER: return "controller";
     105             :     default:
     106           0 :       tor_assert(0);
     107             :     }
     108             :   return NULL;
     109             : }
     110             : 
     111             : /** Given a string, convert it to a router purpose. */
     112             : uint8_t
     113           2 : router_purpose_from_string(const char *s)
     114             : {
     115           2 :   if (!strcmp(s, "general"))
     116             :     return ROUTER_PURPOSE_GENERAL;
     117           2 :   else if (!strcmp(s, "bridge"))
     118             :     return ROUTER_PURPOSE_BRIDGE;
     119           0 :   else if (!strcmp(s, "controller"))
     120             :     return ROUTER_PURPOSE_CONTROLLER;
     121             :   else
     122           0 :     return ROUTER_PURPOSE_UNKNOWN;
     123             : }

Generated by: LCOV version 1.14