Navigation


Changeset 1122:d4371b7aa0ff in freeDiameter for libfdproto


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

Location:
libfdproto
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • 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.