Mercurial > hg > freeDiameter
diff libfdproto/dictionary_functions.c @ 1122:d4371b7aa0ff
New CMake option: ADDRESS_AVP_INCLUDE_PORT. Turn off for standard Host-IP-Address AVPs
author | Sebastien Decugis <sdecugis@freediameter.net> |
---|---|
date | Tue, 14 May 2013 18:01:31 +0800 |
parents | 44f3e48dfe27 |
children | 140450615773 |
line wrap: on
line diff
--- a/libfdproto/dictionary_functions.c Tue May 14 15:27:28 2013 +0800 +++ b/libfdproto/dictionary_functions.c Tue May 14 18:01:31 2013 +0800 @@ -73,11 +73,20 @@ AddressType = 1;/* see http://www.iana.org/assignments/address-family-numbers/ */ size = 6; /* 2 for AddressType + 4 for data */ + #ifdef ADDRESS_AVP_INCLUDE_PORT + if (sin->sin_port != 0) + size += 2; + #endif /* ADDRESS_AVP_INCLUDE_PORT */ CHECK_MALLOC( buf = malloc(size) ); /* may not work because of alignment: *(uint32_t *)(buf+2) = htonl(sin->sin_addr.s_addr); */ memcpy(buf + 2, &sin->sin_addr.s_addr, 4); + + #ifdef ADDRESS_AVP_INCLUDE_PORT + if (sin->sin_port != 0) + memcpy(buf + 6, &sin->sin_port, 2); + #endif /* ADDRESS_AVP_INCLUDE_PORT */ } break; @@ -88,11 +97,20 @@ AddressType = 2;/* see http://www.iana.org/assignments/address-family-numbers/ */ size = 18; /* 2 for AddressType + 16 for data */ + #ifdef ADDRESS_AVP_INCLUDE_PORT + if (sin6->sin6_port != 0) + size += 2; + #endif /* ADDRESS_AVP_INCLUDE_PORT */ CHECK_MALLOC( buf = malloc(size) ); /* The order is already good here */ memcpy(buf + 2, &sin6->sin6_addr.s6_addr, 16); + + #ifdef ADDRESS_AVP_INCLUDE_PORT + if (sin6->sin6_port != 0) + memcpy(buf + 18, &sin6->sin6_port, 2); + #endif /* ADDRESS_AVP_INCLUDE_PORT */ } break; @@ -125,11 +143,14 @@ { sSA4 * sin = (sSA4 *)interpreted; - CHECK_PARAMS( avp_value->os.len == 6 ); + CHECK_PARAMS( avp_value->os.len >= 6 ); sin->sin_family = AF_INET; /* sin->sin_addr.s_addr = ntohl( * (uint32_t *) buf); -- may not work because of bad alignment */ memcpy(&sin->sin_addr.s_addr, buf, 4); + + if (avp_value->os.len == 8) + memcpy(&sin->sin_port, buf + 4, 2); } break; @@ -137,10 +158,14 @@ { sSA6 * sin6 = (sSA6 *)interpreted; - CHECK_PARAMS( avp_value->os.len == 18 ); + CHECK_PARAMS( avp_value->os.len >= 18 ); sin6->sin6_family = AF_INET6; memcpy(&sin6->sin6_addr.s6_addr, buf, 16); + + if (avp_value->os.len == 20) + memcpy(&sin6->sin6_port, buf + 16, 2); + } break; @@ -178,27 +203,31 @@ case 1: /* IP */ s.sa.sa_family = AF_INET; - if (avp_value->os.len != 6) { + if ((avp_value->os.len != 6) && (avp_value->os.len != 8)) { CHECK_MALLOC_DO( fd_dump_extend(FD_DUMP_STD_PARAMS, "[invalid IP length: %zd]", avp_value->os.len), return NULL); return *buf; } memcpy(&s.sin.sin_addr.s_addr, avp_value->os.data + 2, 4); + if (avp_value->os.len == 8) + memcpy(&s.sin.sin_port, avp_value->os.data + 6, 2); break; case 2: /* IP6 */ s.sa.sa_family = AF_INET6; - if (avp_value->os.len != 18) { + if ((avp_value->os.len != 18) && (avp_value->os.len != 20)) { CHECK_MALLOC_DO( fd_dump_extend(FD_DUMP_STD_PARAMS, "[invalid IP6 length: %zd]", avp_value->os.len), return NULL); return *buf; } memcpy(&s.sin6.sin6_addr.s6_addr, avp_value->os.data + 2, 16); + if (avp_value->os.len == 20) + memcpy(&s.sin6.sin6_port, avp_value->os.data + 18, 2); break; default: CHECK_MALLOC_DO( fd_dump_extend(FD_DUMP_STD_PARAMS, "[unsupported family: 0x%hx]", fam), return NULL); return *buf; } - return fd_sa_dump_node(FD_DUMP_STD_PARAMS, &s.sa, NI_NUMERICHOST); + return fd_sa_dump(FD_DUMP_STD_PARAMS, &s.sa, NI_NUMERICHOST); }