Ticket #5716: bind_connect_enhancements.diff
File bind_connect_enhancements.diff, 7.6 KB (added by , 14 years ago) |
---|
-
src/add-ons/kernel/network/protocols/l2cap/l2cap_address.cpp
100 100 && (!checkPort || ((sockaddr_l2cap *)address)->l2cap_psm == 0) ); 101 101 } 102 102 103 /*! Checks if the given \a address is L2CAP address. 104 \return false if \a address is NULL, or with family different from AF_BLUETOOTH 105 true if it has AF_BLUETOOTH address family 106 */ 107 static bool 108 l2cap_is_same_family(const sockaddr *address) 109 { 110 if (address == NULL) 111 return false; 112 113 return address->sa_family == AF_BLUETOOTH; 114 } 103 115 104 116 /*! 105 117 Compares the IP-addresses of the two given address structures \a a and \a b. … … 401 413 l2cap_equal_addresses_and_ports, 402 414 l2cap_equal_masked_addresses, 403 415 l2cap_is_empty_address, 416 l2cap_is_same_family, 404 417 l2cap_first_mask_bit, 405 418 l2cap_check_mask, 406 419 l2cap_print_address, … … 413 426 l2cap_update_to, 414 427 l2cap_hash_address_pair, 415 428 l2cap_checksum_address, 416 NULL // l2cap_matches_broadcast_address, 429 NULL, // l2cap_matches_broadcast_address, 430 NULL // get_loopback_address 417 431 }; -
src/add-ons/kernel/network/protocols/ipv4/ipv4_address.cpp
107 107 && (!checkPort || ((sockaddr_in *)address)->sin_port == 0); 108 108 } 109 109 110 /*! Checks if the given \a address is an IPv4 address. 111 \return false if \a address is NULL, or with family different from AF_INET 112 true if it has AF_INET address family 113 */ 114 static bool 115 ipv4_is_same_family(const sockaddr *address) 116 { 117 if (address == NULL) 118 return false; 110 119 120 return address->sa_family == AF_INET; 121 } 122 111 123 /*! Compares the IP-addresses of the two given address structures \a a and \a b. 112 124 \return true if IP-addresses of \a a and \a b are equal, false if not 113 125 */ … … 477 489 return B_OK; 478 490 } 479 491 492 static void 493 ipv4_get_loopback_address(sockaddr *result) 494 { 495 sockaddr_in *resultIn = (sockaddr_in *)result; 496 memset(resultIn, 0, sizeof(resultIn)); 497 resultIn->sin_len = sizeof(sockaddr_in); 498 resultIn->sin_family = AF_INET; 499 resultIn->sin_addr.s_addr = htonl(INADDR_LOOPBACK); 500 } 480 501 502 481 503 net_address_module_info gIPv4AddressModule = { 482 504 { 483 505 NULL, … … 491 513 ipv4_equal_addresses_and_ports, 492 514 ipv4_equal_masked_addresses, 493 515 ipv4_is_empty_address, 516 ipv4_is_same_family, 494 517 ipv4_first_mask_bit, 495 518 ipv4_check_mask, 496 519 ipv4_print_address, … … 503 526 ipv4_update_to, 504 527 ipv4_hash_address_pair, 505 528 ipv4_checksum_address, 506 NULL // ipv4_matches_broadcast_address, 529 NULL, // ipv4_matches_broadcast_address, 530 ipv4_get_loopback_address 507 531 }; -
src/add-ons/kernel/network/protocols/unix/UnixAddress.cpp
112 112 && memcmp(address, &kEmptyAddress, kEmptyAddress.sun_len) == 0; 113 113 } 114 114 115 static bool 116 unix_is_same_family(const sockaddr *address) 117 { 118 if (address == NULL) 119 return false; 120 121 return address->sa_family == AF_UNIX; 122 } 115 123 116 124 static int32 117 125 unix_first_mask_bit(const sockaddr *mask) … … 290 298 unix_equal_addresses_and_ports, 291 299 unix_equal_masked_addresses, 292 300 unix_is_empty_address, 301 unix_is_same_family, 293 302 unix_first_mask_bit, 294 303 unix_check_mask, 295 304 unix_print_address, … … 302 311 unix_update_to, 303 312 unix_hash_address_pair, 304 313 unix_checksum_address, 305 NULL // matches_broadcast_address 314 NULL, // matches_broadcast_address 315 NULL // get_loopback_address 306 316 }; -
src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp
584 584 { 585 585 TRACE("Connect() on address %s", PrintAddress(address)); 586 586 587 if (!AddressModule()->is_same_family(address)) 588 return EAFNOSUPPORT; 589 587 590 MutexLocker locker(fLock); 588 591 589 592 if (gStackModule->is_restarted_syscall()) { … … 604 607 } else if (fState != CLOSED) 605 608 return EINPROGRESS; 606 609 607 // TODO: this is IPv4 specific, and doesn't belong here!608 610 // consider destination address INADDR_ANY as INADDR_LOOPBACK 609 sockaddr_ in_address;610 if ( ((sockaddr_in*)address)->sin_addr.s_addr == INADDR_ANY) {611 memcpy(&_address, address, sizeof(sockaddr_in));612 _address.sin_len = sizeof(sockaddr_in);613 _address.sin_addr.s_addr = INADDR_LOOPBACK;614 address = (sockaddr *)&_address;611 sockaddr_storage _address; 612 if (AddressModule()->is_empty_address(address, false)) { 613 AddressModule()->get_loopback_address((sockaddr *)&_address); 614 // for IPv4 and IPv6 the port is at the same offset 615 ((sockaddr_in &)_address).sin_port = ((sockaddr_in *)address)->sin_port; 616 address = (sockaddr *)&_address; 615 617 } 616 618 617 619 status_t status = _PrepareSendPath(address); -
src/add-ons/kernel/network/protocols/tcp/EndpointManager.cpp
362 362 status_t 363 363 EndpointManager::Bind(TCPEndpoint* endpoint, const sockaddr* address) 364 364 { 365 // TODO: check the family:366 // if (!AddressModule()->is_understandable(address))367 //return EAFNOSUPPORT;365 // check the family 366 if (!AddressModule()->is_same_family(address)) 367 return EAFNOSUPPORT; 368 368 369 369 WriteLocker locker(fLock); 370 370 -
src/add-ons/kernel/network/protocols/udp/udp.cpp
287 287 UdpDomainSupport::BindEndpoint(UdpEndpoint *endpoint, 288 288 const sockaddr *address) 289 289 { 290 if (!AddressModule()->is_same_family(address)) 291 return EAFNOSUPPORT; 292 290 293 MutexLocker _(fLock); 291 294 292 295 if (endpoint->IsActive()) … … 312 315 // so we reset the peer address: 313 316 endpoint->PeerAddress().SetToEmpty(); 314 317 } else { 318 if (!AddressModule()->is_same_family(address)) 319 return EAFNOSUPPORT; 320 321 // consider destination address INADDR_ANY as INADDR_LOOPBACK 322 sockaddr_storage _address; 323 if (AddressModule()->is_empty_address(address, false)) { 324 AddressModule()->get_loopback_address((sockaddr *)&_address); 325 // for IPv4 and IPv6 the port is at the same offset 326 ((sockaddr_in&)_address).sin_port = ((sockaddr_in *)address)->sin_port; 327 address = (sockaddr *)&_address; 328 } 329 315 330 status_t status = endpoint->PeerAddress().SetTo(address); 316 331 if (status < B_OK) 317 332 return status; -
headers/private/net/net_datalink.h
113 113 bool (*equal_masked_addresses)(const sockaddr *a, const sockaddr *b, 114 114 const sockaddr *mask); 115 115 bool (*is_empty_address)(const sockaddr *address, bool checkPort); 116 bool (*is_same_family)(const sockaddr *address); 116 117 117 118 int32 (*first_mask_bit)(const sockaddr *mask); 118 119 … … 142 143 143 144 bool (*matches_broadcast_address)(const sockaddr *address, 144 145 const sockaddr *mask, const sockaddr *broadcastAddr); 146 147 void (*get_loopback_address)(sockaddr *result); 145 148 }; 146 149 147 150 #endif // NET_DATALINK_H