Changeset 1122:d4371b7aa0ff in freeDiameter
- Timestamp:
- May 14, 2013, 7:01:31 PM (11 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
include/freeDiameter/CMakeLists.txt
r935 r1122 33 33 # compliancy of their implementation with the Diameter RFC... 34 34 OPTION(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. 37 OPTION(ADDRESS_AVP_INCLUDE_PORT "Include the port number in the Address-based AVPs?" ON) 35 38 36 39 MARK_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 61 61 #cmakedefine DISABLE_PEER_EXPIRY 62 62 #cmakedefine WORKAROUND_ACCEPT_INVALID_VSAI 63 #cmakedefine ADDRESS_AVP_INCLUDE_PORT 63 64 #cmakedefine GNUTLS_VERSION_210 64 65 #cmakedefine GNUTLS_VERSION_300 -
include/freeDiameter/libfdcore.h
r1120 r1122 137 137 uint16_t cnf_port_tls; /* the local port for Diameter/TLS (default: 3869) in host byte order */ 138 138 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. */ 140 140 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. */ 141 141 uint16_t cnf_dispthr; /* Number of dispatch threads to create */ -
include/freeDiameter/libfdproto.h
r1120 r1122 610 610 ((((sSA *)_sa_)->sa_family == AF_INET6) ? (sizeof(sSA6)) : \ 611 611 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 617 DECLARE_FD_DUMP_PROTOTYPE(fd_sa_dump, sSA * sa, int flags); 615 618 #define sSA_DUMP_STRLEN (INET6_ADDRSTRLEN + 1 + 32 + 2) 616 619 void fd_sa_sdump_numeric(char * buf /* must be at least sSA_DUMP_STRLEN */, sSA * sa); -
libfdcore/endpoints.c
r1119 r1122 94 94 return 0; 95 95 } 96 96 97 97 /* remove the ACCEPTALL flag */ 98 98 flags &= ~EP_ACCEPTALL; … … 135 135 break; 136 136 } 137 if (*ep_port < *port) 138 continue; 137 if (*ep_port < *port) { 138 cmp = -1; 139 continue; 140 } 139 141 if (*ep_port > *port) 140 142 cmp = 1; … … 217 219 while ((li_out != list) && (li_ex != exclude_list)) { 218 220 int cmp; 219 221 in_port_t * port_out, *port_ex; 222 220 223 out = (struct fd_endpoint *)li_out; 221 224 ex = (struct fd_endpoint *)li_ex; … … 235 238 case AF_INET: 236 239 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; 237 242 break; 238 243 case AF_INET6: 239 244 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; 240 247 break; 241 248 default: … … 250 257 li_ex = li_ex->next; 251 258 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 } 252 270 } 253 271 … … 298 316 } 299 317 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); 301 319 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{%s%s%s%s%s}", 302 320 (ep->flags & EP_FL_CONF) ? "C" : "-", -
libfdcore/p_ce.c
r1119 r1122 110 110 for (li = fd_g_config->cnf_endpoints.next; li != &fd_g_config->cnf_endpoints; li = li->next) { 111 111 struct fd_endpoint * ep = (struct fd_endpoint *)li; 112 113 112 CHECK_FCT( fd_msg_avp_new ( dictobj, 0, &avp ) ); 114 113 CHECK_FCT( fd_msg_avp_value_encode ( &ep->ss, avp ) ); -
libfdcore/server.c
r1113 r1122 342 342 int empty_conf_ep = FD_IS_LIST_EMPTY(&fd_g_config->cnf_endpoints); 343 343 344 struct fd_list filter_list = FD_LIST_INITIALIZER(filter_list); 345 344 346 /* SCTP */ 345 347 if (!fd_g_config->cnf_flags.no_sctp) { … … 447 449 } 448 450 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 449 478 { 450 479 char * buf = NULL; -
libfdcore/tcp.c
r1085 r1122 138 138 pthread_cleanup_push(fd_cleanup_socket, &s); 139 139 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>" ); 141 141 free(buf); 142 142 -
libfdproto/dictionary_functions.c
r1093 r1122 74 74 AddressType = 1;/* see http://www.iana.org/assignments/address-family-numbers/ */ 75 75 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 */ 76 80 77 81 CHECK_MALLOC( buf = malloc(size) ); … … 79 83 /* may not work because of alignment: *(uint32_t *)(buf+2) = htonl(sin->sin_addr.s_addr); */ 80 84 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 */ 81 90 } 82 91 break; … … 89 98 AddressType = 2;/* see http://www.iana.org/assignments/address-family-numbers/ */ 90 99 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 */ 91 104 92 105 CHECK_MALLOC( buf = malloc(size) ); … … 94 107 /* The order is already good here */ 95 108 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 */ 96 114 } 97 115 break; … … 126 144 sSA4 * sin = (sSA4 *)interpreted; 127 145 128 CHECK_PARAMS( avp_value->os.len == 6 );146 CHECK_PARAMS( avp_value->os.len >= 6 ); 129 147 130 148 sin->sin_family = AF_INET; 131 149 /* sin->sin_addr.s_addr = ntohl( * (uint32_t *) buf); -- may not work because of bad alignment */ 132 150 memcpy(&sin->sin_addr.s_addr, buf, 4); 151 152 if (avp_value->os.len == 8) 153 memcpy(&sin->sin_port, buf + 4, 2); 133 154 } 134 155 break; … … 138 159 sSA6 * sin6 = (sSA6 *)interpreted; 139 160 140 CHECK_PARAMS( avp_value->os.len == 18 );161 CHECK_PARAMS( avp_value->os.len >= 18 ); 141 162 142 163 sin6->sin6_family = AF_INET6; 143 164 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 144 169 } 145 170 break; … … 179 204 /* IP */ 180 205 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)) { 182 207 CHECK_MALLOC_DO( fd_dump_extend(FD_DUMP_STD_PARAMS, "[invalid IP length: %zd]", avp_value->os.len), return NULL); 183 208 return *buf; 184 209 } 185 210 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); 186 213 break; 187 214 case 2: 188 215 /* IP6 */ 189 216 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)) { 191 218 CHECK_MALLOC_DO( fd_dump_extend(FD_DUMP_STD_PARAMS, "[invalid IP6 length: %zd]", avp_value->os.len), return NULL); 192 219 return *buf; 193 220 } 194 221 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); 195 224 break; 196 225 default: … … 199 228 } 200 229 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); 202 231 } 203 232 -
libfdproto/utils.c
r1119 r1122 36 36 #include "fdproto-internal.h" 37 37 38 DECLARE_FD_DUMP_PROTOTYPE(fd_sa_dump _node, sSA * sa, int flags)38 DECLARE_FD_DUMP_PROTOTYPE(fd_sa_dump, sSA * sa, int flags) 39 39 { 40 40 char addrbuf[INET6_ADDRSTRLEN]; 41 char servbuf[32]; 42 int rc; 41 43 FD_DUMP_HANDLE_OFFSET(); 42 44 45 servbuf[0] = 0; 46 43 47 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 } 45 53 if (rc) { 46 54 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%s", gai_strerror(rc)), return NULL); 47 55 } 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 } 69 61 } 70 62 } else {
Note: See TracChangeset
for help on using the changeset viewer.