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