1 /*
2  * Copyright (C) 2018 Alibaba Group Holding Limited
3  */
4 
5 #ifndef LWIP_HDR_AF_PACKET_H
6 #define LWIP_HDR_AF_PACKET_H
7 
8 #include "lwip/opt.h"
9 
10 #if LWIP_PACKET
11 #include "lwip/sys.h"
12 #include "lwip/sockets.h"
13 #include "lwip/netif.h"
14 
15 /* If your port already typedef's socklen_t, define SOCKLEN_T_DEFINED
16    to prevent this code from redefining it. */
17 #if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED)
18 typedef u32_t socklen_t;
19 #endif
20 
21 struct sockaddr_ll {
22     u_char      sll_len;                                                /* Total length of sockaddr     */
23     u_char      sll_family;                                             /* AF_PACKET                    */
24     u_short     sll_protocol;                                           /* Physical layer protocol      */
25     u_short     sll_hatype;                                             /* ARP hardware type            */
26     u_char      sll_pkttype;                                            /* packet type                  */
27     u_char      sll_halen;                                              /* Length of address            */
28     u_char      sll_addr[8];                                            /* Physical layer address       */
29     int         sll_ifindex;                                            /* Interface number             */
30 };
31 
32 /** This is overridable for the rare case where more than 255 threads
33  * select on the same socket...
34  */
35 #ifndef SELWAIT_T
36 #define SELWAIT_T u8_t
37 #endif
38 
39 typedef struct packet_sock {
40     int  flag;           /* block or nonblock    */
41     int  type;           /* raw or dgram         */
42     int  protocol;       /* protocol             */
43     int  ifindex;        /* netif index          */
44     int  hdrlen;         /* header length        */
45     sys_mbox_t pktmbox;  /* recv incoming pkts   */
46     int  reserve;        /* reserve field        */
47     int  is_used;        /* is used flag         */
48     int  recv_output;    /* if recv output pkt   */
49     /** number of times data was received */
50     s16_t rcvevent;
51     /** last error that occurred on this socket (in fact, all our errnos fit into an u8_t) */
52     uint8_t err;
53     /** counter of how many threads are waiting for this socket using select */
54     SELWAIT_T select_waiting;
55 } packet_sock;
56 
57 /* Packet socket data state indicator. */
58 typedef enum packet_action {
59     PACKET_ACTION_EVTRCVPLUS,
60     PACKET_ACTION_EVTRCVMINUS,
61     PACKET_ACTION_EVTSENDPLUS,
62     PACKET_ACTION_EVTSENDMINUS,
63     PACKET_ACTION_SELWAITPLUS,
64     PACKET_ACTION_SELWAITMINUS,
65     PACKET_ACTION_ERROR
66 } packet_action_t;
67 
68 #ifndef ETH_P_ALL
69 #define ETH_P_ALL 0x0003
70 #endif
71 
72 #define ARPHRD_ETHER 1  /* ethernet hardware format*/
73 
74 #define IS_AF_PACKET_SOCKET(s) ((s >= LWIP_PACKET_SOCKET_OFFSET)&&(s < LWIP_PACKET_SOCKET_OFFSET + NUM_PACKET_SOCKETS))
75 
76 /* Packet socket options */
77 
78 #define PACKET_ADD_MEMBERSHIP           1
79 #define PACKET_DROP_MEMBERSHIP          2
80 #define PACKET_RECV_OUTPUT              3
81 /* Value 4 is still used by obsolete turbo-packet. */
82 #define PACKET_RX_RING                  5
83 #define PACKET_STATISTICS               6
84 #define PACKET_COPY_THRESH              7
85 #define PACKET_AUXDATA                  8
86 #define PACKET_ORIGDEV                  9
87 #define PACKET_VERSION                  10
88 #define PACKET_HDRLEN                   11
89 #define PACKET_RESERVE                  12
90 #define PACKET_TX_RING                  13
91 #define PACKET_LOSS                     14
92 #define PACKET_VNET_HDR                 15
93 #define PACKET_TX_TIMESTAMP             16
94 #define PACKET_TIMESTAMP                17
95 #define PACKET_FANOUT                   18
96 #define PACKET_TX_HAS_OFF               19
97 #define PACKET_QDISC_BYPASS             20
98 
99 typedef enum
100 {
101     INCOMING = 1,
102     OUTGOING
103 } pkt_direct;
104 
105 int packet_socket(int domain, int type, int protocol);
106 
107 int packet_bind(int s, const struct sockaddr *name, socklen_t namelen);
108 
109 int packet_sendto(int s, const void *data, size_t size, int flags,
110        const struct sockaddr *to, socklen_t tolen);
111 
112 int packet_recvfrom(int s, void *mem, size_t len, int flags,
113               struct sockaddr *from, socklen_t *fromlen);
114 
115 int packet_recv(int s, void *mem, size_t len, int flags);
116 
117 int packet_setsockopt (int s, int level, int optname,
118                         const void *optval, socklen_t optlen);
119 
120 int packet_close(int s);
121 
122 err_t packet_input_hook (struct pbuf* p, struct netif * inp);
123 
124 int packet_select_action(int s, packet_action_t action);
125 
126 int
127 packet_selscan(int maxfdp1, fd_set *readset_in, fd_set *writeset_in, fd_set *exceptset_in,
128              fd_set *readset_out, fd_set *writeset_out, fd_set *exceptset_out);
129 
130 #endif /* LWIP_PACKET */
131 #endif /* LWIP_HDR_AF_PACKET_H */
132