1 /**
2 * \defgroup uiparch Architecture specific uIP functions
3 * @{
4 *
5 * The functions in the architecture specific module implement the IP
6 * check sum and 32-bit additions.
7 *
8 * The IP checksum calculation is the most computationally expensive
9 * operation in the TCP/IP stack and it therefore pays off to
10 * implement this in efficient assembler. The purpose of the uip-arch
11 * module is to let the checksum functions to be implemented in
12 * architecture specific assembler.
13 *
14 */
15
16 /**
17 * \file
18 * Declarations of architecture specific functions.
19 * \author Adam Dunkels <adam@dunkels.com>
20 */
21
22 /*
23 * Copyright (c) 2001, Adam Dunkels.
24 * All rights reserved.
25 *
26 * Redistribution and use in source and binary forms, with or without
27 * modification, are permitted provided that the following conditions
28 * are met:
29 * 1. Redistributions of source code must retain the above copyright
30 * notice, this list of conditions and the following disclaimer.
31 * 2. Redistributions in binary form must reproduce the above copyright
32 * notice, this list of conditions and the following disclaimer in the
33 * documentation and/or other materials provided with the distribution.
34 * 3. The name of the author may not be used to endorse or promote
35 * products derived from this software without specific prior
36 * written permission.
37 *
38 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
39 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
40 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
41 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
42 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
43 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
44 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
45 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
46 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
47 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
48 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
49 *
50 * This file is part of the uIP TCP/IP stack.
51 *
52 *
53 */
54
55 #ifndef __UIP_ARCH_H__
56 #define __UIP_ARCH_H__
57
58 #include "uip.h"
59
60 #define UIP_MIN(x,y) (x)<(y)?(x):(y)
61
62 #define MEM_ALIGNMENT 4
63 #define MEM_ALIGN(mem) ((void*)(((u32_t)(mem)+MEM_ALIGNMENT-1)&~(u32_t)(MEM_ALIGNMENT-1)))
64 #define MEM_ALIGN_SIZE(size) (((size)+MEM_ALIGNMENT-1)&~(u32_t)(MEM_ALIGNMENT-1))
65
66 #define PACK_STRUCT_STRUCT __attribute__((packed))
67 #define PACK_STRUCT_FIELD(x) x
68 #define PACK_STRUCT_BEGIN
69 #define PACK_STRUCT_END
70
71 #ifndef htons
72 #define htons(x) (x)
73 #endif
74 #ifndef ntohs
75 #define ntohs(x) (x)
76 #endif
77 #ifndef htonl
78 #define htonl(x) (x)
79 #endif
80 #ifndef ntohl
81 #define ntohl(x) (x)
82 #endif
83
84 struct uip_pbuf;
85 struct uip_ip_addr;
86
87 /**
88 * Calculate the Internet checksum over a buffer.
89 *
90 * The Internet checksum is the one's complement of the one's
91 * complement sum of all 16-bit words in the buffer.
92 *
93 * See RFC1071.
94 *
95 * \note This function is not called in the current version of uIP,
96 * but future versions might make use of it.
97 *
98 * \param buf A pointer to the buffer over which the checksum is to be
99 * computed.
100 *
101 * \param len The length of the buffer over which the checksum is to
102 * be computed.
103 *
104 * \return The Internet checksum of the buffer.
105 */
106 u16_t uip_chksum(u16_t *buf, u32_t len);
107
108 /**
109 * Calculate the IP header checksum of the packet header in uip_buf.
110 *
111 * The IP header checksum is the Internet checksum of the 20 bytes of
112 * the IP header.
113 *
114 * \return The IP header checksum of the IP header in the uip_buf
115 * buffer.
116 */
117 u16_t uip_ipchksum(void *dataptr,u16_t len);
118
119 u16_t uip_ipchksum_pbuf(struct uip_pbuf *p);
120
121 /**
122 * Calculate the TCP checksum of the packet in uip_buf and uip_appdata.
123 *
124 * The TCP checksum is the Internet checksum of data contents of the
125 * TCP segment, and a pseudo-header as defined in RFC793.
126 *
127 * \note The uip_appdata pointer that points to the packet data may
128 * point anywhere in memory, so it is not possible to simply calculate
129 * the Internet checksum of the contents of the uip_buf buffer.
130 *
131 * \return The TCP checksum of the TCP segment in uip_buf and pointed
132 * to by uip_appdata.
133 */
134 u16_t uip_chksum_pseudo(struct uip_pbuf *p,struct uip_ip_addr *src,struct uip_ip_addr *dst,u8_t proto,u16_t proto_len);
135
136 extern void tcpip_tmr_needed();
137 #define tcp_tmr_needed tcpip_tmr_needed
138
139 #if UIP_LIBC_MEMFUNCREPLACE
uip_memcpy(void * dest,const void * src,s32_t len)140 static __inline__ void uip_memcpy(void *dest,const void *src,s32_t len)
141 {
142 u8_t *dest0 = (u8_t*)dest;
143 u8_t *src0 = (u8_t*)src;
144
145 while(len--) {
146 *dest0++ = *src0++;
147 }
148 }
149
uip_memset(void * dest,s32_t c,s32_t len)150 static __inline__ void uip_memset(void *dest,s32_t c,s32_t len)
151 {
152 u8_t *dest0 = (u8_t*)dest;
153
154 while(len--) {
155 *dest0++ = (s8_t)c;
156 }
157 }
158
159 #define UIP_MEMCPY uip_memcpy
160 #define UIP_MEMSET uip_memset
161 #else
162 #define UIP_MEMCPY memcpy
163 #define UIP_MEMSET memset
164 #endif
165
166 /** @} */
167
168 #endif /* __UIP_ARCH_H__ */
169