Navigation



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

File:
1 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
Note: See TracChangeset for help on using the changeset viewer.