📄 uip.h
字号:
* addresses to use with e.g. the uip_connect() function.
*
* Example:
\code
uip_ipaddr_t ipaddr;
struct uip_conn *c;
uip_ipaddr(&ipaddr, 192,168,1,2);
c = uip_connect(&ipaddr, HTONS(80));
\endcode
*
* \param addr A pointer to a uip_ipaddr_t variable that will be
* filled in with the IP address.
*
* \param addr0 The first octet of the IP address.
* \param addr1 The second octet of the IP address.
* \param addr2 The third octet of the IP address.
* \param addr3 The forth octet of the IP address.
*
* \hideinitializer
*/
#define uip_ipaddr(addr, addr0,addr1,addr2,addr3) do { \
((u16_t *)(addr))[0] = HTONS(((addr0) << 8) | (addr1)); \
((u16_t *)(addr))[1] = HTONS(((addr2) << 8) | (addr3)); \
} while(0)
/**
* Construct an IPv6 address from eight 16-bit words.
*
* This function constructs an IPv6 address.
*
* \hideinitializer
*/
#define uip_ip6addr(addr, addr0,addr1,addr2,addr3,addr4,addr5,addr6,addr7) do { \
((u16_t *)(addr))[0] = HTONS((addr0)); \
((u16_t *)(addr))[1] = HTONS((addr1)); \
((u16_t *)(addr))[2] = HTONS((addr2)); \
((u16_t *)(addr))[3] = HTONS((addr3)); \
((u16_t *)(addr))[4] = HTONS((addr4)); \
((u16_t *)(addr))[5] = HTONS((addr5)); \
((u16_t *)(addr))[6] = HTONS((addr6)); \
((u16_t *)(addr))[7] = HTONS((addr7)); \
} while(0)
/**
* Copy an IP address to another IP address.
*
* Copies an IP address from one place to another.
*
* Example:
\code
uip_ipaddr_t ipaddr1, ipaddr2;
uip_ipaddr(&ipaddr1, 192,16,1,2);
uip_ipaddr_copy(&ipaddr2, &ipaddr1);
\endcode
*
* \param dest The destination for the copy.
* \param src The source from where to copy.
*
* \hideinitializer
*/
#if !UIP_CONF_IPV6
#define uip_ipaddr_copy(dest, src) do { \
((u16_t *)dest)[0] = ((u16_t *)src)[0]; \
((u16_t *)dest)[1] = ((u16_t *)src)[1]; \
} while(0)
#else /* !UIP_CONF_IPV6 */
#define uip_ipaddr_copy(dest, src) memcpy(dest, src, sizeof(uip_ip6addr_t))
#endif /* !UIP_CONF_IPV6 */
/**
* Compare two IP addresses
*
* Compares two IP addresses.
*
* Example:
\code
uip_ipaddr_t ipaddr1, ipaddr2;
uip_ipaddr(&ipaddr1, 192,16,1,2);
if(uip_ipaddr_cmp(&ipaddr2, &ipaddr1)) {
printf("They are the same");
}
\endcode
*
* \param addr1 The first IP address.
* \param addr2 The second IP address.
*
* \hideinitializer
*/
#if !UIP_CONF_IPV6
#define uip_ipaddr_cmp(addr1, addr2) (((u16_t *)addr1)[0] == ((u16_t *)addr2)[0] && \
((u16_t *)addr1)[1] == ((u16_t *)addr2)[1])
#else /* !UIP_CONF_IPV6 */
#define uip_ipaddr_cmp(addr1, addr2) (memcmp(addr1, addr2, sizeof(uip_ip6addr_t)) == 0)
#endif /* !UIP_CONF_IPV6 */
/**
* Compare two IP addresses with netmasks
*
* Compares two IP addresses with netmasks. The masks are used to mask
* out the bits that are to be compared.
*
* Example:
\code
uip_ipaddr_t ipaddr1, ipaddr2, mask;
uip_ipaddr(&mask, 255,255,255,0);
uip_ipaddr(&ipaddr1, 192,16,1,2);
uip_ipaddr(&ipaddr2, 192,16,1,3);
if(uip_ipaddr_maskcmp(&ipaddr1, &ipaddr2, &mask)) {
printf("They are the same");
}
\endcode
*
* \param addr1 The first IP address.
* \param addr2 The second IP address.
* \param mask The netmask.
*
* \hideinitializer
*/
#define uip_ipaddr_maskcmp(addr1, addr2, mask) \
(((((u16_t *)addr1)[0] & ((u16_t *)mask)[0]) == \
(((u16_t *)addr2)[0] & ((u16_t *)mask)[0])) && \
((((u16_t *)addr1)[1] & ((u16_t *)mask)[1]) == \
(((u16_t *)addr2)[1] & ((u16_t *)mask)[1])))
/**
* Mask out the network part of an IP address.
*
* Masks out the network part of an IP address, given the address and
* the netmask.
*
* Example:
\code
uip_ipaddr_t ipaddr1, ipaddr2, netmask;
uip_ipaddr(&ipaddr1, 192,16,1,2);
uip_ipaddr(&netmask, 255,255,255,0);
uip_ipaddr_mask(&ipaddr2, &ipaddr1, &netmask);
\endcode
*
* In the example above, the variable "ipaddr2" will contain the IP
* address 192.168.1.0.
*
* \param dest Where the result is to be placed.
* \param src The IP address.
* \param mask The netmask.
*
* \hideinitializer
*/
#define uip_ipaddr_mask(dest, src, mask) do { \
((u16_t *)dest)[0] = ((u16_t *)src)[0] & ((u16_t *)mask)[0]; \
((u16_t *)dest)[1] = ((u16_t *)src)[1] & ((u16_t *)mask)[1]; \
} while(0)
/**
* Pick the first octet of an IP address.
*
* Picks out the first octet of an IP address.
*
* Example:
\code
uip_ipaddr_t ipaddr;
u8_t octet;
uip_ipaddr(&ipaddr, 1,2,3,4);
octet = uip_ipaddr1(&ipaddr);
\endcode
*
* In the example above, the variable "octet" will contain the value 1.
*
* \hideinitializer
*/
#define uip_ipaddr1(addr) (htons(((u16_t *)(addr))[0]) >> 8)
/**
* Pick the second octet of an IP address.
*
* Picks out the second octet of an IP address.
*
* Example:
\code
uip_ipaddr_t ipaddr;
u8_t octet;
uip_ipaddr(&ipaddr, 1,2,3,4);
octet = uip_ipaddr2(&ipaddr);
\endcode
*
* In the example above, the variable "octet" will contain the value 2.
*
* \hideinitializer
*/
#define uip_ipaddr2(addr) (htons(((u16_t *)(addr))[0]) & 0xff)
/**
* Pick the third octet of an IP address.
*
* Picks out the third octet of an IP address.
*
* Example:
\code
uip_ipaddr_t ipaddr;
u8_t octet;
uip_ipaddr(&ipaddr, 1,2,3,4);
octet = uip_ipaddr3(&ipaddr);
\endcode
*
* In the example above, the variable "octet" will contain the value 3.
*
* \hideinitializer
*/
#define uip_ipaddr3(addr) (htons(((u16_t *)(addr))[1]) >> 8)
/**
* Pick the fourth octet of an IP address.
*
* Picks out the fourth octet of an IP address.
*
* Example:
\code
uip_ipaddr_t ipaddr;
u8_t octet;
uip_ipaddr(&ipaddr, 1,2,3,4);
octet = uip_ipaddr4(&ipaddr);
\endcode
*
* In the example above, the variable "octet" will contain the value 4.
*
* \hideinitializer
*/
#define uip_ipaddr4(addr) (htons(((u16_t *)(addr))[1]) & 0xff)
/**
* Convert 16-bit quantity from host byte order to network byte order.
*
* This macro is primarily used for converting constants from host
* byte order to network byte order. For converting variables to
* network byte order, use the htons() function instead.
*
* \hideinitializer
*/
#ifndef HTONS
# if UIP_BYTE_ORDER == UIP_BIG_ENDIAN
# define HTONS(n) (n)
# else /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */
# define HTONS(n) (u16_t)((((u16_t) (n)) << 8) | (((u16_t) (n)) >> 8))
# endif /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */
#else
#error "HTONS already defined!"
#endif /* HTONS */
/**
* Convert 16-bit quantity from host byte order to network byte order.
*
* This function is primarily used for converting variables from host
* byte order to network byte order. For converting constants to
* network byte order, use the HTONS() macro instead.
*/
#ifndef htons
u16_t htons(u16_t val);
#endif /* htons */
#ifndef ntohs
#define ntohs htons
#endif
/** @} */
/**
* Pointer to the application data in the packet buffer.
*
* This pointer points to the application data when the application is
* called. If the application wishes to send data, the application may
* use this space to write the data into before calling uip_send().
*/
extern void *uip_appdata;
#if UIP_URGDATA > 0
/* u8_t *uip_urgdata:
*
* This pointer points to any urgent data that has been received. Only
* present if compiled with support for urgent data (UIP_URGDATA).
*/
extern void *uip_urgdata;
#endif /* UIP_URGDATA > 0 */
/**
* \defgroup uipdrivervars Variables used in uIP device drivers
* @{
*
* uIP has a few global variables that are used in device drivers for
* uIP.
*/
/**
* The length of the packet in the uip_buf buffer.
*
* The global variable uip_len holds the length of the packet in the
* uip_buf buffer.
*
* When the network device driver calls the uIP input function,
* uip_len should be set to the length of the packet in the uip_buf
* buffer.
*
* When sending packets, the device driver should use the contents of
* the uip_len variable to determine the length of the outgoing
* packet.
*
*/
extern u16_t uip_len;
/** @} */
#if UIP_URGDATA > 0
extern u16_t uip_urglen, uip_surglen;
#endif /* UIP_URGDATA > 0 */
/**
* Representation of a uIP TCP connection.
*
* The uip_conn structure is used for identifying a connection. All
* but one field in the structure are to be considered read-only by an
* application. The only exception is the appstate field whos purpose
* is to let the application store application-specific state (e.g.,
* file pointers) for the connection. The type of this field is
* configured in the "uipopt.h" header file.
*/
struct uip_conn {
uip_ipaddr_t ripaddr; /**< The IP address of the remote host. */
u16_t lport; /**< The local TCP port, in network byte order. */
u16_t rport; /**< The local remote TCP port, in network byte
order. */
u8_t rcv_nxt[4]; /**< The sequence number that we expect to
receive next. */
u8_t snd_nxt[4]; /**< The sequence number that was last sent by
us. */
u16_t len; /**< Length of the data that was previously sent. */
u16_t mss; /**< Current maximum segment size for the
connection. */
u16_t initialmss; /**< Initial maximum segment size for the
connection. */
u8_t sa; /**< Retransmission time-out calculation state
variable. */
u8_t sv; /**< Retransmission time-out calculation state
variable. */
u8_t rto; /**< Retransmission time-out. */
u8_t tcpstateflags; /**< TCP state and flags. */
u8_t timer; /**< The retransmission timer. */
u8_t nrtx; /**< The number of retransmissions for the last
segment sent. */
/** The application state. */
uip_tcp_appstate_t appstate;
};
/**
* Pointer to the current TCP connection.
*
* The uip_conn pointer can be used to access the current TCP
* connection.
*/
extern struct uip_conn *uip_conn;
/* The array containing all uIP connections. */
extern struct uip_conn uip_conns[UIP_CONNS];
/**
* \addtogroup uiparch
* @{
*/
/**
* 4-byte array used for the 32-bit sequence number calculations.
*/
extern u8_t uip_acc32[4];
/** @} */
#if UIP_UDP
/**
* Representation of a uIP UDP connection.
*/
struct uip_udp_conn {
uip_ipaddr_t ripaddr; /**< The IP address of the remote peer. */
u16_t lport; /**< The local port number in network byte order. */
u16_t rport; /**< The remote port number in network byte order. */
u8_t ttl; /**< Default time-to-live. */
/** The application state. */
uip_udp_appstate_t appstate;
};
/**
* The current UDP connection.
*/
extern struct uip_udp_conn *uip_udp_conn;
extern struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS];
#endif /* UIP_UDP */
/**
* The structure holding the TCP/IP statistics that are gathered if
* UIP_STATISTICS is set to 1.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -