vfs: check userland buffers before reading them.
[haiku.git] / src / add-ons / kernel / network / stack / link.cpp
blobc88f19b4970eb07620db3c1a8e4acdaa64ff74cb
1 /*
2 * Copyright 2006-2013, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
5 * Authors:
6 * Axel Dörfler, axeld@pinc-software.de
7 */
10 //! The net_protocol one talks to when using the AF_LINK protocol
13 #include "link.h"
15 #include <net/if_dl.h>
16 #include <net/if_types.h>
17 #include <new>
18 #include <stdlib.h>
19 #include <string.h>
20 #include <sys/sockio.h>
22 #include <KernelExport.h>
24 #include <lock.h>
25 #include <net_datalink.h>
26 #include <net_device.h>
27 #include <ProtocolUtilities.h>
28 #include <util/AutoLock.h>
30 #include "device_interfaces.h"
31 #include "domains.h"
32 #include "interfaces.h"
33 #include "stack_private.h"
34 #include "utility.h"
37 class LocalStackBundle {
38 public:
39 static net_stack_module_info* Stack() { return &gNetStackModule; }
40 static net_buffer_module_info* Buffer() { return &gNetBufferModule; }
43 typedef DatagramSocket<MutexLocking, LocalStackBundle> LocalDatagramSocket;
45 class LinkProtocol : public net_protocol, public LocalDatagramSocket {
46 public:
47 LinkProtocol(net_socket* socket);
48 virtual ~LinkProtocol();
50 status_t StartMonitoring(const char* deviceName);
51 status_t StopMonitoring(const char* deviceName);
53 status_t Bind(const sockaddr* address);
54 status_t Unbind();
55 bool IsBound() const
56 { return fBoundToDevice != NULL; }
58 size_t MTU();
60 protected:
61 status_t SocketStatus(bool peek) const;
63 private:
64 status_t _Unregister();
66 static status_t _MonitorData(net_device_monitor* monitor,
67 net_buffer* buffer);
68 static void _MonitorEvent(net_device_monitor* monitor,
69 int32 event);
70 static status_t _ReceiveData(void* cookie, net_device* device,
71 net_buffer* buffer);
73 private:
74 net_device_monitor fMonitor;
75 net_device_interface* fMonitoredDevice;
76 net_device_interface* fBoundToDevice;
77 uint32 fBoundType;
81 struct net_domain* sDomain;
84 LinkProtocol::LinkProtocol(net_socket* socket)
86 LocalDatagramSocket("packet capture", socket),
87 fMonitoredDevice(NULL),
88 fBoundToDevice(NULL)
90 fMonitor.cookie = this;
91 fMonitor.receive = _MonitorData;
92 fMonitor.event = _MonitorEvent;
96 LinkProtocol::~LinkProtocol()
98 if (fMonitoredDevice != NULL) {
99 unregister_device_monitor(fMonitoredDevice->device, &fMonitor);
100 put_device_interface(fMonitoredDevice);
101 } else
102 Unbind();
106 status_t
107 LinkProtocol::StartMonitoring(const char* deviceName)
109 MutexLocker locker(fLock);
111 if (fMonitoredDevice != NULL)
112 return B_BUSY;
114 net_device_interface* interface = get_device_interface(deviceName);
115 if (interface == NULL)
116 return B_DEVICE_NOT_FOUND;
118 status_t status = register_device_monitor(interface->device, &fMonitor);
119 if (status < B_OK) {
120 put_device_interface(interface);
121 return status;
124 fMonitoredDevice = interface;
125 return B_OK;
129 status_t
130 LinkProtocol::StopMonitoring(const char* deviceName)
132 MutexLocker locker(fLock);
134 if (fMonitoredDevice == NULL
135 || strcmp(fMonitoredDevice->device->name, deviceName) != 0)
136 return B_BAD_VALUE;
138 return _Unregister();
142 status_t
143 LinkProtocol::Bind(const sockaddr* address)
145 // Only root is allowed to bind to a link layer interface
146 if (address == NULL || geteuid() != 0)
147 return B_NOT_ALLOWED;
149 MutexLocker locker(fLock);
151 if (fMonitoredDevice != NULL)
152 return B_BUSY;
154 Interface* interface = get_interface_for_link(sDomain, address);
155 if (interface == NULL)
156 return B_BAD_VALUE;
158 net_device_interface* boundTo
159 = acquire_device_interface(interface->DeviceInterface());
161 interface->ReleaseReference();
163 if (boundTo == NULL)
164 return B_BAD_VALUE;
166 sockaddr_dl& linkAddress = *(sockaddr_dl*)address;
168 if (linkAddress.sdl_type != 0) {
169 fBoundType = B_NET_FRAME_TYPE(linkAddress.sdl_type,
170 ntohs(linkAddress.sdl_e_type));
171 // Bind to the type requested - this is needed in order to
172 // receive any buffers
173 // TODO: this could be easily changed by introducing catch all or rule
174 // based handlers!
175 status_t status = register_device_handler(boundTo->device, fBoundType,
176 &LinkProtocol::_ReceiveData, this);
177 if (status != B_OK)
178 return status;
179 } else
180 fBoundType = 0;
182 fBoundToDevice = boundTo;
183 socket->bound_to_device = boundTo->device->index;
185 memcpy(&socket->address, address, sizeof(struct sockaddr_storage));
186 socket->address.ss_len = sizeof(struct sockaddr_storage);
188 return B_OK;
192 status_t
193 LinkProtocol::Unbind()
195 MutexLocker locker(fLock);
197 if (fBoundToDevice == NULL)
198 return B_BAD_VALUE;
200 unregister_device_handler(fBoundToDevice->device, fBoundType);
201 put_device_interface(fBoundToDevice);
203 socket->bound_to_device = 0;
204 socket->address.ss_len = 0;
205 return B_OK;
209 size_t
210 LinkProtocol::MTU()
212 MutexLocker locker(fLock);
214 if (!IsBound())
215 return 0;
217 return fBoundToDevice->device->mtu;
221 status_t
222 LinkProtocol::SocketStatus(bool peek) const
224 if (fMonitoredDevice == NULL && !IsBound())
225 return B_DEVICE_NOT_FOUND;
227 return LocalDatagramSocket::SocketStatus(peek);
231 status_t
232 LinkProtocol::_Unregister()
234 if (fMonitoredDevice == NULL)
235 return B_BAD_VALUE;
237 status_t status = unregister_device_monitor(fMonitoredDevice->device,
238 &fMonitor);
239 put_device_interface(fMonitoredDevice);
240 fMonitoredDevice = NULL;
242 return status;
246 /*static*/ status_t
247 LinkProtocol::_MonitorData(net_device_monitor* monitor, net_buffer* packet)
249 return ((LinkProtocol*)monitor->cookie)->EnqueueClone(packet);
253 /*static*/ void
254 LinkProtocol::_MonitorEvent(net_device_monitor* monitor, int32 event)
256 LinkProtocol* protocol = (LinkProtocol*)monitor->cookie;
258 if (event == B_DEVICE_GOING_DOWN) {
259 MutexLocker _(protocol->fLock);
261 protocol->_Unregister();
262 if (protocol->IsEmpty()) {
263 protocol->WakeAll();
264 notify_socket(protocol->socket, B_SELECT_READ, B_DEVICE_NOT_FOUND);
270 /*static*/ status_t
271 LinkProtocol::_ReceiveData(void* cookie, net_device* device, net_buffer* buffer)
273 LinkProtocol* protocol = (LinkProtocol*)cookie;
275 return protocol->Enqueue(buffer);
279 // #pragma mark -
282 static bool
283 user_request_get_device_interface(void* value, struct ifreq& request,
284 net_device_interface*& interface)
286 if (user_memcpy(&request, value, IF_NAMESIZE) < B_OK)
287 return false;
289 interface = get_device_interface(request.ifr_name);
290 return true;
294 // #pragma mark - net_protocol module
297 static net_protocol*
298 link_init_protocol(net_socket* socket)
300 LinkProtocol* protocol = new (std::nothrow) LinkProtocol(socket);
301 if (protocol != NULL && protocol->InitCheck() < B_OK) {
302 delete protocol;
303 return NULL;
306 return protocol;
310 static status_t
311 link_uninit_protocol(net_protocol* protocol)
313 delete (LinkProtocol*)protocol;
314 return B_OK;
318 static status_t
319 link_open(net_protocol* protocol)
321 return B_OK;
325 static status_t
326 link_close(net_protocol* protocol)
328 return B_OK;
332 static status_t
333 link_free(net_protocol* protocol)
335 return B_OK;
339 static status_t
340 link_connect(net_protocol* protocol, const struct sockaddr* address)
342 return B_NOT_SUPPORTED;
346 static status_t
347 link_accept(net_protocol* protocol, struct net_socket** _acceptedSocket)
349 return B_NOT_SUPPORTED;
353 static status_t
354 link_control(net_protocol* _protocol, int level, int option, void* value,
355 size_t* _length)
357 LinkProtocol* protocol = (LinkProtocol*)_protocol;
359 switch (option) {
360 case SIOCGIFINDEX:
362 // get index of interface
363 net_device_interface* interface;
364 struct ifreq request;
365 if (!user_request_get_device_interface(value, request, interface))
366 return B_BAD_ADDRESS;
368 if (interface != NULL) {
369 request.ifr_index = interface->device->index;
370 put_device_interface(interface);
371 } else
372 request.ifr_index = 0;
374 return user_memcpy(value, &request, sizeof(struct ifreq));
376 case SIOCGIFNAME:
378 // get name of interface via index
379 struct ifreq request;
380 if (user_memcpy(&request, value, sizeof(struct ifreq)) < B_OK)
381 return B_BAD_ADDRESS;
383 net_device_interface* interface
384 = get_device_interface(request.ifr_index);
385 if (interface == NULL)
386 return B_DEVICE_NOT_FOUND;
388 strlcpy(request.ifr_name, interface->device->name, IF_NAMESIZE);
389 put_device_interface(interface);
391 return user_memcpy(value, &request, sizeof(struct ifreq));
394 case SIOCGIFCOUNT:
396 // count number of interfaces
397 struct ifconf config;
398 config.ifc_value = count_device_interfaces();
400 return user_memcpy(value, &config, sizeof(struct ifconf));
403 case SIOCGIFCONF:
405 // retrieve available interfaces
406 struct ifconf config;
407 if (user_memcpy(&config, value, sizeof(struct ifconf)) < B_OK)
408 return B_BAD_ADDRESS;
410 status_t result = list_device_interfaces(config.ifc_buf,
411 (size_t*)&config.ifc_len);
412 if (result != B_OK)
413 return result;
415 return user_memcpy(value, &config, sizeof(struct ifconf));
418 case SIOCGIFADDR:
420 // get address of interface
421 net_device_interface* interface;
422 struct ifreq request;
423 if (!user_request_get_device_interface(value, request, interface))
424 return B_BAD_ADDRESS;
426 if (interface == NULL)
427 return B_DEVICE_NOT_FOUND;
429 sockaddr_storage address;
430 get_device_interface_address(interface, (sockaddr*)&address);
431 put_device_interface(interface);
433 return user_memcpy(&((struct ifreq*)value)->ifr_addr,
434 &address, address.ss_len);
437 case SIOCGIFFLAGS:
439 // get flags of interface
440 net_device_interface* interface;
441 struct ifreq request;
442 if (!user_request_get_device_interface(value, request, interface))
443 return B_BAD_ADDRESS;
445 if (interface == NULL)
446 return B_DEVICE_NOT_FOUND;
448 request.ifr_flags = interface->device->flags;
449 put_device_interface(interface);
451 return user_memcpy(&((struct ifreq*)value)->ifr_flags,
452 &request.ifr_flags, sizeof(request.ifr_flags));
455 case SIOCGIFMEDIA:
457 // get media
458 if (*_length < sizeof(ifmediareq))
459 return B_BAD_VALUE;
461 net_device_interface* interface;
462 struct ifmediareq request;
463 if (!user_request_get_device_interface(value, (ifreq&)request,
464 interface))
465 return B_BAD_ADDRESS;
467 if (interface == NULL)
468 return B_DEVICE_NOT_FOUND;
470 if (user_memcpy(&request, value, sizeof(ifmediareq)) != B_OK) {
471 put_device_interface(interface);
472 return B_BAD_ADDRESS;
475 // TODO: see above.
476 if (interface->device->module->control(interface->device,
477 SIOCGIFMEDIA, &request,
478 sizeof(struct ifmediareq)) != B_OK) {
479 memset(&request, 0, sizeof(struct ifmediareq));
480 request.ifm_active = request.ifm_current
481 = interface->device->media;
483 put_device_interface(interface);
485 return user_memcpy(value, &request, sizeof(struct ifmediareq));
488 case SIOCSPACKETCAP:
490 // Only root is allowed to capture packets
491 if (geteuid() != 0)
492 return B_NOT_ALLOWED;
494 struct ifreq request;
495 if (user_memcpy(&request, value, IF_NAMESIZE) != B_OK)
496 return B_BAD_ADDRESS;
498 return protocol->StartMonitoring(request.ifr_name);
501 case SIOCCPACKETCAP:
503 struct ifreq request;
504 if (user_memcpy(&request, value, IF_NAMESIZE) != B_OK)
505 return B_BAD_ADDRESS;
507 return protocol->StopMonitoring(request.ifr_name);
511 return gNetDatalinkModule.control(sDomain, option, value, _length);
515 static status_t
516 link_getsockopt(net_protocol* protocol, int level, int option, void* value,
517 int* length)
519 if (protocol->next != NULL) {
520 return protocol->next->module->getsockopt(protocol, level, option,
521 value, length);
524 return gNetSocketModule.get_option(protocol->socket, level, option, value,
525 length);
529 static status_t
530 link_setsockopt(net_protocol* protocol, int level, int option,
531 const void* value, int length)
533 if (protocol->next != NULL) {
534 return protocol->next->module->setsockopt(protocol, level, option,
535 value, length);
538 return gNetSocketModule.set_option(protocol->socket, level, option,
539 value, length);
543 static status_t
544 link_bind(net_protocol* _protocol, const struct sockaddr* address)
546 LinkProtocol* protocol = (LinkProtocol*)_protocol;
547 return protocol->Bind(address);
551 static status_t
552 link_unbind(net_protocol* _protocol, struct sockaddr* address)
554 LinkProtocol* protocol = (LinkProtocol*)_protocol;
555 return protocol->Unbind();
559 static status_t
560 link_listen(net_protocol* protocol, int count)
562 return B_NOT_SUPPORTED;
566 static status_t
567 link_shutdown(net_protocol* protocol, int direction)
569 return B_NOT_SUPPORTED;
573 static status_t
574 link_send_data(net_protocol* protocol, net_buffer* buffer)
576 return gNetDatalinkModule.send_data(protocol, sDomain, buffer);
580 static status_t
581 link_send_routed_data(net_protocol* protocol, struct net_route* route,
582 net_buffer* buffer)
584 if (buffer->destination->sa_family != buffer->source->sa_family
585 || buffer->destination->sa_family != AF_LINK)
586 return B_BAD_VALUE;
588 // The datalink layer will take care of the framing
590 return gNetDatalinkModule.send_routed_data(route, buffer);
594 static ssize_t
595 link_send_avail(net_protocol* _protocol)
597 LinkProtocol* protocol = (LinkProtocol*)_protocol;
598 if (!protocol->IsBound())
599 return B_ERROR;
601 return protocol->socket->send.buffer_size;
605 static status_t
606 link_read_data(net_protocol* protocol, size_t numBytes, uint32 flags,
607 net_buffer** _buffer)
609 return ((LinkProtocol*)protocol)->Dequeue(flags, _buffer);
613 static ssize_t
614 link_read_avail(net_protocol* protocol)
616 return ((LinkProtocol*)protocol)->AvailableData();
620 static struct net_domain*
621 link_get_domain(net_protocol* protocol)
623 return sDomain;
627 static size_t
628 link_get_mtu(net_protocol* _protocol, const struct sockaddr* address)
630 LinkProtocol* protocol = (LinkProtocol*)_protocol;
631 return protocol->MTU();
635 static status_t
636 link_receive_data(net_buffer* buffer)
638 // We never receive any data this way
639 return B_ERROR;
643 static status_t
644 link_error_received(net_error error, net_buffer* data)
646 // We don't do any error processing
647 return B_ERROR;
651 static status_t
652 link_error_reply(net_protocol* protocol, net_buffer* cause, net_error error,
653 net_error_data* errorData)
655 // We don't do any error processing
656 return B_ERROR;
660 static status_t
661 link_std_ops(int32 op, ...)
663 switch (op) {
664 case B_MODULE_INIT:
665 return register_domain(AF_LINK, "link", NULL, NULL, &sDomain);
667 case B_MODULE_UNINIT:
668 unregister_domain(sDomain);
669 return B_OK;
671 default:
672 return B_ERROR;
677 // #pragma mark -
680 void
681 link_init()
683 register_domain_protocols(AF_LINK, SOCK_DGRAM, 0, "network/stack/link/v1",
684 NULL);
686 // TODO: this should actually be registered for all types (besides local)
687 register_domain_datalink_protocols(AF_LINK, IFT_ETHER,
688 "network/datalink_protocols/ethernet_frame/v1",
689 NULL);
693 net_protocol_module_info gLinkModule = {
695 "network/stack/link/v1",
697 link_std_ops
699 NET_PROTOCOL_ATOMIC_MESSAGES,
701 link_init_protocol,
702 link_uninit_protocol,
703 link_open,
704 link_close,
705 link_free,
706 link_connect,
707 link_accept,
708 link_control,
709 link_getsockopt,
710 link_setsockopt,
711 link_bind,
712 link_unbind,
713 link_listen,
714 link_shutdown,
715 link_send_data,
716 link_send_routed_data,
717 link_send_avail,
718 link_read_data,
719 link_read_avail,
720 link_get_domain,
721 link_get_mtu,
722 link_receive_data,
723 NULL, // deliver_data
724 link_error_received,
725 link_error_reply,
726 NULL, // add_ancillary_data()
727 NULL, // process_ancillary_data()
728 NULL, // process_ancillary_data_no_container()
729 NULL, // send_data_no_buffer()
730 NULL // read_data_no_buffer()