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