Changeset 1136:140450615773 in freeDiameter for libfdcore
- Timestamp:
- May 16, 2013, 3:56:31 PM (11 years ago)
- Branch:
- default
- Phase:
- public
- Location:
- libfdcore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
libfdcore/endpoints.c
r1127 r1136 203 203 } 204 204 205 /* Remove any endpoint from the exclude list in the list */206 int fd_ep_filter_list( struct fd_list * list, struct fd_list * exclude_list )207 {208 struct fd_list * li_out, *li_ex, *li;209 struct fd_endpoint * out, * ex;210 211 TRACE_ENTRY("%p %p", list, exclude_list);212 CHECK_PARAMS(list && exclude_list);213 214 /* initialize. Both lists are ordered */215 li_out = list->next;216 li_ex = exclude_list->next;217 218 /* Now browse both lists in parallel */219 while ((li_out != list) && (li_ex != exclude_list)) {220 int cmp;221 in_port_t * port_out, *port_ex;222 223 out = (struct fd_endpoint *)li_out;224 ex = (struct fd_endpoint *)li_ex;225 226 /* Compare the next elements families */227 if (out->sa.sa_family < ex->sa.sa_family) {228 li_out = li_out->next;229 continue;230 }231 if (out->sa.sa_family > ex->sa.sa_family) {232 li_ex = li_ex->next;233 continue;234 }235 236 /* Then compare the address fields */237 switch (out->sa.sa_family) {238 case AF_INET: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;242 break;243 case AF_INET6: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;247 break;248 default:249 /* Filter this out */250 cmp = 0;251 }252 if (cmp < 0) {253 li_out = li_out->next;254 continue;255 }256 if (cmp > 0) {257 li_ex = li_ex->next;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 }270 }271 272 /* We remove this element then loop */273 li = li_out;274 li_out = li->next;275 fd_list_unlink(li);276 free(li);277 }278 279 return 0;280 281 }282 283 284 205 /* Reset the given flag(s) from all items in the list */ 285 206 int fd_ep_clearflags( struct fd_list * list, uint32_t flags ) -
libfdcore/p_cnx.c
r1103 r1136 121 121 } 122 122 123 /* Remove any local address that would be here, it should not happen but it does sometimes... */124 CHECK_FCT( fd_ep_filter_list(&peer->p_hdr.info.pi_endpoints, &fd_g_config->cnf_endpoints) );125 126 123 /* Now check we have at least one address to attempt */ 127 124 if (FD_IS_LIST_EMPTY(&peer->p_hdr.info.pi_endpoints)) { -
libfdcore/server.c
r1122 r1136 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 346 344 /* SCTP */ 347 345 if (!fd_g_config->cnf_flags.no_sctp) { … … 449 447 } 450 448 451 /* we will filter this list and create endpoints with port information */452 #ifdef ADDRESS_AVP_INCLUDE_PORT453 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 478 449 { 479 450 char * buf = NULL;
Note: See TracChangeset
for help on using the changeset viewer.