xref: /third_party/NuttX/include/nuttx/net/net.h (revision beacf11b)
1/****************************************************************************
2 * include/nuttx/net/net.h
3 *
4 * Licensed to the Apache Software Foundation (ASF) under one or more
5 * contributor license agreements.  See the NOTICE file distributed with
6 * this work for additional information regarding copyright ownership.  The
7 * ASF licenses this file to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance with the
9 * License.  You may obtain a copy of the License at
10 *
11 *   http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
16 * License for the specific language governing permissions and limitations
17 * under the License.
18 *
19 ****************************************************************************/
20
21#ifndef __INCLUDE_NUTTX_NET_NET_H
22#define __INCLUDE_NUTTX_NET_NET_H
23
24/****************************************************************************
25 * Included Files
26 ****************************************************************************/
27
28#include "vfs_config.h"
29#ifdef LOSCFG_NET_LWIP_SACK
30
31#include <sys/socket.h>
32#include <stdint.h>
33
34#include <stdarg.h>
35#include <semaphore.h>
36#include "lwip/sockets.h"
37
38/****************************************************************************
39 * Pre-processor Definitions
40 ****************************************************************************/
41
42/* Most internal network OS interfaces are not available in the user space in
43 * PROTECTED and KERNEL builds.  In that context, the corresponding
44 * application network interfaces must be used.  The differences between the
45 * two sets of interfaces are:  The internal OS interfaces (1) do not cause
46 * cancellation points and (2) they do not modify the errno variable.
47 *
48 * This is only important when compiling libraries (libc or libnx) that are
49 * used both by the OS (libkc.a and libknx.a) or by the applications
50 * (libuc.a and libunx.a).  The that case, the correct interface must be
51 * used for the build context.
52 *
53 * REVISIT:  In the flat build, the same functions must be used both by
54 * the OS and by applications.  We have to use the normal user functions
55 * in this case or we will fail to set the errno or fail to create the
56 * cancellation point.
57 *
58 * The interfaces accept(), read(), recv(), recvfrom(), write(), send(),
59 * sendto() are all cancellation points.
60 *
61 * REVISIT:  These cancellation points are an issue and may cause
62 * violations:  It use of these internally will cause the calling function
63 * to become a cancellation points!
64 */
65
66#if !defined(CONFIG_BUILD_FLAT) && defined(__KERNEL__)
67#  define _NX_SEND(s,b,l,f)         nx_send(s,b,l,f)
68#  define _NX_RECV(s,b,l,f)         nx_recv(s,b,l,f)
69#  define _NX_RECVFROM(s,b,l,f,a,n) nx_recvfrom(s,b,l,f,a,n)
70#  define _NX_GETERRNO(r)           (-(r))
71#  define _NX_GETERRVAL(r)          (r)
72#else
73#  define _NX_SEND(s,b,l,f)         send(s,b,l,f)
74#  define _NX_RECV(s,b,l,f)         recv(s,b,l,f)
75#  define _NX_RECVFROM(s,b,l,f,a,n) recvfrom(s,b,l,f,a,n)
76#  define _NX_GETERRNO(r)           errno
77#  define _NX_GETERRVAL(r)          (-errno)
78#endif
79
80/* Socket descriptors are the index into the TCB sockets list, offset by the
81 * following amount. This offset is used to distinguish file descriptors from
82 * socket descriptors
83 */
84
85#define __SOCKFD_OFFSET CONFIG_NFILE_DESCRIPTORS
86
87/* Capabilities of a socket */
88
89#define SOCKCAP_NONBLOCKING (1 << 0)  /* Bit 0: Socket supports non-blocking
90                                       *        operation. */
91
92/****************************************************************************
93 * Public Types
94 ****************************************************************************/
95
96/* Link layer type.  This type is used with netdev_register in order to
97 * identify the type of the network driver.
98 */
99
100enum net_lltype_e
101{
102  NET_LL_ETHERNET = 0, /* Ethernet */
103  NET_LL_SLIP,         /* Serial Line Internet Protocol (SLIP) */
104  NET_LL_PPP           /* Point-to-Point Protocol (PPP) */
105};
106
107/* This defines a bitmap big enough for one bit for each socket option */
108
109typedef uint16_t sockopt_t;
110
111/* This defines the storage size of a timeout value.  This effects only
112 * range of supported timeout values.  With an LSB in seciseconds, the
113 * 16-bit maximum of 65535 corresponds to 1 hr 49 min 13.5 sec at decisecond
114 * resolution.
115 */
116
117typedef uint16_t socktimeo_t;
118
119/* This type defines the type of the socket capabilities set */
120
121typedef uint8_t sockcaps_t;
122
123/* This callbacks are socket operations that may be performed on a socket of
124 * a given address family.
125 */
126
127struct file;    /* Forward reference */
128struct socket;  /* Forward reference */
129struct pollfd;  /* Forward reference */
130
131struct sock_intf_s
132{
133  CODE int        (*si_setup)(FAR struct socket *psock, int protocol);
134  CODE sockcaps_t (*si_sockcaps)(FAR struct socket *psock);
135  CODE void       (*si_addref)(FAR struct socket *psock);
136  CODE int        (*si_bind)(FAR struct socket *psock,
137                    FAR const struct sockaddr *addr, socklen_t addrlen);
138  CODE int        (*si_getsockname)(FAR struct socket *psock,
139                    FAR struct sockaddr *addr, FAR socklen_t *addrlen);
140  CODE int        (*si_getpeername)(FAR struct socket *psock,
141                    FAR struct sockaddr *addr, FAR socklen_t *addrlen);
142  CODE int        (*si_listen)(FAR struct socket *psock, int backlog);
143  CODE int        (*si_connect)(FAR struct socket *psock,
144                    FAR const struct sockaddr *addr, socklen_t addrlen);
145  CODE int        (*si_accept)(FAR struct socket *psock,
146                    FAR struct sockaddr *addr, FAR socklen_t *addrlen,
147                    FAR struct socket *newsock);
148  CODE int        (*si_poll)(FAR struct socket *psock,
149                    FAR struct pollfd *fds, bool setup);
150  CODE ssize_t    (*si_send)(FAR struct socket *psock, FAR const void *buf,
151                    size_t len, int flags);
152  CODE ssize_t    (*si_sendto)(FAR struct socket *psock, FAR const void *buf,
153                    size_t len, int flags, FAR const struct sockaddr *to,
154                    socklen_t tolen);
155#ifdef CONFIG_NET_SENDFILE
156  CODE ssize_t    (*si_sendfile)(FAR struct socket *psock,
157                    FAR struct file *infile, FAR off_t *offset,
158                    size_t count);
159#endif
160  CODE ssize_t    (*si_recvfrom)(FAR struct socket *psock, FAR void *buf,
161                    size_t len, int flags, FAR struct sockaddr *from,
162                    FAR socklen_t *fromlen);
163  CODE int        (*si_close)(FAR struct socket *psock);
164#ifdef CONFIG_NET_USRSOCK
165  CODE int        (*si_ioctl)(FAR struct socket *psock, int cmd,
166                    FAR void *arg, size_t arglen);
167#endif
168};
169
170/* Each socket refers to a connection structure of type FAR void *.  Each
171 * socket type will have a different connection structure type bound to its
172 * sockets.  The fields at the the beginning of each connection type must
173 * begin the same content prologue as struct socket_conn_s and must be cast
174 * compatible with struct socket_conn_s.  Connection-specific content may
175 * then follow the common prologue fields.
176 */
177
178struct devif_callback_s;  /* Forward reference */
179
180/* This is the internal representation of a socket reference by a file
181 * descriptor.
182 */
183
184struct devif_callback_s;  /* Forward reference */
185
186struct socket
187{
188  int16_t       s_crefs;     /* Reference count on the socket */
189  uint8_t       s_domain;    /* IP domain: PF_INET, PF_INET6, or PF_PACKET */
190  uint8_t       s_type;      /* Protocol type: Only SOCK_STREAM or
191                              * SOCK_DGRAM */
192  uint8_t       s_flags;     /* See _SF_* definitions */
193
194  /* Socket options */
195
196#ifdef CONFIG_NET_SOCKOPTS
197  sockopt_t     s_options;   /* Selected socket options */
198  socktimeo_t   s_rcvtimeo;  /* Receive timeout value (in deciseconds) */
199  socktimeo_t   s_sndtimeo;  /* Send timeout value (in deciseconds) */
200#ifdef CONFIG_NET_SOLINGER
201  socktimeo_t   s_linger;    /* Linger timeout value (in deciseconds) */
202#endif
203#endif
204
205  void     *s_conn;      /* Connection inherits from struct socket_conn_s */
206
207  /* Socket interface */
208
209  FAR const struct sock_intf_s *s_sockif;
210
211#if defined(CONFIG_NET_TCP_WRITE_BUFFERS) || \
212    defined(CONFIG_NET_UDP_WRITE_BUFFERS)
213  /* Callback instance for TCP send() or UDP sendto() */
214
215  struct devif_callback_s *s_sndcb;
216#endif
217};
218
219/* Callback from netdev_foreach() */
220
221struct net_driver_s; /* Forward reference. Defined in net/netdev.h */
222typedef int (*netdev_callback_t)(struct net_driver_s *dev, void *arg);
223
224#ifdef CONFIG_NET_NOINTS
225
226/* Semaphore based locking for non-interrupt based logic.
227 *
228 * net_lock_t -- Not used.  Only for compatibility
229 */
230
231typedef uint8_t net_lock_t; /* Not really used */
232
233#else
234
235/* Enable/disable locking for interrupt based logic:
236 *
237 * net_lock_t -- The processor specific representation of interrupt state.
238 */
239
240#  define net_lock_t        irqstate_t
241#endif
242
243/****************************************************************************
244 * Public Data
245 ****************************************************************************/
246
247#ifdef __cplusplus
248#if __cplusplus
249extern "C" {
250#endif /* __cplusplus */
251#endif /* __cplusplus */
252
253/****************************************************************************
254 * Public Function Prototypes
255 ****************************************************************************/
256
257/****************************************************************************
258 * Name: net_initialize
259 *
260 * Description:
261 *   This is called from the OS initialization logic at power-up reset in
262 *   order to configure networking data structures.  This is called prior
263 *   to platform-specific driver initialization so that the networking
264 *   subsystem is prepared to deal with network driver initialization
265 *   actions.
266 *
267 *   Actions performed in this initialization phase assume that base OS
268 *   facilities such as semaphores are available but this logic cannot
269 *   depend upon OS resources such as interrupts or timers which are not
270 *   yet available.
271 *
272 * Input Parameters:
273 *   None
274 *
275 * Returned Value:
276 *   None
277 *
278 ****************************************************************************/
279
280void net_initialize(void);
281
282/****************************************************************************
283 * Critical section management.
284 *
285 * Re-entrant mutex based locking of the network is supported:
286 *
287 *   net_lock()        - Locks the network via a re-entrant mutex.
288 *   net_unlock()      - Unlocks the network.
289 *   net_lockedwait()  - Like pthread_cond_wait() except releases the
290 *                       network momentarily to wait on another semaphore.
291 *   net_ioballoc()    - Like iob_alloc() except releases the network
292 *                       momentarily to wait for an IOB to become
293 *                       available.
294 *
295 ****************************************************************************/
296
297/****************************************************************************
298 * Name: net_lock
299 *
300 * Description:
301 *   Take the network lock
302 *
303 * Input Parameters:
304 *   None
305 *
306 * Returned Value:
307 *   Zero (OK) is returned on success; a negated errno value is returned on
308 *   failured (probably -ECANCELED).
309 *
310 ****************************************************************************/
311
312int net_lock(void);
313
314/****************************************************************************
315 * Name: net_unlock
316 *
317 * Description:
318 *   Release the network lock.
319 *
320 * Input Parameters:
321 *   None
322 *
323 * Returned Value:
324 *   None
325 *
326 ****************************************************************************/
327
328void net_unlock(void);
329
330/****************************************************************************
331 * Name: net_timedwait
332 *
333 * Description:
334 *   Atomically wait for sem (or a timeout( while temporarily releasing
335 *   the lock on the network.
336 *
337 *   Caution should be utilized.  Because the network lock is relinquished
338 *   during the wait, there could changes in the network state that occur
339 *   before the lock is recovered.  Your design should account for this
340 *   possibility.
341 *
342 * Input Parameters:
343 *   sem     - A reference to the semaphore to be taken.
344 *   abstime - The absolute time to wait until a timeout is declared.
345 *
346 * Returned Value:
347 *   Zero (OK) is returned on success; a negated errno value is returned on
348 *   any failure.
349 *
350 ****************************************************************************/
351
352struct timespec;
353int net_timedwait(sem_t *sem, FAR const struct timespec *abstime);
354
355/****************************************************************************
356 * Name: net_lockedwait
357 *
358 * Description:
359 *   Atomically wait for sem while temporarily releasing the network lock.
360 *
361 *   Caution should be utilized.  Because the network lock is relinquished
362 *   during the wait, there could changes in the network state that occur
363 *   before the lock is recovered.  Your design should account for this
364 *   possibility.
365 *
366 * Input Parameters:
367 *   sem - A reference to the semaphore to be taken.
368 *
369 * Returned Value:
370 *   Zero (OK) is returned on success; a negated errno value is returned on
371 *   any failure.
372 *
373 ****************************************************************************/
374
375int net_lockedwait(sem_t *sem);
376
377/****************************************************************************
378 * Name: net_ioballoc
379 *
380 * Description:
381 *   Allocate an IOB.  If no IOBs are available, then atomically wait for
382 *   for the IOB while temporarily releasing the lock on the network.
383 *
384 *   Caution should be utilized.  Because the network lock is relinquished
385 *   during the wait, there could changes in the network state that occur
386 *   before the lock is recovered.  Your design should account for this
387 *   possibility.
388 *
389 * Input Parameters:
390 *   throttled - An indication of the IOB allocation is "throttled"
391 *
392 * Returned Value:
393 *   A pointer to the newly allocated IOB is returned on success.  NULL is
394 *   returned on any allocation failure.
395 *
396 ****************************************************************************/
397
398#ifdef CONFIG_MM_IOB
399FAR struct iob_s *net_ioballoc(bool throttled, enum iob_user_e consumerid);
400#endif
401
402/****************************************************************************
403 * Name: net_setipid
404 *
405 * Description:
406 *   This function may be used at boot time to set the initial ip_id.
407 *
408 * Assumptions:
409 *
410 ****************************************************************************/
411
412void net_setipid(uint16_t id);
413
414/****************************************************************************
415 * Name: net_checksd
416 *
417 * Description:
418 *   Check if the socket descriptor is valid for the provided TCB and if it
419 *   supports the requested access.  This trivial operation is part of the
420 *   fdopen() operation when the fdopen() is performed on a socket descriptor.
421 *   It simply performs some sanity checking before permitting the socket
422 *   descriptor to be wrapped as a C FILE stream.
423 *
424 ****************************************************************************/
425
426int net_checksd(int fd, int oflags);
427
428
429
430
431/****************************************************************************
432 * Name: sockfd_socket
433 *
434 * Description:
435 *   Given a socket descriptor, return the underlying socket structure.
436 *
437 * Input Parameters:
438 *   sockfd - The socket descriptor index o use.
439 *
440 * Returned Value:
441 *   On success, a reference to the socket structure associated with the
442 *   the socket descriptor is returned.  NULL is returned on any failure.
443 *
444 ****************************************************************************/
445
446struct socket *sockfd_socket(int sockfd);
447
448/****************************************************************************
449 * Name: psock_socket
450 *
451 * Description:
452 *   socket() creates an endpoint for communication and returns a socket
453 *   structure.
454 *
455 * Input Parameters:
456 *   domain   (see sys/socket.h)
457 *   type     (see sys/socket.h)
458 *   protocol (see sys/socket.h)
459 *   psock    A pointer to a user allocated socket structure to be
460 *            initialized.
461 *
462 * Returned Value:
463 *  Returns zero (OK) on success.  On failure, it returns a negated errno
464 *  value to indicate the nature of the error:
465 *
466 *   EACCES
467 *     Permission to create a socket of the specified type and/or protocol
468 *     is denied.
469 *   EAFNOSUPPORT
470 *     The implementation does not support the specified address family.
471 *   EINVAL
472 *     Unknown protocol, or protocol family not available.
473 *   EMFILE
474 *     Process file table overflow.
475 *   ENFILE
476 *     The system limit on the total number of open files has been reached.
477 *   ENOBUFS or ENOMEM
478 *     Insufficient memory is available. The socket cannot be created until
479 *     sufficient resources are freed.
480 *   EPROTONOSUPPORT
481 *     The protocol type or the specified protocol is not supported within
482 *     this domain.
483 *
484 * Assumptions:
485 *
486 ****************************************************************************/
487
488int psock_socket(int domain, int type, int protocol,
489                 struct socket *psock);
490
491/****************************************************************************
492 * Name: net_close
493 *
494 * Description:
495 *   Performs the close operation on socket descriptors
496 *
497 * Input Parameters:
498 *   sockfd   Socket descriptor of socket
499 *
500 * Returned Value:
501 *  Returns zero (OK) on success.  On failure, it returns a negated errno
502 *  value to indicate the nature of the error.
503 *
504 * Assumptions:
505 *
506 ****************************************************************************/
507
508int net_close(int sockfd);
509
510/****************************************************************************
511 * Name: psock_close
512 *
513 * Description:
514 *   Performs the close operation on a socket instance
515 *
516 * Input Parameters:
517 *   psock   Socket instance
518 *
519 * Returned Value:
520 *  Returns zero (OK) on success.  On failure, it returns a negated errno
521 *  value to indicate the nature of the error.
522 *
523 ****************************************************************************/
524
525int psock_close(struct socket *psock);
526
527/****************************************************************************
528 * Name: psock_bind
529 *
530 * Description:
531 *   bind() gives the socket 'psock' the local address 'addr'. 'addr' is
532 *   'addrlen' bytes long. Traditionally, this is called "assigning a name to
533 *   a socket." When a socket is created with socket, it exists in a name
534 *   space (address family) but has no name assigned.
535 *
536 * Input Parameters:
537 *   psock    Socket structure of the socket to bind
538 *   addr     Socket local address
539 *   addrlen  Length of 'addr'
540 *
541 * Returned Value:
542 *  Returns zero (OK) on success.  On failure, it returns a negated errno
543 *  value to indicate the nature of the error.
544 *
545 *   EACCES
546 *     The address is protected, and the user is not the superuser.
547 *   EADDRINUSE
548 *     The given address is already in use.
549 *   EINVAL
550 *     The socket is already bound to an address.
551 *   ENOTSOCK
552 *     psock is a descriptor for a file, not a socket.
553 *
554 * Assumptions:
555 *
556 ****************************************************************************/
557
558struct sockaddr; /* Forward reference. See nuttx/include/sys/socket.h */
559int psock_bind(struct socket *psock, const struct sockaddr *addr,
560               socklen_t addrlen);
561
562/****************************************************************************
563 * Name: psock_listen
564 *
565 * Description:
566 *   To accept connections, a socket is first created with psock_socket(), a
567 *   willingness to accept incoming connections and a queue limit for
568 *   incoming connections are specified with psock_listen(), and then the
569 *   connections are accepted with psock_accept(). The psock_listen() call
570 *   applies only to sockets of type SOCK_STREAM or SOCK_SEQPACKET.
571 *
572 * Input Parameters:
573 *   psock    Reference to an internal, boound socket structure.
574 *   backlog  The maximum length the queue of pending connections may grow.
575 *            If a connection request arrives with the queue full, the client
576 *            may receive an error with an indication of ECONNREFUSED or,
577 *            if the underlying protocol supports retransmission, the request
578 *            may be ignored so that retries succeed.
579 *
580 * Returned Value:
581 *  Returns zero (OK) on success.  On failure, it returns a negated errno
582 *  value to indicate the nature of the error.
583 *
584 *   EADDRINUSE
585 *     Another socket is already listening on the same port.
586 *   EOPNOTSUPP
587 *     The socket is not of a type that supports the listen operation.
588 *
589 ****************************************************************************/
590
591int psock_listen(FAR struct socket *psock, int backlog);
592
593/****************************************************************************
594 * Name: psock_accept
595 *
596 * Description:
597 *   The psock_accept function is used with connection-based socket types
598 *   (SOCK_STREAM, SOCK_SEQPACKET and SOCK_RDM). It extracts the first
599 *   connection request on the queue of pending connections, creates a new
600 *   connected socket with mostly the same properties as 'sockfd', and
601 *   allocates a new socket descriptor for the socket, which is returned. The
602 *   newly created socket is no longer in the listening state. The original
603 *   socket 'sockfd' is unaffected by this call.  Per file descriptor flags
604 *   are not inherited across an psock_accept.
605 *
606 *   The 'sockfd' argument is a socket descriptor that has been created with
607 *   socket(), bound to a local address with bind(), and is listening for
608 *   connections after a call to listen().
609 *
610 *   On return, the 'addr' structure is filled in with the address of the
611 *   connecting entity. The 'addrlen' argument initially contains the size
612 *   of the structure pointed to by 'addr'; on return it will contain the
613 *   actual length of the address returned.
614 *
615 *   If no pending connections are present on the queue, and the socket is
616 *   not marked as non-blocking, psock_accept blocks the caller until a
617 *   connection is present. If the socket is marked non-blocking and no
618 *   pending connections are present on the queue, psock_accept returns
619 *   EAGAIN.
620 *
621 * Input Parameters:
622 *   psock    Reference to the listening socket structure
623 *   addr     Receives the address of the connecting client
624 *   addrlen  Input: allocated size of 'addr', Return: returned size of 'addr'
625 *   newsock  Location to return the accepted socket information.
626 *
627 * Returned Value:
628 *  Returns zero (OK) on success.  On failure, it returns a negated errno
629 *  value to indicate the nature of the error.
630 *
631 * EAGAIN or EWOULDBLOCK
632 *   The socket is marked non-blocking and no connections are present to
633 *   be accepted.
634 * EOPNOTSUPP
635 *   The referenced socket is not of type SOCK_STREAM.
636 * EINTR
637 *   The system call was interrupted by a signal that was caught before
638 *   a valid connection arrived.
639 * ECONNABORTED
640 *   A connection has been aborted.
641 * EINVAL
642 *   Socket is not listening for connections.
643 * EMFILE
644 *   The per-process limit of open file descriptors has been reached.
645 * ENFILE
646 *   The system maximum for file descriptors has been reached.
647 * EFAULT
648 *   The addr parameter is not in a writable part of the user address
649 *   space.
650 * ENOBUFS or ENOMEM
651 *   Not enough free memory.
652 * EPROTO
653 *   Protocol error.
654 * EPERM
655 *   Firewall rules forbid connection.
656 *
657 ****************************************************************************/
658
659int psock_accept(FAR struct socket *psock, FAR struct sockaddr *addr,
660                 FAR socklen_t *addrlen, FAR struct socket *newsock);
661
662/****************************************************************************
663 * Name: psock_connect
664 *
665 * Description:
666 *   connect() connects the socket referred to by the structure 'psock'
667 *   to the address specified by 'addr'. The addrlen argument specifies
668 *   the size of 'addr'.  The format of the address in 'addr' is
669 *   determined by the address space of the socket 'psock'.
670 *
671 *   If the socket 'psock' is of type SOCK_DGRAM then 'addr' is the address
672 *   to which datagrams are sent by default, and the only address from which
673 *   datagrams are received. If the socket is of type SOCK_STREAM or
674 *   SOCK_SEQPACKET, this call attempts to make a connection to the socket
675 *   that is bound to the address specified by 'addr'.
676 *
677 *   Generally, connection-based protocol sockets may successfully connect()
678 *   only once; connectionless protocol sockets may use connect() multiple
679 *   times to change their association.  Connectionless sockets may dissolve
680 *   the association by connecting to an address with the sa_family member of
681 *   sockaddr set to AF_UNSPEC.
682 *
683 * Input Parameters:
684 *   psock     Pointer to a socket structure initialized by psock_socket()
685 *   addr      Server address (form depends on type of socket)
686 *   addrlen   Length of actual 'addr'
687 *
688 * Returned Value:
689 *  Returns zero (OK) on success.  On failure, it returns a negated errno
690 *  value to indicate the nature of the error.
691 *
692 *     EACCES, EPERM
693 *       The user tried to connect to a broadcast address without having the
694 *       socket broadcast flag enabled or the connection request failed
695 *       because of a local firewall rule.
696 *     EADDRINUSE
697 *       Local address is already in use.
698 *     EAFNOSUPPORT
699 *       The passed address didn't have the correct address family in its
700 *       sa_family field.
701 *     EAGAIN
702 *       No more free local ports or insufficient entries in the routing
703 *       cache.
704 *     EALREADY
705 *       The socket is non-blocking and a previous connection attempt has
706 *       not yet been completed.
707 *     EBADF
708 *       The file descriptor is not a valid index in the descriptor table.
709 *     ECONNREFUSED
710 *       No one listening on the remote address.
711 *     EFAULT
712 *       The socket structure address is outside the user's address space.
713 *     EINPROGRESS
714 *       The socket is non-blocking and the connection cannot be completed
715 *       immediately.
716 *     EINTR
717 *       The system call was interrupted by a signal that was caught.
718 *     EISCONN
719 *       The socket is already connected.
720 *     ENETUNREACH
721 *       Network is unreachable.
722 *     ENOTSOCK
723 *       The file descriptor is not associated with a socket.
724 *     ETIMEDOUT
725 *       Timeout while attempting connection. The server may be too busy
726 *       to accept new connections.
727 *
728 * Assumptions:
729 *
730 ****************************************************************************/
731
732int psock_connect(struct socket *psock, const struct sockaddr *addr,
733                  socklen_t addrlen);
734
735/****************************************************************************
736 * Name: psock_send
737 *
738 * Description:
739 *   The psock_send() call may be used only when the socket is in a
740 *   connected state (so that the intended recipient is known).  This is an
741 *   internal OS interface.  It is functionally equivalent to send() except
742 *   that:
743 *
744 *   - It is not a cancellation point,
745 *   - It does not modify the errno variable, and
746 *   - I accepts the internal socket structure as an input rather than an
747 *     task-specific socket descriptor.
748 *
749 *   See comments with send() for more a more complete description of the
750 *   functionality.
751 *
752 * Input Parameters:
753 *   psock - An instance of the internal socket structure.
754 *   buf   - Data to send
755 *   len   - Length of data to send
756 *   flags - Send flags
757 *
758 * Returned Value:
759 *   On success, returns the number of characters sent.  On any failure, a
760 *   negated errno value is returned (See comments with send() for a list
761 *   of the appropriate errno value).
762 *
763 ****************************************************************************/
764
765ssize_t psock_send(FAR struct socket *psock, const void *buf, size_t len,
766                   int flags);
767
768/****************************************************************************
769 * Name: nx_send
770 *
771 * Description:
772 *   The nx_send() call may be used only when the socket is in a
773 *   connected state (so that the intended recipient is known).  This is an
774 *   internal OS interface.  It is functionally equivalent to send() except
775 *   that:
776 *
777 *   - It is not a cancellation point, and
778 *   - It does not modify the errno variable.
779 *
780 *   See comments with send() for more a more complete description of the
781 *   functionality.
782 *
783 * Input Parameters:
784 *   sockfd - Socket descriptor of the socket
785 *   buf    - Data to send
786 *   len    - Length of data to send
787 *   flags  - Send flags
788 *
789 * Returned Value:
790 *   On success, returns the number of characters sent.  On any failure, a
791 *   negated errno value is returned (See comments with send() for a list
792 *   of the appropriate errno value).
793 *
794 ****************************************************************************/
795
796ssize_t nx_send(int sockfd, FAR const void *buf, size_t len, int flags);
797
798/****************************************************************************
799 * Name: psock_sendto
800 *
801 * Description:
802 *   If sendto() is used on a connection-mode (SOCK_STREAM, SOCK_SEQPACKET)
803 *   socket, the parameters to and 'tolen' are ignored (and the error EISCONN
804 *   may be returned when they are not NULL and 0), and the error ENOTCONN is
805 *   returned when the socket was not actually connected.
806 *
807 * Input Parameters:
808 *   psock    A pointer to a NuttX-specific, internal socket structure
809 *   buf      Data to send
810 *   len      Length of data to send
811 *   flags    Send flags
812 *   to       Address of recipient
813 *   tolen    The length of the address structure
814 *
815 * Returned Value:
816 *   On success, returns the number of characters sent.  On any failure, a
817 *   negated errno value is returned.  One of:
818 *
819 *   EAGAIN or EWOULDBLOCK
820 *     The socket is marked non-blocking and the requested operation
821 *     would block.
822 *   EBADF
823 *     An invalid descriptor was specified.
824 *   ECONNRESET
825 *     Connection reset by peer.
826 *   EDESTADDRREQ
827 *     The socket is not connection-mode, and no peer address is set.
828 *   EFAULT
829 *      An invalid user space address was specified for a parameter.
830 *   EINTR
831 *      A signal occurred before any data was transmitted.
832 *   EINVAL
833 *      Invalid argument passed.
834 *   EISCONN
835 *     The connection-mode socket was connected already but a recipient
836 *     was specified. (Now either this error is returned, or the recipient
837 *     specification is ignored.)
838 *   EMSGSIZE
839 *     The socket type requires that message be sent atomically, and the
840 *     size of the message to be sent made this impossible.
841 *   ENOBUFS
842 *     The output queue for a network interface was full. This generally
843 *     indicates that the interface has stopped sending, but may be
844 *     caused by transient congestion.
845 *   ENOMEM
846 *     No memory available.
847 *   ENOTCONN
848 *     The socket is not connected, and no target has been given.
849 *   ENOTSOCK
850 *     The argument s is not a socket.
851 *   EOPNOTSUPP
852 *     Some bit in the flags argument is inappropriate for the socket
853 *     type.
854 *   EPIPE
855 *     The local end has been shut down on a connection oriented socket.
856 *     In this case the process will also receive a SIGPIPE unless
857 *     MSG_NOSIGNAL is set.
858 *
859 ****************************************************************************/
860
861ssize_t psock_sendto(struct socket *psock, const void *buf,
862                     size_t len, int flags, const struct sockaddr *to,
863                     socklen_t tolen);
864
865/****************************************************************************
866 * Name: psock_recvfrom
867 *
868 * Description:
869 *   psock_recvfrom() receives messages from a socket, and may be used to
870 *   receive data on a socket whether or not it is connection-oriented.
871 *   This is an internal OS interface.  It is functionally equivalent to
872 *   recvfrom() except that:
873 *
874 *   - It is not a cancellation point,
875 *   - It does not modify the errno variable, and
876 *   - I accepts the internal socket structure as an input rather than an
877 *     task-specific socket descriptor.
878 *
879 * Input Parameters:
880 *   psock   - A pointer to a NuttX-specific, internal socket structure
881 *   buf     - Buffer to receive data
882 *   len     - Length of buffer
883 *   flags   - Receive flags
884 *   from    - Address of source (may be NULL)
885 *   fromlen - The length of the address structure
886 *
887 * Returned Value:
888 *   On success, returns the number of characters sent.  If no data is
889 *   available to be received and the peer has performed an orderly shutdown,
890 *   recv() will return 0.  Otherwise, on any failure, a negated errno value
891 *   is returned (see comments with send() for a list of appropriate errno
892 *   values).
893 *
894 ****************************************************************************/
895
896ssize_t psock_recvfrom(struct socket *psock, void *buf, size_t len,
897                       int flags, struct sockaddr *from,
898                       socklen_t *fromlen);
899
900/* recv using the underlying socket structure */
901
902#define psock_recv(psock,buf,len,flags) \
903  psock_recvfrom(psock,buf,len,flags,NULL,0)
904
905/****************************************************************************
906 * Name: nx_recvfrom
907 *
908 * Description:
909 *   nx_recvfrom() receives messages from a socket, and may be used to
910 *   receive data on a socket whether or not it is connection-oriented.
911 *   This is an internal OS interface.  It is functionally equivalent to
912 *   recvfrom() except that:
913 *
914 *   - It is not a cancellation point, and
915 *   - It does not modify the errno variable.
916 *
917 * Input Parameters:
918 *   sockfd  - Socket descriptor of socket
919 *   buf     - Buffer to receive data
920 *   len     - Length of buffer
921 *   flags   - Receive flags
922 *   from    - Address of source (may be NULL)
923 *   fromlen - The length of the address structure
924 *
925 * Returned Value:
926 *   On success, returns the number of characters sent.  If no data is
927 *   available to be received and the peer has performed an orderly shutdown,
928 *   recv() will return 0.  Otherwise, on any failure, a negated errno value
929 *   is returned (see comments with send() for a list of appropriate errno
930 *   values).
931 *
932 ****************************************************************************/
933
934ssize_t nx_recvfrom(int sockfd, FAR void *buf, size_t len, int flags,
935                    FAR struct sockaddr *from, FAR socklen_t *fromlen);
936
937/* Internal version os recv */
938
939#define nx_recv(psock,buf,len,flags) nx_recvfrom(psock,buf,len,flags,NULL,0)
940
941/****************************************************************************
942 * Name: psock_getsockopt
943 *
944 * Description:
945 *   getsockopt() retrieve thse value for the option specified by the
946 *   'option' argument for the socket specified by the 'psock' argument. If
947 *   the size of the option value is greater than 'value_len', the value
948 *   stored in the object pointed to by the 'value' argument will be silently
949 *   truncated. Otherwise, the length pointed to by the 'value_len' argument
950 *   will be modified to indicate the actual length of the'value'.
951 *
952 *   The 'level' argument specifies the protocol level of the option. To
953 *   retrieve options at the socket level, specify the level argument as
954 *   SOL_SOCKET.
955 *
956 *   See <sys/socket.h> a complete list of values for the 'option' argument.
957 *
958 * Input Parameters:
959 *   psock     Socket structure of the socket to query
960 *   level     Protocol level to set the option
961 *   option    identifies the option to get
962 *   value     Points to the argument value
963 *   value_len The length of the argument value
964 *
965 * Returned Value:
966 *  Returns zero (OK) on success.  On failure, it returns a negated errno
967 *  value to indicate the nature of the error:
968 *
969 *  EINVAL
970 *    The specified option is invalid at the specified socket 'level' or the
971 *    socket has been shutdown.
972 *  ENOPROTOOPT
973 *    The 'option' is not supported by the protocol.
974 *  ENOTSOCK
975 *    The 'psock' argument does not refer to a socket.
976 *  ENOBUFS
977 *    Insufficient resources are available in the system to complete the
978 *    call.
979 *
980 ****************************************************************************/
981
982int psock_getsockopt(struct socket *psock, int level, int option,
983                     void *value, socklen_t *value_len);
984
985/****************************************************************************
986 * Name: psock_setsockopt
987 *
988 * Description:
989 *   psock_setsockopt() sets the option specified by the 'option' argument,
990 *   at the protocol level specified by the 'level' argument, to the value
991 *   pointed to by the 'value' argument for the socket on the 'psock'
992 *   argument.
993 *
994 *   The 'level' argument specifies the protocol level of the option. To set
995 *   options at the socket level, specify the level argument as SOL_SOCKET.
996 *
997 *   See <sys/socket.h> a complete list of values for the 'option' argument.
998 *
999 * Input Parameters:
1000 *   psock     Socket structure of socket to operate on
1001 *   level     Protocol level to set the option
1002 *   option    identifies the option to set
1003 *   value     Points to the argument value
1004 *   value_len The length of the argument value
1005 *
1006 * Returned Value:
1007 *  Returns zero (OK) on success.  On failure, it returns a negated errno
1008 *  value to indicate the nature of the error:
1009 *
1010 *  EDOM
1011 *    The send and receive timeout values are too big to fit into the
1012 *    timeout fields in the socket structure.
1013 *  EINVAL
1014 *    The specified option is invalid at the specified socket 'level' or the
1015 *    socket has been shut down.
1016 *  EISCONN
1017 *    The socket is already connected, and a specified option cannot be set
1018 *    while the socket is connected.
1019 *  ENOPROTOOPT
1020 *    The 'option' is not supported by the protocol.
1021 *  ENOTSOCK
1022 *    The 'sockfd' argument does not refer to a socket.
1023 *  ENOMEM
1024 *    There was insufficient memory available for the operation to complete.
1025 *  ENOBUFS
1026 *    Insufficient resources are available in the system to complete the
1027 *    call.
1028 *
1029 * Assumptions:
1030 *
1031 ****************************************************************************/
1032
1033int psock_setsockopt(struct socket *psock, int level, int option,
1034                     const void *value, socklen_t value_len);
1035
1036/****************************************************************************
1037 * Name: psock_getsockname
1038 *
1039 * Description:
1040 *   The psock_getsockname() function retrieves the locally-bound name of the
1041 *   the specified socket, stores this address in the sockaddr structure
1042 *   pointed to by the 'addr' argument, and stores the length of this
1043 *   address in the object pointed to by the 'addrlen' argument.
1044 *
1045 *   If the actual length of the address is greater than the length of the
1046 *   supplied sockaddr structure, the stored address will be truncated.
1047 *
1048 *   If the socket has not been bound to a local name, the value stored in
1049 *   the object pointed to by address is unspecified.
1050 *
1051 * Parameters:
1052 *   psock    Socket structure of socket to operate on
1053 *   addr     sockaddr structure to receive data [out]
1054 *   addrlen  Length of sockaddr structure [in/out]
1055 *
1056 * Returned Value:
1057 *   On success, 0 is returned, the 'addr' argument points to the address
1058 *   of the socket, and the 'addrlen' argument points to the length of the
1059 *   address. Otherwise, -1 is returned and errno is set to indicate the
1060 *   error.  Possible errno values that may be returned include:
1061 *
1062 *   EBADF      - The socket argument is not a valid file descriptor.
1063 *   ENOTSOCK   - The socket argument does not refer to a socket.
1064 *   EOPNOTSUPP - The operation is not supported for this socket's protocol.
1065 *   ENOTCONN   - The socket is not connected or otherwise has not had the
1066 *                peer pre-specified.
1067 *   EINVAL     - The socket has been shut down.
1068 *   ENOBUFS    - Insufficient resources were available in the system to
1069 *                complete the function.
1070 *
1071 ****************************************************************************/
1072
1073int psock_getsockname(FAR struct socket *psock, FAR struct sockaddr *addr,
1074                      FAR socklen_t *addrlen);
1075
1076/****************************************************************************
1077 * Name: psock_getpeername
1078 *
1079 * Description:
1080 *   The psock_getpeername() function retrieves the remote-connected name of
1081 *   the specified socket, stores this address in the sockaddr structure
1082 *   pointed to by the 'addr' argument, and stores the length of this address
1083 *   in the object pointed to by the 'addrlen' argument.
1084 *
1085 *   If the actual length of the address is greater than the length of the
1086 *   supplied sockaddr structure, the stored address will be truncated.
1087 *
1088 *   If the socket has not been bound to a local name, the value stored in
1089 *   the object pointed to by address is unspecified.
1090 *
1091 * Parameters:
1092 *   psock    Socket structure of socket to operate on
1093 *   addr     sockaddr structure to receive data [out]
1094 *   addrlen  Length of sockaddr structure [in/out]
1095 *
1096 * Returned Value:
1097 *   On success, 0 is returned, the 'addr' argument points to the address
1098 *   of the socket, and the 'addrlen' argument points to the length of the
1099 *   address. Otherwise, -1 is returned and errno is set to indicate the
1100 *   error.  Possible errno values that may be returned include:
1101 *
1102 *   EBADF      - The socket argument is not a valid file descriptor.
1103 *   ENOTSOCK   - The socket argument does not refer to a socket.
1104 *   EOPNOTSUPP - The operation is not supported for this socket's protocol.
1105 *   ENOTCONN   - The socket is not connected or otherwise has not had the
1106 *                peer pre-specified.
1107 *   EINVAL     - The socket has been shut down.
1108 *   ENOBUFS    - Insufficient resources were available in the system to
1109 *                complete the function.
1110 *
1111 ****************************************************************************/
1112
1113int psock_getpeername(FAR struct socket *psock, FAR struct sockaddr *addr,
1114                      FAR socklen_t *addrlen);
1115
1116/****************************************************************************
1117 * Name: psock_ioctl
1118 *
1119 * Description:
1120 *   Perform network device specific operations.
1121 *
1122 * Input Parameters:
1123 *   psock    A pointer to a NuttX-specific, internal socket structure
1124 *   cmd      The ioctl command
1125 *   arg      The argument of the ioctl cmd
1126 *
1127 * Returned Value:
1128 *   A non-negative value is returned on success; a negated errno value is
1129 *   returned on any failure to indicate the nature of the failure:
1130 *
1131 *   EBADF
1132 *     'psock' is not a valid, connected socket structure.
1133 *   EFAULT
1134 *     'arg' references an inaccessible memory area.
1135 *   ENOTTY
1136 *     'cmd' not valid.
1137 *   EINVAL
1138 *     'arg' is not valid.
1139 *   ENOTTY
1140 *     'sockfd' is not associated with a network device.
1141 *   ENOTTY
1142 *      The specified request does not apply to the kind of object that the
1143 *      descriptor 'sockfd' references.
1144 *
1145 ****************************************************************************/
1146
1147int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg);
1148
1149/****************************************************************************
1150 * Name: netdev_ioctl
1151 *
1152 * Description:
1153 *   Perform network device specific operations.
1154 *
1155 * Input Parameters:
1156 *   sockfd   Socket descriptor of device
1157 *   cmd      The ioctl command
1158 *   arg      The argument of the ioctl cmd
1159 *
1160 * Returned Value:
1161 *   A non-negative value is returned on success; a negated errno value is
1162 *   returned on any failure to indicate the nature of the failure:
1163 *
1164 *   EBADF
1165 *     'sockfd' is not a valid socket descriptor.
1166 *   EFAULT
1167 *     'arg' references an inaccessible memory area.
1168 *   ENOTTY
1169 *     'cmd' not valid.
1170 *   EINVAL
1171 *     'arg' is not valid.
1172 *   ENOTTY
1173 *     'sockfd' is not associated with a network device.
1174 *   ENOTTY
1175 *      The specified request does not apply to the kind of object that the
1176 *      descriptor 'sockfd' references.
1177 *
1178 ****************************************************************************/
1179
1180int netdev_ioctl(int sockfd, int cmd, unsigned long arg);
1181
1182/****************************************************************************
1183 * Name: psock_poll
1184 *
1185 * Description:
1186 *   The standard poll() operation redirects operations on socket descriptors
1187 *   to this function.
1188 *
1189 * Input Parameters:
1190 *   psock - An instance of the internal socket structure.
1191 *   fds   - The structure describing the events to be monitored, OR NULL if
1192 *           this is a request to stop monitoring events.
1193 *   setup - true: Setup up the poll; false: Teardown the poll
1194 *
1195 * Returned Value:
1196 *  0: Success; Negated errno on failure
1197 *
1198 ****************************************************************************/
1199
1200struct pollfd; /* Forward reference -- see poll.h */
1201
1202int psock_poll(struct socket *psock, struct pollfd *fds, bool setup);
1203
1204/****************************************************************************
1205 * Name: net_poll
1206 *
1207 * Description:
1208 *   The standard poll() operation redirects operations on socket descriptors
1209 *   to this function.
1210 *
1211 * Input Parameters:
1212 *   fd    - The socket descriptor of interest
1213 *   fds   - The structure describing the events to be monitored, OR NULL if
1214 *           this is a request to stop monitoring events.
1215 *   setup - true: Setup up the poll; false: Teardown the poll
1216 *
1217 * Returned Value:
1218 *  0: Success; Negated errno on failure
1219 *
1220 ****************************************************************************/
1221
1222struct pollfd; /* Forward reference -- see poll.h */
1223
1224int net_poll(int sockfd, struct pollfd *fds, bool setup);
1225
1226/****************************************************************************
1227 * Name: psock_dupsd
1228 *
1229 * Description:
1230 *   Clone a socket descriptor to an arbitray descriptor number.  If file
1231 *   descriptors are implemented, then this is called by dup() for the case
1232 *   of socket file descriptors.  If file descriptors are not implemented,
1233 *   then this function IS dup().
1234 *
1235 * Returned Value:
1236 *   On success, returns the number of characters sent.  On any error,
1237 *   a negated errno value is returned:.
1238 *
1239 ****************************************************************************/
1240
1241int psock_dupsd(FAR struct socket *psock, int minsd);
1242
1243/****************************************************************************
1244 * Name: net_dupsd
1245 *
1246 * Description:
1247 *   Clone a socket descriptor to an arbitray descriptor number.  If file
1248 *   descriptors are implemented, then this is called by dup() for the case
1249 *   of socket file descriptors.  If file descriptors are not implemented,
1250 *   then this function IS dup().
1251 *
1252 * Returned Value:
1253 *   On success, returns the number of characters sent.  On any error,
1254 *   a negated errno value is returned:.
1255 *
1256 ****************************************************************************/
1257
1258int net_dupsd(int sockfd, int minsd);
1259
1260/****************************************************************************
1261 * Name: net_dupsd2
1262 *
1263 * Description:
1264 *   Clone a socket descriptor to an arbitray descriptor number.  If file
1265 *   descriptors are implemented, then this is called by dup2() for the case
1266 *   of socket file descriptors.  If file descriptors are not implemented,
1267 *   then this function IS dup2().
1268 *
1269 * Returned Value:
1270 *   On success, returns the number of characters sent.  On any error,
1271 *   a negated errno value is returned:.
1272 *
1273 ****************************************************************************/
1274
1275int net_dupsd2(int sockfd1, int sockfd2);
1276
1277/****************************************************************************
1278 * Name: net_fstat
1279 *
1280 * Description:
1281 *   Performs fstat operations on socket
1282 *
1283 * Input Parameters:
1284 *   sockfd - Socket descriptor of the socket to operate on
1285 *   bug    - Caller-provided location in which to return the fstat data
1286 *
1287 * Returned Value:
1288 *   Zero (OK) is returned on success; a negated errno value is returned on
1289 *   any failure to indicate the nature of the failure.
1290 *
1291 ****************************************************************************/
1292
1293struct stat;  /* Forward reference.  See sys/stat.h */
1294
1295int net_fstat(int sockfd, FAR struct stat *buf);
1296
1297/****************************************************************************
1298 * Name: net_clone
1299 *
1300 * Description:
1301 *   Performs the low level, common portion of net_dupsd() and net_dupsd2()
1302 *
1303 ****************************************************************************/
1304
1305int net_clone(struct socket *psock1, struct socket *psock2);
1306
1307/****************************************************************************
1308 * Name: net_sendfile
1309 *
1310 * Description:
1311 *   The send() call may be used only when the socket is in a connected state
1312 *   (so that the intended recipient is known). The only difference between
1313 *   send() and write() is the presence of flags. With zero flags parameter,
1314 *   send() is equivalent to write(). Also, send(sockfd,buf,len,flags) is
1315 *   equivalent to sendto(sockfd,buf,len,flags,NULL,0).
1316 *
1317 * Input Parameters:
1318 *   psock    An instance of the internal socket structure.
1319 *   buf      Data to send
1320 *   len      Length of data to send
1321 *   flags    Send flags
1322 *
1323 * Returned Value:
1324 *   On success, returns the number of characters sent.  On  error,
1325 *   -1 is returned, and errno is set appropriately:
1326 *
1327 *   EAGAIN or EWOULDBLOCK
1328 *     The socket is marked non-blocking and the requested operation
1329 *     would block.
1330 *   EBADF
1331 *     An invalid descriptor was specified.
1332 *   ECONNRESET
1333 *     Connection reset by peer.
1334 *   EDESTADDRREQ
1335 *     The socket is not connection-mode, and no peer address is set.
1336 *   EFAULT
1337 *      An invalid user space address was specified for a parameter.
1338 *   EINTR
1339 *      A signal occurred before any data was transmitted.
1340 *   EINVAL
1341 *      Invalid argument passed.
1342 *   EISCONN
1343 *     The connection-mode socket was connected already but a recipient
1344 *     was specified. (Now either this error is returned, or the recipient
1345 *     specification is ignored.)
1346 *   EMSGSIZE
1347 *     The socket type requires that message be sent atomically, and the
1348 *     size of the message to be sent made this impossible.
1349 *   ENOBUFS
1350 *     The output queue for a network interface was full. This generally
1351 *     indicates that the interface has stopped sending, but may be
1352 *     caused by transient congestion.
1353 *   ENOMEM
1354 *     No memory available.
1355 *   ENOTCONN
1356 *     The socket is not connected, and no target has been given.
1357 *   ENOTSOCK
1358 *     The argument s is not a socket.
1359 *   EOPNOTSUPP
1360 *     Some bit in the flags argument is inappropriate for the socket
1361 *     type.
1362 *   EPIPE
1363 *     The local end has been shut down on a connection oriented socket.
1364 *     In this case the process will also receive a SIGPIPE unless
1365 *     MSG_NOSIGNAL is set.
1366 *
1367 ****************************************************************************/
1368
1369#ifdef CONFIG_NET_SENDFILE
1370struct file;
1371ssize_t net_sendfile(int outfd, struct file *infile, off_t *offset,
1372                     size_t count);
1373#endif
1374
1375/****************************************************************************
1376 * Name: psock_vfcntl
1377 *
1378 * Description:
1379 *   Performs fcntl operations on socket
1380 *
1381 * Input Parameters:
1382 *   psock - An instance of the internal socket structure.
1383 *   cmd   - The fcntl command.
1384 *   ap    - Command-specific arguments
1385 *
1386 * Returned Value:
1387 *   Zero (OK) is returned on success; a negated errno value is returned on
1388 *   any failure to indicate the nature of the failure.
1389 *
1390 ****************************************************************************/
1391
1392int psock_vfcntl(FAR struct socket *psock, int cmd, va_list ap);
1393
1394/****************************************************************************
1395 * Name: psock_fcntl
1396 *
1397 * Description:
1398 *   Similar to the standard fcntl function except that is accepts a struct
1399 *   struct socket instance instead of a file descriptor.
1400 *
1401 * Input Parameters:
1402 *   psock - An instance of the internal socket structure.
1403 *   cmd   - Identifies the operation to be performed.  Command specific
1404 *           arguments may follow.
1405 *
1406 * Returned Value:
1407 *   The nature of the return value depends on the command.  Non-negative
1408 *   values indicate success.  Failures are reported as negated errno
1409 *   values.
1410 *
1411 ****************************************************************************/
1412
1413int psock_fcntl(FAR struct socket *psock, int cmd, ...);
1414
1415/****************************************************************************
1416 * Name: net_vfcntl
1417 *
1418 * Description:
1419 *   Performs fcntl operations on socket
1420 *
1421 * Input Parameters:
1422 *   sockfd - Socket descriptor of the socket to operate on
1423 *   cmd    - The fcntl command.
1424 *   ap     - Command-specific arguments
1425 *
1426 * Returned Value:
1427 *   Zero (OK) is returned on success; a negated errno value is returned on
1428 *   any failure to indicate the nature of the failure.
1429 *
1430 ****************************************************************************/
1431
1432int net_vfcntl(int sockfd, int cmd, va_list ap);
1433
1434/****************************************************************************
1435 * Name: netdev_register
1436 *
1437 * Description:
1438 *   Register a network device driver and assign a name to it so that it can
1439 *   be found in subsequent network ioctl operations on the device.
1440 *
1441 *   A custom, device-specific interface name format string may be selected
1442 *   by putting that format string into the device structure's d_ifname[]
1443 *   array before calling netdev_register().  Otherwise, the d_ifname[] must
1444 *   be zeroed on entry.
1445 *
1446 * Input Parameters:
1447 *   dev    - The device driver structure to be registered.
1448 *   lltype - Link level protocol used by the driver (Ethernet, SLIP, TUN, ...
1449 *
1450 * Returned Value:
1451 *   0:Success; negated errno on failure
1452 *
1453 * Assumptions:
1454 *   Called during system initialization from normal user mode
1455 *
1456 ****************************************************************************/
1457
1458int netdev_register(struct net_driver_s *dev, enum net_lltype_e lltype);
1459
1460/****************************************************************************
1461 * Name: netdev_unregister
1462 *
1463 * Description:
1464 *   Unregister a network device driver.
1465 *
1466 * Input Parameters:
1467 *   dev - The device driver structure to un-register
1468 *
1469 * Returned Value:
1470 *   0:Success; negated errno on failure
1471 *
1472 * Assumptions:
1473 *   Currently only called for USB networking devices when the device is
1474 *   physically removed from the slot
1475 *
1476 ****************************************************************************/
1477
1478int netdev_unregister(struct net_driver_s *dev);
1479
1480
1481#ifdef __cplusplus
1482#if __cplusplus
1483}
1484#endif /* __cplusplus */
1485#endif /* __cplusplus */
1486
1487#endif /* CONFIG_NET */
1488#endif /* __INCLUDE_NET_NET_H */
1489