Lines Matching refs:socket

74 int socket_bind(net_socket* socket, const struct sockaddr* address,
76 int socket_setsockopt(net_socket* socket, int level, int option,
78 ssize_t socket_read_avail(net_socket* socket);
103 mutex_init(&lock, "socket");
120 panic("socket still has a parent!");
129 // also delete all children of this socket
168 struct net_socket_private* socket = new(std::nothrow) net_socket_private;
169 if (socket == NULL)
171 status_t status = socket->InitCheck();
173 delete socket;
177 socket->family = family;
178 socket->type = type;
179 socket->protocol = protocol;
181 status = get_domain_protocols(socket);
183 delete socket;
187 TRACE("create net_socket %p (%u.%u.%u):\n", socket, socket->family,
188 socket->type, socket->protocol);
191 net_protocol* current = socket->first_protocol;
196 *_socket = socket;
202 add_ancillary_data(net_socket* socket, ancillary_data_container* container,
210 if (socket->first_info->add_ancillary_data == NULL)
217 status_t status = socket->first_info->add_ancillary_data(
218 socket->first_protocol, container, header);
233 process_ancillary_data(net_socket* socket, ancillary_data_container* container,
248 if (socket->first_info->process_ancillary_data == NULL)
251 ssize_t bytesWritten = socket->first_info->process_ancillary_data(
252 socket->first_protocol, &header, data, dataBuffer, dataBufferLen);
267 process_ancillary_data(net_socket* socket,
278 if (socket->first_info->process_ancillary_data_no_container == NULL)
281 bytesWritten = socket->first_info->process_ancillary_data_no_container(
282 socket->first_protocol, buffer, dataBuffer,
293 socket_receive_no_buffer(net_socket* socket, msghdr* header, void* data,
303 ssize_t bytesRead = socket->first_info->read_data_no_buffer(
304 socket->first_protocol, vecs, vecCount, &ancillaryData, address,
315 status_t status = process_ancillary_data(socket, ancillaryData, header);
330 print_socket_line(net_socket_private* socket, const char* prefix)
332 BReference<net_socket_private> parent = socket->parent.GetReference();
333 kprintf("%s%p %2d.%2d.%2d %6" B_PRId32 " %p %p %p%s\n", prefix, socket,
334 socket->family, socket->type, socket->protocol, socket->owner,
335 socket->first_protocol, socket->first_info, parent.Get(),
336 parent.IsSet() ? socket->is_connected ? " (c)" : " (p)" : "");
348 net_socket_private* socket = (net_socket_private*)parse_expression(argv[1]);
350 kprintf("SOCKET %p\n", socket);
352 socket->family, socket->type, socket->protocol);
353 BReference<net_socket_private> parent = socket->parent.GetReference();
355 kprintf(" first protocol: %p\n", socket->first_protocol);
356 kprintf(" first module_info: %p\n", socket->first_info);
357 kprintf(" options: %x\n", socket->options);
358 kprintf(" linger: %d\n", socket->linger);
359 kprintf(" bound to device: %" B_PRIu32 "\n", socket->bound_to_device);
360 kprintf(" owner: %" B_PRId32 "\n", socket->owner);
361 kprintf(" max backlog: %" B_PRId32 "\n", socket->max_backlog);
362 kprintf(" is connected: %d\n", socket->is_connected);
363 kprintf(" child_count: %" B_PRIu32 "\n", socket->child_count);
365 if (socket->child_count == 0)
369 SocketList::Iterator iterator = socket->pending_children.GetIterator();
375 iterator = socket->connected_children.GetIterator();
390 while (net_socket_private* socket = iterator.Next()) {
391 print_socket_line(socket, "");
394 = socket->pending_children.GetIterator();
399 childIterator = socket->connected_children.GetIterator();
418 net_socket_private* socket;
419 status_t status = create_socket(family, type, protocol, &socket);
423 status = socket->first_info->open(socket->first_protocol);
425 delete socket;
429 socket->owner = team_get_current_team_id();
430 socket->is_in_socket_list = true;
433 sSocketList.Add(socket);
436 *_socket = socket;
444 net_socket_private* socket = (net_socket_private*)_socket;
445 return socket->first_info->close(socket->first_protocol);
452 net_socket_private* socket = (net_socket_private*)_socket;
453 socket->first_info->free(socket->first_protocol);
454 socket->ReleaseReference();
459 socket_control(net_socket* socket, uint32 op, void* data, size_t length)
476 return socket_setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &value,
482 if (data == NULL || (socket->options & SO_ACCEPTCONN) != 0)
485 int available = (int)socket_read_avail(socket);
505 return socket_setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &value,
510 return socket->first_info->control(socket->first_protocol,
516 socket_read_avail(net_socket* socket)
518 return socket->first_info->read_avail(socket->first_protocol);
523 socket_send_avail(net_socket* socket)
525 return socket->first_info->send_avail(socket->first_protocol);
530 socket_send_data(net_socket* socket, net_buffer* buffer)
532 return socket->first_info->send_data(socket->first_protocol,
538 socket_receive_data(net_socket* socket, size_t length, uint32 flags,
541 status_t status = socket->first_info->read_data(socket->first_protocol,
560 net_socket_private* socket = NULL;
566 socket = iterator.Next();
567 if (socket == NULL)
574 if (family == -1 || family == socket->family)
580 stat->family = socket->family;
581 stat->type = socket->type;
582 stat->protocol = socket->protocol;
583 stat->owner = socket->owner;
585 memcpy(&stat->address, &socket->address, sizeof(struct sockaddr_storage));
586 memcpy(&stat->peer, &socket->peer, sizeof(struct sockaddr_storage));
592 socket->first_info->control(socket->first_protocol, socket->protocol,
605 net_socket_private* socket = (net_socket_private*)_socket;
607 // During destruction, the socket might still be accessible over its
609 // socket anymore -- while not obvious, the endpoint protocol is responsible
611 if (socket->CountReferences() == 0)
614 socket->AcquireReference();
622 net_socket_private* socket = (net_socket_private*)_socket;
623 return socket->ReleaseReference();
642 net_socket_private* socket;
644 parent->protocol, &socket);
649 socket->send = parent->send;
650 socket->receive = parent->receive;
651 socket->options = parent->options & (SO_KEEPALIVE | SO_DONTROUTE | SO_LINGER | SO_OOBINLINE);
652 socket->linger = parent->linger;
653 socket->owner = parent->owner;
654 memcpy(&socket->address, &parent->address, parent->address.ss_len);
655 memcpy(&socket->peer, &parent->peer, parent->peer.ss_len);
658 parent->pending_children.Add(socket);
659 socket->parent = parent;
662 *_socket = socket;
667 /*! Dequeues a connected child from a parent socket.
668 It also returns a reference with the child socket.
677 net_socket_private* socket = parent->connected_children.RemoveHead();
678 if (socket != NULL) {
679 socket->AcquireReference();
680 socket->RemoveFromParent();
682 *_socket = socket;
687 if (socket == NULL)
707 net_socket_private* socket = (net_socket_private*)_socket;
713 MutexLocker _(socket->lock);
718 while (socket->child_count > backlog
719 && (child = socket->pending_children.RemoveTail()) != NULL) {
721 socket->child_count--;
723 while (socket->child_count > backlog
724 && (child = socket->connected_children.RemoveTail()) != NULL) {
726 socket->child_count--;
729 socket->max_backlog = backlog;
734 /*! Returns whether or not this socket has a parent. The parent might not be
740 net_socket_private* socket = (net_socket_private*)_socket;
741 return socket->parent != NULL;
745 /*! The socket has been connected. It will be moved to the connected queue
746 of its parent socket.
751 net_socket_private* socket = (net_socket_private*)_socket;
753 TRACE("socket_connected(%p)\n", socket);
755 if (socket->parent == NULL) {
756 socket->is_connected = true;
760 BReference<net_socket_private> parent = socket->parent.GetReference();
766 parent->pending_children.Remove(socket);
767 parent->connected_children.Add(socket);
768 socket->is_connected = true;
778 /*! The socket has been aborted. Steals the parent's reference, and releases
784 net_socket_private* socket = (net_socket_private*)_socket;
786 TRACE("socket_aborted(%p)\n", socket);
788 BReference<net_socket_private> parent = socket->parent.GetReference();
794 if (socket->is_connected)
795 parent->connected_children.Remove(socket);
797 parent->pending_children.Remove(socket);
800 socket->RemoveFromParent();
812 net_socket_private* socket = (net_socket_private*)_socket;
814 mutex_lock(&socket->lock);
816 status_t status = add_select_sync_pool_entry(&socket->select_pool, sync,
819 mutex_unlock(&socket->lock);
830 ssize_t available = socket_read_avail(socket);
831 if ((ssize_t)socket->receive.low_water_mark <= available
838 if ((socket->options & SO_ACCEPTCONN) != 0)
841 ssize_t available = socket_send_avail(socket);
842 if ((ssize_t)socket->send.low_water_mark <= available
848 if (socket->error != B_OK)
860 net_socket_private* socket = (net_socket_private*)_socket;
862 MutexLocker _(socket->lock);
863 return remove_select_sync_pool_entry(&socket->select_pool, sync, event);
870 net_socket_private* socket = (net_socket_private*)_socket;
875 if ((ssize_t)socket->receive.low_water_mark > value
881 if ((ssize_t)socket->send.low_water_mark > value && value >= B_OK)
886 socket->error = value;
890 MutexLocker _(socket->lock);
892 if (notify && socket->select_pool != NULL) {
893 notify_select_event_pool(socket->select_pool, event);
897 notify_select_event_pool(socket->select_pool, B_SELECT_READ);
898 notify_select_event_pool(socket->select_pool, B_SELECT_WRITE);
906 // #pragma mark - standard socket API
910 socket_accept(net_socket* socket, struct sockaddr* address,
913 if ((socket->options & SO_ACCEPTCONN) == 0)
917 status_t status = socket->first_info->accept(socket->first_protocol,
934 socket_bind(net_socket* socket, const struct sockaddr* address,
942 empty.sa_family = socket->family;
948 if (socket->address.ss_len != 0)
951 memcpy(&socket->address, address, sizeof(sockaddr));
952 socket->address.ss_len = sizeof(sockaddr_storage);
954 status_t status = socket->first_info->bind(socket->first_protocol,
958 socket->address.ss_len = 0;
966 socket_connect(net_socket* socket, const struct sockaddr* address,
972 if (socket->address.ss_len == 0) {
974 status_t status = socket_bind(socket, NULL, 0);
979 return socket->first_info->connect(socket->first_protocol, address);
987 net_socket_private* socket = (net_socket_private*)_socket;
988 BReference<net_socket_private> parent = socket->parent.GetReference();
990 if ((!parent.IsSet() && !socket->is_connected) || socket->peer.ss_len == 0)
993 memcpy(address, &socket->peer, min_c(*_addressLength, socket->peer.ss_len));
994 *_addressLength = socket->peer.ss_len;
1000 socket_getsockname(net_socket* socket, struct sockaddr* address,
1003 if (socket->address.ss_len == 0) {
1006 buffer.sa_family = socket->family;
1013 memcpy(address, &socket->address, min_c(*_addressLength,
1014 socket->address.ss_len));
1015 *_addressLength = socket->address.ss_len;
1021 socket_get_option(net_socket* socket, int level, int option, void* value,
1031 *size = socket->send.buffer_size;
1039 *size = socket->receive.buffer_size;
1047 *size = socket->send.low_water_mark;
1055 *size = socket->receive.low_water_mark;
1068 timeout = socket->send.timeout;
1070 timeout = socket->receive.timeout;
1085 *_set = socket->receive.timeout == 0 && socket->send.timeout == 0;
1101 *_set = (socket->options & option) != 0;
1109 *_set = socket->type;
1117 *_set = socket->error;
1120 socket->error = B_OK;
1135 socket_getsockopt(net_socket* socket, int level, int option, void* value,
1138 return socket->first_protocol->module->getsockopt(socket->first_protocol,
1144 socket_listen(net_socket* socket, int backlog)
1146 status_t status = socket->first_info->listen(socket->first_protocol,
1149 socket->options |= SO_ACCEPTCONN;
1156 socket_receive(net_socket* socket, msghdr* header, void* data, size_t length,
1166 if (socket->first_info->read_data_no_buffer != NULL)
1167 return socket_receive_no_buffer(socket, header, data, length, flags);
1182 status_t status = socket->first_info->read_data(
1183 socket->first_protocol, totalLength, flags, &buffer);
1193 status = process_ancillary_data(socket, container, header);
1195 status = process_ancillary_data(socket, buffer, header);
1268 socket_send(net_socket* socket, msghdr* header, const void* data, size_t length,
1296 status_t status = add_ancillary_data(socket, ancillaryData,
1308 if (socket->peer.ss_len != 0) {
1312 // socket is connected, we use that address
1313 address = (struct sockaddr*)&socket->peer;
1314 addressLength = socket->peer.ss_len;
1322 if ((socket->first_info->flags & NET_PROTOCOL_ATOMIC_MESSAGES) != 0
1323 && bytesLeft > socket->send.buffer_size)
1326 if (socket->address.ss_len == 0) {
1328 status_t status = socket_bind(socket, NULL, 0);
1334 if (socket->first_info->send_data_no_buffer != NULL) {
1339 ssize_t written = socket->first_info->send_data_no_buffer(
1340 socket->first_protocol, vecs, vecCount, ancillaryData, address,
1374 while (buffer->size < socket->send.buffer_size
1383 if (buffer->size + bytes > socket->send.buffer_size)
1384 bytes = socket->send.buffer_size - buffer->size;
1416 memcpy(buffer->source, &socket->address, socket->address.ss_len);
1420 status = socket->first_info->send_data(socket->first_protocol, buffer);
1446 socket_set_option(net_socket* socket, int level, int option, const void* value,
1452 TRACE("%s(socket %p, option %d\n", __FUNCTION__, socket, option);
1463 socket->options |= SO_LINGER;
1464 socket->linger = linger->l_linger;
1466 socket->options &= ~SO_LINGER;
1467 socket->linger = 0;
1476 socket->send.buffer_size = *(const uint32*)value;
1483 socket->receive.buffer_size = *(const uint32*)value;
1490 socket->send.low_water_mark = *(const uint32*)value;
1497 socket->receive.low_water_mark = *(const uint32*)value;
1512 socket->send.timeout = timeout;
1514 socket->receive.timeout = timeout;
1523 socket->send.timeout = 0;
1524 socket->receive.timeout = 0;
1526 socket->send.timeout = B_INFINITE_TIMEOUT;
1527 socket->receive.timeout = B_INFINITE_TIMEOUT;
1543 socket->options |= option;
1545 socket->options &= ~option;
1555 socket->bound_to_device = *(const uint32*)value;
1569 socket_setsockopt(net_socket* socket, int level, int option, const void* value,
1572 return socket->first_protocol->module->setsockopt(socket->first_protocol,
1578 socket_shutdown(net_socket* socket, int direction)
1580 return socket->first_info->shutdown(socket->first_protocol, direction);
1612 // accept a socket
1617 // everything worked: close the listener socket
1654 mutex_init(&sSocketLock, "socket list");
1658 add_debugger_command("socket", dump_socket, "dumps a socket");
1667 remove_debugger_command("socket", dump_socket);
1717 // standard socket API