Navigation


Changeset 1122:d4371b7aa0ff in freeDiameter


Ignore:
Timestamp:
May 14, 2013, 7:01:31 PM (11 years ago)
Author:
Sebastien Decugis <sdecugis@freediameter.net>
Branch:
default
Phase:
public
Message:

New CMake option: ADDRESS_AVP_INCLUDE_PORT. Turn off for standard Host-IP-Address AVPs

Files:
10 edited

Legend:

Unmodified
Added
Removed
  • include/freeDiameter/CMakeLists.txt

    r935 r1122  
    3333# compliancy of their implementation with the Diameter RFC...
    3434OPTION(WORKAROUND_ACCEPT_INVALID_VSAI "Do not reject a CER/CEA with a Vendor-Specific-Application-Id AVP containing both Auth- and Acct- application AVPs?" OFF)
     35
     36# If the following is defined, the Address-based AVPs issued locally are extended to include the port information.
     37OPTION(ADDRESS_AVP_INCLUDE_PORT "Include the port number in the Address-based AVPs?" ON)
    3538
    3639MARK_AS_ADVANCED(DISABLE_SCTP DEBUG_SCTP SCTP_USE_MAPPED_ADDRESSES ERRORS_ON_TODO DIAMID_IDNA_IGNORE DIAMID_IDNA_REJECT DISABLE_PEER_EXPIRY WORKAROUND_ACCEPT_INVALID_VSAI)
  • include/freeDiameter/freeDiameter-host.h.in

    r1098 r1122  
    6161#cmakedefine DISABLE_PEER_EXPIRY
    6262#cmakedefine WORKAROUND_ACCEPT_INVALID_VSAI
     63#cmakedefine ADDRESS_AVP_INCLUDE_PORT
    6364#cmakedefine GNUTLS_VERSION_210
    6465#cmakedefine GNUTLS_VERSION_300
  • include/freeDiameter/libfdcore.h

    r1120 r1122  
    137137        uint16_t         cnf_port_tls;  /* the local port for Diameter/TLS (default: 3869) in host byte order */
    138138        uint16_t         cnf_sctp_str;  /* default max number of streams for SCTP associations (def: 30) */
    139         struct fd_list   cnf_endpoints; /* the local endpoints to bind the server to. list of struct fd_endpoint. default is empty (bind all) */
     139        struct fd_list   cnf_endpoints; /* the local endpoints to bind the server to. list of struct fd_endpoint. default is empty (bind all). After servers are started, this is the actual list of endpoints including port information. */
    140140        struct fd_list   cnf_apps;      /* Applications locally supported (except relay, see flags). Use fd_disp_app_support to add one. list of struct fd_app. */
    141141        uint16_t         cnf_dispthr;   /* Number of dispatch threads to create */
  • include/freeDiameter/libfdproto.h

    r1120 r1122  
    610610                                ((((sSA *)_sa_)->sa_family == AF_INET6) ? (sizeof(sSA6)) :      \
    611611                                        0 ) ) )
    612 
    613 DECLARE_FD_DUMP_PROTOTYPE(fd_sa_dump_node, sSA * sa, int flags);
    614 DECLARE_FD_DUMP_PROTOTYPE(fd_sa_dump_node_serv, sSA * sa, int flags);
     612#define sSAport( _sa_ ) \
     613        ( (socklen_t) ( (((sSA *)_sa_)->sa_family == AF_INET) ? (((sSA4 *)(_sa_))->sin_port) :          \
     614                                ((((sSA *)_sa_)->sa_family == AF_INET6) ? (((sSA6 *)(_sa_))->sin6_port) :       \
     615                                        0 ) ) )
     616
     617DECLARE_FD_DUMP_PROTOTYPE(fd_sa_dump, sSA * sa, int flags);
    615618#define sSA_DUMP_STRLEN (INET6_ADDRSTRLEN + 1 + 32 + 2)
    616619void fd_sa_sdump_numeric(char * buf /* must be at least sSA_DUMP_STRLEN */, sSA * sa);
  • libfdcore/endpoints.c

    r1119 r1122  
    9494                        return 0;
    9595        }
    96 
     96       
    9797        /* remove the ACCEPTALL flag */
    9898        flags &= ~EP_ACCEPTALL;
     
    135135                        break;
    136136                }
    137                 if (*ep_port < *port)
    138                         continue;
     137                if (*ep_port < *port) {
     138                        cmp = -1;
     139                        continue;
     140                }
    139141                if (*ep_port > *port)
    140142                        cmp = 1;
     
    217219        while ((li_out != list) && (li_ex != exclude_list)) {
    218220                int cmp;
    219 
     221                in_port_t * port_out, *port_ex;
     222               
    220223                out = (struct fd_endpoint *)li_out;
    221224                ex = (struct fd_endpoint *)li_ex;
     
    235238                        case AF_INET:
    236239                                cmp = memcmp(&out->sin.sin_addr, &ex->sin.sin_addr, sizeof(struct in_addr));
     240                                port_out = &out->sin.sin_port;
     241                                port_ex = &ex->sin.sin_port;
    237242                                break;
    238243                        case AF_INET6:
    239244                                cmp = memcmp(&out->sin6.sin6_addr, &ex->sin6.sin6_addr, sizeof(struct in6_addr));
     245                                port_out = &out->sin6.sin6_port;
     246                                port_ex = &ex->sin6.sin6_port;
    240247                                break;
    241248                        default:
     
    250257                        li_ex = li_ex->next;
    251258                        continue;
     259                }
     260               
     261                if (port_out && (*port_out != 0) && (*port_ex != 0)) {
     262                        if (*port_out < *port_ex) {
     263                                li_out = li_out->next;
     264                                continue;
     265                        }
     266                        if (*port_out > *port_ex) {
     267                                li_ex = li_ex->next;
     268                                continue;
     269                        }
    252270                }
    253271       
     
    298316        }
    299317       
    300         CHECK_MALLOC_DO( fd_sa_dump_node_serv( FD_DUMP_STD_PARAMS, &ep->sa, NI_NUMERICHOST | NI_NUMERICSERV ), return NULL);
     318        CHECK_MALLOC_DO( fd_sa_dump( FD_DUMP_STD_PARAMS, &ep->sa, NI_NUMERICHOST | NI_NUMERICSERV ), return NULL);
    301319        CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{%s%s%s%s%s}",
    302320                                (ep->flags & EP_FL_CONF)        ? "C" : "-",
  • libfdcore/p_ce.c

    r1119 r1122  
    110110        for (li = fd_g_config->cnf_endpoints.next; li != &fd_g_config->cnf_endpoints; li = li->next) {
    111111                struct fd_endpoint * ep = (struct fd_endpoint *)li;
    112                
    113112                CHECK_FCT( fd_msg_avp_new ( dictobj, 0, &avp ) );
    114113                CHECK_FCT( fd_msg_avp_value_encode ( &ep->ss, avp ) );
  • libfdcore/server.c

    r1113 r1122  
    342342        int empty_conf_ep = FD_IS_LIST_EMPTY(&fd_g_config->cnf_endpoints);
    343343       
     344        struct fd_list filter_list = FD_LIST_INITIALIZER(filter_list);
     345       
    344346        /* SCTP */
    345347        if (!fd_g_config->cnf_flags.no_sctp) {
     
    447449        }
    448450       
     451        /* we will filter this list and create endpoints with port information */
     452        #ifdef ADDRESS_AVP_INCLUDE_PORT
     453        fd_list_move_end(&filter_list, &fd_g_config->cnf_endpoints);
     454        while (!FD_IS_LIST_EMPTY(&filter_list)) {
     455                struct fd_endpoint * ep = (struct fd_endpoint *)filter_list.next;
     456                in_port_t * port = NULL;
     457                fd_list_unlink(&ep->chain);
     458               
     459                switch( ep->sa.sa_family ) {
     460                case AF_INET: port = &ep->sin.sin_port; break;
     461                case AF_INET6: port = &ep->sin6.sin6_port; break;
     462                }
     463               
     464                if (port) {
     465                        if (fd_g_config->cnf_port) {
     466                                *port = htons(fd_g_config->cnf_port);
     467                                CHECK_FCT(fd_ep_add_merge( &fd_g_config->cnf_endpoints, &ep->sa, sSAlen(&ep->sa), ep->flags ));
     468                        }
     469                        if (fd_g_config->cnf_port_tls) {
     470                                *port = htons(fd_g_config->cnf_port_tls);
     471                                CHECK_FCT(fd_ep_add_merge( &fd_g_config->cnf_endpoints, &ep->sa, sSAlen(&ep->sa), ep->flags ));
     472                        }
     473                }
     474                free(ep);
     475        }
     476        #endif /* ADDRESS_AVP_INCLUDE_PORT */
     477       
    449478        {
    450479                char * buf = NULL;
  • libfdcore/tcp.c

    r1085 r1122  
    138138        pthread_cleanup_push(fd_cleanup_socket, &s);
    139139       
    140         LOG_D( "Attempting TCP connection to %s...", fd_sa_dump_node(&buf, &len, NULL, sa, NI_NUMERICHOST | NI_NUMERICSERV)?:"<error>" );
     140        LOG_D( "Attempting TCP connection to %s...", fd_sa_dump(&buf, &len, NULL, sa, NI_NUMERICHOST | NI_NUMERICSERV)?:"<error>" );
    141141        free(buf);
    142142       
  • libfdproto/dictionary_functions.c

    r1093 r1122  
    7474                                AddressType = 1;/* see http://www.iana.org/assignments/address-family-numbers/ */
    7575                                size = 6;       /* 2 for AddressType + 4 for data */
     76                                #ifdef ADDRESS_AVP_INCLUDE_PORT
     77                                if (sin->sin_port != 0)
     78                                        size += 2;
     79                                #endif /* ADDRESS_AVP_INCLUDE_PORT */
    7680                               
    7781                                CHECK_MALLOC(  buf = malloc(size)  );
     
    7983                                /* may not work because of alignment: *(uint32_t *)(buf+2) = htonl(sin->sin_addr.s_addr); */
    8084                                memcpy(buf + 2, &sin->sin_addr.s_addr, 4);
     85                               
     86                                #ifdef ADDRESS_AVP_INCLUDE_PORT
     87                                if (sin->sin_port != 0)
     88                                        memcpy(buf + 6, &sin->sin_port, 2);
     89                                #endif /* ADDRESS_AVP_INCLUDE_PORT */
    8190                        }
    8291                        break;
     
    8998                                AddressType = 2;/* see http://www.iana.org/assignments/address-family-numbers/ */
    9099                                size = 18;      /* 2 for AddressType + 16 for data */
     100                                #ifdef ADDRESS_AVP_INCLUDE_PORT
     101                                if (sin6->sin6_port != 0)
     102                                        size += 2;
     103                                #endif /* ADDRESS_AVP_INCLUDE_PORT */
    91104                               
    92105                                CHECK_MALLOC(  buf = malloc(size)  );
     
    94107                                /* The order is already good here */
    95108                                memcpy(buf + 2, &sin6->sin6_addr.s6_addr, 16);
     109                               
     110                                #ifdef ADDRESS_AVP_INCLUDE_PORT
     111                                if (sin6->sin6_port != 0)
     112                                        memcpy(buf + 18, &sin6->sin6_port, 2);
     113                                #endif /* ADDRESS_AVP_INCLUDE_PORT */
    96114                        }
    97115                        break;
     
    126144                                sSA4 * sin = (sSA4 *)interpreted;
    127145                               
    128                                 CHECK_PARAMS(  avp_value->os.len == 6  );
     146                                CHECK_PARAMS(  avp_value->os.len >= 6  );
    129147                               
    130148                                sin->sin_family = AF_INET;
    131149                                /* sin->sin_addr.s_addr = ntohl( * (uint32_t *) buf); -- may not work because of bad alignment */
    132150                                memcpy(&sin->sin_addr.s_addr, buf, 4);
     151                               
     152                                if (avp_value->os.len == 8)
     153                                        memcpy(&sin->sin_port, buf + 4, 2);
    133154                        }
    134155                        break;
     
    138159                                sSA6 * sin6 = (sSA6 *)interpreted;
    139160                               
    140                                 CHECK_PARAMS(  avp_value->os.len == 18  );
     161                                CHECK_PARAMS(  avp_value->os.len >= 18  );
    141162                               
    142163                                sin6->sin6_family = AF_INET6;
    143164                                memcpy(&sin6->sin6_addr.s6_addr, buf, 16);
     165                               
     166                                if (avp_value->os.len == 20)
     167                                        memcpy(&sin6->sin6_port, buf + 16, 2);
     168                               
    144169                        }
    145170                        break;
     
    179204                        /* IP */
    180205                        s.sa.sa_family = AF_INET;
    181                         if (avp_value->os.len != 6) {
     206                        if ((avp_value->os.len != 6) && (avp_value->os.len != 8)) {
    182207                                CHECK_MALLOC_DO( fd_dump_extend(FD_DUMP_STD_PARAMS, "[invalid IP length: %zd]", avp_value->os.len), return NULL);
    183208                                return *buf;
    184209                        }
    185210                        memcpy(&s.sin.sin_addr.s_addr, avp_value->os.data + 2, 4);
     211                        if (avp_value->os.len == 8)
     212                                memcpy(&s.sin.sin_port, avp_value->os.data + 6, 2);
    186213                        break;
    187214                case 2:
    188215                        /* IP6 */
    189216                        s.sa.sa_family = AF_INET6;
    190                         if (avp_value->os.len != 18) {
     217                        if ((avp_value->os.len != 18) && (avp_value->os.len != 20)) {
    191218                                CHECK_MALLOC_DO( fd_dump_extend(FD_DUMP_STD_PARAMS, "[invalid IP6 length: %zd]", avp_value->os.len), return NULL);
    192219                                return *buf;
    193220                        }
    194221                        memcpy(&s.sin6.sin6_addr.s6_addr, avp_value->os.data + 2, 16);
     222                        if (avp_value->os.len == 20)
     223                                memcpy(&s.sin6.sin6_port, avp_value->os.data + 18, 2);
    195224                        break;
    196225                default:
     
    199228        }
    200229       
    201         return fd_sa_dump_node(FD_DUMP_STD_PARAMS, &s.sa, NI_NUMERICHOST);
     230        return fd_sa_dump(FD_DUMP_STD_PARAMS, &s.sa, NI_NUMERICHOST);
    202231}
    203232
  • libfdproto/utils.c

    r1119 r1122  
    3636#include "fdproto-internal.h"
    3737
    38 DECLARE_FD_DUMP_PROTOTYPE(fd_sa_dump_node, sSA * sa, int flags)
     38DECLARE_FD_DUMP_PROTOTYPE(fd_sa_dump, sSA * sa, int flags)
    3939{
    4040        char addrbuf[INET6_ADDRSTRLEN];
     41        char servbuf[32];
     42        int rc;
    4143        FD_DUMP_HANDLE_OFFSET();
    4244       
     45        servbuf[0] = 0;
     46       
    4347        if (sa) {
    44                 int rc = getnameinfo(sa, sSAlen( sa ), addrbuf, sizeof(addrbuf), NULL, 0, flags);
     48                if (sSAport(sa)) {
     49                        rc = getnameinfo(sa, sSAlen( sa ), addrbuf, sizeof(addrbuf), servbuf, sizeof(servbuf), flags);
     50                } else {
     51                        rc = getnameinfo(sa, sSAlen( sa ), addrbuf, sizeof(addrbuf), NULL, 0, flags);
     52                }
    4553                if (rc) {
    4654                        CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%s", gai_strerror(rc)), return NULL);
    4755                } else {
    48                         CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%s", &addrbuf[0]), return NULL);
    49                 }
    50         } else {
    51                 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "(NULL / ANY)"), return NULL);
    52         }
    53        
    54         return *buf;
    55 }
    56 
    57 DECLARE_FD_DUMP_PROTOTYPE(fd_sa_dump_node_serv, sSA * sa, int flags)
    58 {
    59         char addrbuf[INET6_ADDRSTRLEN];
    60         char servbuf[32];
    61         FD_DUMP_HANDLE_OFFSET();
    62        
    63         if (sa) {
    64                 int rc = getnameinfo(sa, sSAlen( sa ), addrbuf, sizeof(addrbuf), servbuf, sizeof(servbuf), flags);
    65                 if (rc) {
    66                         CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%s", gai_strerror(rc)), return NULL);
    67                 } else {
    68                         CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%s(%s)", &addrbuf[0], &servbuf[0]), return NULL);
     56                        if (servbuf[0]) {
     57                                CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%s(%s)", &addrbuf[0], &servbuf[0]), return NULL);
     58                        } else {
     59                                CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%s", &addrbuf[0]), return NULL);
     60                        }
    6961                }
    7062        } else {
Note: See TracChangeset for help on using the changeset viewer.