summaryrefslogtreecommitdiff
path: root/third_party/uip-1.0/doc/html/a00193.html
blob: c9b6a9ce4db5de8c86a0c3b25e0986fa2ac8ddd0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>uIP 1.0: uip/psock.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.6 -->
<div class="tabs">
  <ul>
    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="modules.html"><span>Modules</span></a></li>
    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
    <li id="current"><a href="files.html"><span>Files</span></a></li>
    <li><a href="examples.html"><span>Examples</span></a></li>
  </ul></div>
<div class="tabs">
  <ul>
    <li><a href="files.html"><span>File&nbsp;List</span></a></li>
    <li><a href="globals.html"><span>Globals</span></a></li>
  </ul></div>
<h1>uip/psock.h</h1><a href="a00127.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> * Copyright (c) 2004, Swedish Institute of Computer Science.</span>
<a name="l00003"></a>00003 <span class="comment"> * All rights reserved.</span>
<a name="l00004"></a>00004 <span class="comment"> *</span>
<a name="l00005"></a>00005 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
<a name="l00006"></a>00006 <span class="comment"> * modification, are permitted provided that the following conditions</span>
<a name="l00007"></a>00007 <span class="comment"> * are met:</span>
<a name="l00008"></a>00008 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
<a name="l00009"></a>00009 <span class="comment"> *    notice, this list of conditions and the following disclaimer.</span>
<a name="l00010"></a>00010 <span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span>
<a name="l00011"></a>00011 <span class="comment"> *    notice, this list of conditions and the following disclaimer in the</span>
<a name="l00012"></a>00012 <span class="comment"> *    documentation and/or other materials provided with the distribution.</span>
<a name="l00013"></a>00013 <span class="comment"> * 3. Neither the name of the Institute nor the names of its contributors</span>
<a name="l00014"></a>00014 <span class="comment"> *    may be used to endorse or promote products derived from this software</span>
<a name="l00015"></a>00015 <span class="comment"> *    without specific prior written permission.</span>
<a name="l00016"></a>00016 <span class="comment"> *</span>
<a name="l00017"></a>00017 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND</span>
<a name="l00018"></a>00018 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span>
<a name="l00019"></a>00019 <span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
<a name="l00020"></a>00020 <span class="comment"> * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE</span>
<a name="l00021"></a>00021 <span class="comment"> * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
<a name="l00022"></a>00022 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</span>
<a name="l00023"></a>00023 <span class="comment"> * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</span>
<a name="l00024"></a>00024 <span class="comment"> * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</span>
<a name="l00025"></a>00025 <span class="comment"> * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</span>
<a name="l00026"></a>00026 <span class="comment"> * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</span>
<a name="l00027"></a>00027 <span class="comment"> * SUCH DAMAGE.</span>
<a name="l00028"></a>00028 <span class="comment"> *</span>
<a name="l00029"></a>00029 <span class="comment"> * This file is part of the uIP TCP/IP stack</span>
<a name="l00030"></a>00030 <span class="comment"> *</span>
<a name="l00031"></a>00031 <span class="comment"> * Author: Adam Dunkels &lt;adam@sics.se&gt;</span>
<a name="l00032"></a>00032 <span class="comment"> *</span>
<a name="l00033"></a>00033 <span class="comment"> * $Id: psock.h,v 1.3 2006/06/12 08:00:30 adam Exp $</span>
<a name="l00034"></a>00034 <span class="comment"> */</span>
<a name="l00035"></a>00035 <span class="comment"></span>
<a name="l00036"></a>00036 <span class="comment">/**</span>
<a name="l00037"></a>00037 <span class="comment"> * \defgroup psock Protosockets library</span>
<a name="l00038"></a>00038 <span class="comment"> * @{</span>
<a name="l00039"></a>00039 <span class="comment"> *</span>
<a name="l00040"></a>00040 <span class="comment"> * The protosocket library provides an interface to the uIP stack that is</span>
<a name="l00041"></a>00041 <span class="comment"> * similar to the traditional BSD socket interface. Unlike programs</span>
<a name="l00042"></a>00042 <span class="comment"> * written for the ordinary uIP event-driven interface, programs</span>
<a name="l00043"></a>00043 <span class="comment"> * written with the protosocket library are executed in a sequential</span>
<a name="l00044"></a>00044 <span class="comment"> * fashion and does not have to be implemented as explicit state</span>
<a name="l00045"></a>00045 <span class="comment"> * machines.</span>
<a name="l00046"></a>00046 <span class="comment"> *</span>
<a name="l00047"></a>00047 <span class="comment"> * Protosockets only work with TCP connections.</span>
<a name="l00048"></a>00048 <span class="comment"> *</span>
<a name="l00049"></a>00049 <span class="comment"> * The protosocket library uses \ref pt protothreads to provide</span>
<a name="l00050"></a>00050 <span class="comment"> * sequential control flow. This makes the protosockets lightweight in</span>
<a name="l00051"></a>00051 <span class="comment"> * terms of memory, but also means that protosockets inherits the</span>
<a name="l00052"></a>00052 <span class="comment"> * functional limitations of protothreads. Each protosocket lives only</span>
<a name="l00053"></a>00053 <span class="comment"> * within a single function. Automatic variables (stack variables) are</span>
<a name="l00054"></a>00054 <span class="comment"> * not retained across a protosocket library function call.</span>
<a name="l00055"></a>00055 <span class="comment"> *</span>
<a name="l00056"></a>00056 <span class="comment"> * \note Because the protosocket library uses protothreads, local</span>
<a name="l00057"></a>00057 <span class="comment"> * variables will not always be saved across a call to a protosocket</span>
<a name="l00058"></a>00058 <span class="comment"> * library function. It is therefore advised that local variables are</span>
<a name="l00059"></a>00059 <span class="comment"> * used with extreme care.</span>
<a name="l00060"></a>00060 <span class="comment"> *</span>
<a name="l00061"></a>00061 <span class="comment"> * The protosocket library provides functions for sending data without</span>
<a name="l00062"></a>00062 <span class="comment"> * having to deal with retransmissions and acknowledgements, as well</span>
<a name="l00063"></a>00063 <span class="comment"> * as functions for reading data without having to deal with data</span>
<a name="l00064"></a>00064 <span class="comment"> * being split across more than one TCP segment.</span>
<a name="l00065"></a>00065 <span class="comment"> *</span>
<a name="l00066"></a>00066 <span class="comment"> * Because each protosocket runs as a protothread, the protosocket has to be</span>
<a name="l00067"></a>00067 <span class="comment"> * started with a call to PSOCK_BEGIN() at the start of the function</span>
<a name="l00068"></a>00068 <span class="comment"> * in which the protosocket is used. Similarly, the protosocket protothread can</span>
<a name="l00069"></a>00069 <span class="comment"> * be terminated by a call to PSOCK_EXIT().</span>
<a name="l00070"></a>00070 <span class="comment"> *</span>
<a name="l00071"></a>00071 <span class="comment"> */</span>
<a name="l00072"></a>00072 <span class="comment"></span>
<a name="l00073"></a>00073 <span class="comment">/**</span>
<a name="l00074"></a>00074 <span class="comment"> * \file</span>
<a name="l00075"></a>00075 <span class="comment"> * Protosocket library header file</span>
<a name="l00076"></a>00076 <span class="comment"> * \author</span>
<a name="l00077"></a>00077 <span class="comment"> * Adam Dunkels &lt;adam@sics.se&gt;</span>
<a name="l00078"></a>00078 <span class="comment"> *</span>
<a name="l00079"></a>00079 <span class="comment"> */</span>
<a name="l00080"></a>00080 
<a name="l00081"></a>00081 <span class="preprocessor">#ifndef __PSOCK_H__</span>
<a name="l00082"></a>00082 <span class="preprocessor"></span><span class="preprocessor">#define __PSOCK_H__</span>
<a name="l00083"></a>00083 <span class="preprocessor"></span>
<a name="l00084"></a>00084 <span class="preprocessor">#include "<a class="code" href="a00140.html">uipopt.h</a>"</span>
<a name="l00085"></a>00085 <span class="preprocessor">#include "<a class="code" href="a00128.html">pt.h</a>"</span>
<a name="l00086"></a>00086 
<a name="l00087"></a>00087  <span class="comment">/*</span>
<a name="l00088"></a>00088 <span class="comment"> * The structure that holds the state of a buffer.</span>
<a name="l00089"></a>00089 <span class="comment"> *</span>
<a name="l00090"></a>00090 <span class="comment"> * This structure holds the state of a uIP buffer. The structure has</span>
<a name="l00091"></a>00091 <span class="comment"> * no user-visible elements, but is used through the functions</span>
<a name="l00092"></a>00092 <span class="comment"> * provided by the library.</span>
<a name="l00093"></a>00093 <span class="comment"> *</span>
<a name="l00094"></a>00094 <span class="comment"> */</span>
<a name="l00095"></a><a class="code" href="a00083.html">00095</a> <span class="keyword">struct </span><a class="code" href="a00083.html">psock_buf</a> {
<a name="l00096"></a><a class="code" href="a00083.html#5e8637b1514d03eb3eb12dc9a502e27e">00096</a>   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *<a class="code" href="a00083.html#5e8637b1514d03eb3eb12dc9a502e27e">ptr</a>;
<a name="l00097"></a><a class="code" href="a00083.html#20fae11b540a561c622a0d74cb4b9f97">00097</a>   <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="a00083.html#20fae11b540a561c622a0d74cb4b9f97">left</a>;
<a name="l00098"></a>00098 };
<a name="l00099"></a>00099 <span class="comment"></span>
<a name="l00100"></a>00100 <span class="comment">/**</span>
<a name="l00101"></a>00101 <span class="comment"> * The representation of a protosocket.</span>
<a name="l00102"></a>00102 <span class="comment"> *</span>
<a name="l00103"></a>00103 <span class="comment"> * The protosocket structrure is an opaque structure with no user-visible</span>
<a name="l00104"></a>00104 <span class="comment"> * elements.</span>
<a name="l00105"></a>00105 <span class="comment"> */</span>
<a name="l00106"></a><a class="code" href="a00082.html">00106</a> <span class="keyword">struct </span><a class="code" href="a00082.html">psock</a> {
<a name="l00107"></a><a class="code" href="a00082.html#17aacf7c5e2046c1f3ab50faa1b2f7eb">00107</a>   <span class="keyword">struct </span><a class="code" href="a00084.html">pt</a> pt, <a class="code" href="a00082.html#17aacf7c5e2046c1f3ab50faa1b2f7eb">psockpt</a>; <span class="comment">/* Protothreads - one that's using the psock</span>
<a name="l00108"></a>00108 <span class="comment">                            functions, and one that runs inside the</span>
<a name="l00109"></a>00109 <span class="comment">                            psock functions. */</span>
<a name="l00110"></a><a class="code" href="a00082.html#31f25efccba9fd043047133d0d0ba5ab">00110</a>   <span class="keyword">const</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *<a class="code" href="a00082.html#31f25efccba9fd043047133d0d0ba5ab">sendptr</a>;   <span class="comment">/* Pointer to the next data to be sent. */</span>
<a name="l00111"></a><a class="code" href="a00082.html#b973f2e16c2883a8a0164d716cce5a31">00111</a>   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *<a class="code" href="a00082.html#b973f2e16c2883a8a0164d716cce5a31">readptr</a>;         <span class="comment">/* Pointer to the next data to be read. */</span>
<a name="l00112"></a>00112   
<a name="l00113"></a><a class="code" href="a00082.html#c3d1bfbb1abde31973c015de97ce2f84">00113</a>   <span class="keywordtype">char</span> *<a class="code" href="a00082.html#c3d1bfbb1abde31973c015de97ce2f84">bufptr</a>;          <span class="comment">/* Pointer to the buffer used for buffering</span>
<a name="l00114"></a>00114 <span class="comment">                            incoming data. */</span>
<a name="l00115"></a>00115   
<a name="l00116"></a><a class="code" href="a00082.html#19b82696bd84a803250cbf9812f2f125">00116</a>   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> <a class="code" href="a00082.html#19b82696bd84a803250cbf9812f2f125">sendlen</a>;         <span class="comment">/* The number of bytes left to be sent. */</span>
<a name="l00117"></a><a class="code" href="a00082.html#a408ca8630154ebd039f37a828399f7b">00117</a>   <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> <a class="code" href="a00082.html#a408ca8630154ebd039f37a828399f7b">readlen</a>;         <span class="comment">/* The number of bytes left to be read. */</span>
<a name="l00118"></a>00118 
<a name="l00119"></a><a class="code" href="a00082.html#d6bd03239291629676e4c0286ebb650f">00119</a>   <span class="keyword">struct </span><a class="code" href="a00083.html">psock_buf</a> <a class="code" href="a00082.html#d6bd03239291629676e4c0286ebb650f">buf</a>;  <span class="comment">/* The structure holding the state of the</span>
<a name="l00120"></a>00120 <span class="comment">                            input buffer. */</span>
<a name="l00121"></a><a class="code" href="a00082.html#a6bfaf327ce839ba70accd71014398d0">00121</a>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="a00082.html#a6bfaf327ce839ba70accd71014398d0">bufsize</a>;  <span class="comment">/* The size of the input buffer. */</span>
<a name="l00122"></a>00122   
<a name="l00123"></a><a class="code" href="a00082.html#fda184638130452f3570966acc5b97f9">00123</a>   <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00082.html#fda184638130452f3570966acc5b97f9">state</a>;   <span class="comment">/* The state of the protosocket. */</span>
<a name="l00124"></a>00124 };
<a name="l00125"></a>00125 
<a name="l00126"></a>00126 <span class="keywordtype">void</span> psock_init(<span class="keyword">struct</span> <a class="code" href="a00082.html">psock</a> *<a class="code" href="a00082.html">psock</a>, <span class="keywordtype">char</span> *buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> buffersize);<span class="comment"></span>
<a name="l00127"></a>00127 <span class="comment">/**</span>
<a name="l00128"></a>00128 <span class="comment"> * Initialize a protosocket.</span>
<a name="l00129"></a>00129 <span class="comment"> *</span>
<a name="l00130"></a>00130 <span class="comment"> * This macro initializes a protosocket and must be called before the</span>
<a name="l00131"></a>00131 <span class="comment"> * protosocket is used. The initialization also specifies the input buffer</span>
<a name="l00132"></a>00132 <span class="comment"> * for the protosocket.</span>
<a name="l00133"></a>00133 <span class="comment"> *</span>
<a name="l00134"></a>00134 <span class="comment"> * \param psock (struct psock *) A pointer to the protosocket to be</span>
<a name="l00135"></a>00135 <span class="comment"> * initialized</span>
<a name="l00136"></a>00136 <span class="comment"> *</span>
<a name="l00137"></a>00137 <span class="comment"> * \param buffer (char *) A pointer to the input buffer for the</span>
<a name="l00138"></a>00138 <span class="comment"> * protosocket.</span>
<a name="l00139"></a>00139 <span class="comment"> *</span>
<a name="l00140"></a>00140 <span class="comment"> * \param buffersize (unsigned int) The size of the input buffer.</span>
<a name="l00141"></a>00141 <span class="comment"> *</span>
<a name="l00142"></a>00142 <span class="comment"> * \hideinitializer</span>
<a name="l00143"></a>00143 <span class="comment"> */</span>
<a name="l00144"></a><a class="code" href="a00158.html#g26ae707402e494f3895a9f012a93ea29">00144</a> <span class="preprocessor">#define PSOCK_INIT(psock, buffer, buffersize) \</span>
<a name="l00145"></a>00145 <span class="preprocessor">  psock_init(psock, buffer, buffersize)</span>
<a name="l00146"></a>00146 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00147"></a>00147 <span class="comment">/**</span>
<a name="l00148"></a>00148 <span class="comment"> * Start the protosocket protothread in a function.</span>
<a name="l00149"></a>00149 <span class="comment"> *</span>
<a name="l00150"></a>00150 <span class="comment"> * This macro starts the protothread associated with the protosocket and</span>
<a name="l00151"></a>00151 <span class="comment"> * must come before other protosocket calls in the function it is used.</span>
<a name="l00152"></a>00152 <span class="comment"> *</span>
<a name="l00153"></a>00153 <span class="comment"> * \param psock (struct psock *) A pointer to the protosocket to be</span>
<a name="l00154"></a>00154 <span class="comment"> * started.</span>
<a name="l00155"></a>00155 <span class="comment"> *</span>
<a name="l00156"></a>00156 <span class="comment"> * \hideinitializer</span>
<a name="l00157"></a>00157 <span class="comment"> */</span>
<a name="l00158"></a><a class="code" href="a00158.html#g84901a5aa60040e96d272a69977edd22">00158</a> <span class="preprocessor">#define PSOCK_BEGIN(psock) PT_BEGIN(&amp;((psock)-&gt;pt))</span>
<a name="l00159"></a>00159 <span class="preprocessor"></span>
<a name="l00160"></a>00160 <a class="code" href="a00142.html#g3d4c8bd4aada659eb34f5d2ffd3e7901">PT_THREAD</a>(psock_send(<span class="keyword">struct</span> <a class="code" href="a00082.html">psock</a> *<a class="code" href="a00082.html">psock</a>, <span class="keyword">const</span> <span class="keywordtype">char</span> *buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len));<span class="comment"></span>
<a name="l00161"></a>00161 <span class="comment">/**</span>
<a name="l00162"></a>00162 <span class="comment"> * Send data.</span>
<a name="l00163"></a>00163 <span class="comment"> *</span>
<a name="l00164"></a>00164 <span class="comment"> * This macro sends data over a protosocket. The protosocket protothread blocks</span>
<a name="l00165"></a>00165 <span class="comment"> * until all data has been sent and is known to have been received by</span>
<a name="l00166"></a>00166 <span class="comment"> * the remote end of the TCP connection.</span>
<a name="l00167"></a>00167 <span class="comment"> *</span>
<a name="l00168"></a>00168 <span class="comment"> * \param psock (struct psock *) A pointer to the protosocket over which</span>
<a name="l00169"></a>00169 <span class="comment"> * data is to be sent.</span>
<a name="l00170"></a>00170 <span class="comment"> *</span>
<a name="l00171"></a>00171 <span class="comment"> * \param data (char *) A pointer to the data that is to be sent.</span>
<a name="l00172"></a>00172 <span class="comment"> *</span>
<a name="l00173"></a>00173 <span class="comment"> * \param datalen (unsigned int) The length of the data that is to be</span>
<a name="l00174"></a>00174 <span class="comment"> * sent.</span>
<a name="l00175"></a>00175 <span class="comment"> *</span>
<a name="l00176"></a>00176 <span class="comment"> * \hideinitializer</span>
<a name="l00177"></a>00177 <span class="comment"> */</span>
<a name="l00178"></a><a class="code" href="a00158.html#g70d236d1cf34b4e21836edda60247b70">00178</a> <span class="preprocessor">#define PSOCK_SEND(psock, data, datalen)                \</span>
<a name="l00179"></a>00179 <span class="preprocessor">    PT_WAIT_THREAD(&amp;((psock)-&gt;pt), psock_send(psock, data, datalen))</span>
<a name="l00180"></a>00180 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00181"></a>00181 <span class="comment">/**</span>
<a name="l00182"></a>00182 <span class="comment"> * \brief      Send a null-terminated string.</span>
<a name="l00183"></a>00183 <span class="comment"> * \param psock Pointer to the protosocket.</span>
<a name="l00184"></a>00184 <span class="comment"> * \param str  The string to be sent.</span>
<a name="l00185"></a>00185 <span class="comment"> *</span>
<a name="l00186"></a>00186 <span class="comment"> *             This function sends a null-terminated string over the</span>
<a name="l00187"></a>00187 <span class="comment"> *             protosocket.</span>
<a name="l00188"></a>00188 <span class="comment"> *</span>
<a name="l00189"></a>00189 <span class="comment"> * \hideinitializer</span>
<a name="l00190"></a>00190 <span class="comment"> */</span>
<a name="l00191"></a><a class="code" href="a00158.html#gb0ad55aa96dd1d200cd0fc5a99f6a4f7">00191</a> <span class="preprocessor">#define PSOCK_SEND_STR(psock, str)                      \</span>
<a name="l00192"></a>00192 <span class="preprocessor">    PT_WAIT_THREAD(&amp;((psock)-&gt;pt), psock_send(psock, str, strlen(str)))</span>
<a name="l00193"></a>00193 <span class="preprocessor"></span>
<a name="l00194"></a>00194 <a class="code" href="a00142.html#g3d4c8bd4aada659eb34f5d2ffd3e7901">PT_THREAD</a>(psock_generator_send(<span class="keyword">struct</span> <a class="code" href="a00082.html">psock</a> *<a class="code" href="a00082.html">psock</a>,
<a name="l00195"></a>00195                                 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> (*f)(<span class="keywordtype">void</span> *), <span class="keywordtype">void</span> *arg));
<a name="l00196"></a>00196 <span class="comment"></span>
<a name="l00197"></a>00197 <span class="comment">/**</span>
<a name="l00198"></a>00198 <span class="comment"> * \brief      Generate data with a function and send it</span>
<a name="l00199"></a>00199 <span class="comment"> * \param psock Pointer to the protosocket.</span>
<a name="l00200"></a>00200 <span class="comment"> * \param generator Pointer to the generator function</span>
<a name="l00201"></a>00201 <span class="comment"> * \param arg   Argument to the generator function</span>
<a name="l00202"></a>00202 <span class="comment"> *</span>
<a name="l00203"></a>00203 <span class="comment"> *             This function generates data and sends it over the</span>
<a name="l00204"></a>00204 <span class="comment"> *             protosocket. This can be used to dynamically generate</span>
<a name="l00205"></a>00205 <span class="comment"> *             data for a transmission, instead of generating the data</span>
<a name="l00206"></a>00206 <span class="comment"> *             in a buffer beforehand. This function reduces the need for</span>
<a name="l00207"></a>00207 <span class="comment"> *             buffer memory. The generator function is implemented by</span>
<a name="l00208"></a>00208 <span class="comment"> *             the application, and a pointer to the function is given</span>
<a name="l00209"></a>00209 <span class="comment"> *             as an argument with the call to PSOCK_GENERATOR_SEND().</span>
<a name="l00210"></a>00210 <span class="comment"> *</span>
<a name="l00211"></a>00211 <span class="comment"> *             The generator function should place the generated data</span>
<a name="l00212"></a>00212 <span class="comment"> *             directly in the uip_appdata buffer, and return the</span>
<a name="l00213"></a>00213 <span class="comment"> *             length of the generated data. The generator function is</span>
<a name="l00214"></a>00214 <span class="comment"> *             called by the protosocket layer when the data first is</span>
<a name="l00215"></a>00215 <span class="comment"> *             sent, and once for every retransmission that is needed.</span>
<a name="l00216"></a>00216 <span class="comment"> *</span>
<a name="l00217"></a>00217 <span class="comment"> * \hideinitializer</span>
<a name="l00218"></a>00218 <span class="comment"> */</span>
<a name="l00219"></a><a class="code" href="a00158.html#g10d9a9201cba1a6db623284c475c6cea">00219</a> <span class="preprocessor">#define PSOCK_GENERATOR_SEND(psock, generator, arg)     \</span>
<a name="l00220"></a>00220 <span class="preprocessor">    PT_WAIT_THREAD(&amp;((psock)-&gt;pt),                                      \</span>
<a name="l00221"></a>00221 <span class="preprocessor">                   psock_generator_send(psock, generator, arg))</span>
<a name="l00222"></a>00222 <span class="preprocessor"></span>
<a name="l00223"></a>00223 <span class="comment"></span>
<a name="l00224"></a>00224 <span class="comment">/**</span>
<a name="l00225"></a>00225 <span class="comment"> * Close a protosocket.</span>
<a name="l00226"></a>00226 <span class="comment"> *</span>
<a name="l00227"></a>00227 <span class="comment"> * This macro closes a protosocket and can only be called from within the</span>
<a name="l00228"></a>00228 <span class="comment"> * protothread in which the protosocket lives.</span>
<a name="l00229"></a>00229 <span class="comment"> *</span>
<a name="l00230"></a>00230 <span class="comment"> * \param psock (struct psock *) A pointer to the protosocket that is to</span>
<a name="l00231"></a>00231 <span class="comment"> * be closed.</span>
<a name="l00232"></a>00232 <span class="comment"> *</span>
<a name="l00233"></a>00233 <span class="comment"> * \hideinitializer</span>
<a name="l00234"></a>00234 <span class="comment"> */</span>
<a name="l00235"></a><a class="code" href="a00158.html#g5d56800f82bfc7bbf53bb4a659589812">00235</a> <span class="preprocessor">#define PSOCK_CLOSE(psock) uip_close()</span>
<a name="l00236"></a>00236 <span class="preprocessor"></span>
<a name="l00237"></a>00237 <a class="code" href="a00142.html#g3d4c8bd4aada659eb34f5d2ffd3e7901">PT_THREAD</a>(psock_readbuf(<span class="keyword">struct</span> psock *psock));<span class="comment"></span>
<a name="l00238"></a>00238 <span class="comment">/**</span>
<a name="l00239"></a>00239 <span class="comment"> * Read data until the buffer is full.</span>
<a name="l00240"></a>00240 <span class="comment"> *</span>
<a name="l00241"></a>00241 <span class="comment"> * This macro will block waiting for data and read the data into the</span>
<a name="l00242"></a>00242 <span class="comment"> * input buffer specified with the call to PSOCK_INIT(). Data is read</span>
<a name="l00243"></a>00243 <span class="comment"> * until the buffer is full..</span>
<a name="l00244"></a>00244 <span class="comment"> *</span>
<a name="l00245"></a>00245 <span class="comment"> * \param psock (struct psock *) A pointer to the protosocket from which</span>
<a name="l00246"></a>00246 <span class="comment"> * data should be read.</span>
<a name="l00247"></a>00247 <span class="comment"> *</span>
<a name="l00248"></a>00248 <span class="comment"> * \hideinitializer</span>
<a name="l00249"></a>00249 <span class="comment"> */</span>
<a name="l00250"></a><a class="code" href="a00158.html#gd895ab98c54d9966ff554aa873151751">00250</a> <span class="preprocessor">#define PSOCK_READBUF(psock)                            \</span>
<a name="l00251"></a>00251 <span class="preprocessor">  PT_WAIT_THREAD(&amp;((psock)-&gt;pt), psock_readbuf(psock))</span>
<a name="l00252"></a>00252 <span class="preprocessor"></span>
<a name="l00253"></a>00253 <a class="code" href="a00142.html#g3d4c8bd4aada659eb34f5d2ffd3e7901">PT_THREAD</a>(psock_readto(<span class="keyword">struct</span> psock *psock, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> c));<span class="comment"></span>
<a name="l00254"></a>00254 <span class="comment">/**</span>
<a name="l00255"></a>00255 <span class="comment"> * Read data up to a specified character.</span>
<a name="l00256"></a>00256 <span class="comment"> *</span>
<a name="l00257"></a>00257 <span class="comment"> * This macro will block waiting for data and read the data into the</span>
<a name="l00258"></a>00258 <span class="comment"> * input buffer specified with the call to PSOCK_INIT(). Data is only</span>
<a name="l00259"></a>00259 <span class="comment"> * read until the specifieed character appears in the data stream.</span>
<a name="l00260"></a>00260 <span class="comment"> *</span>
<a name="l00261"></a>00261 <span class="comment"> * \param psock (struct psock *) A pointer to the protosocket from which</span>
<a name="l00262"></a>00262 <span class="comment"> * data should be read.</span>
<a name="l00263"></a>00263 <span class="comment"> *</span>
<a name="l00264"></a>00264 <span class="comment"> * \param c (char) The character at which to stop reading.</span>
<a name="l00265"></a>00265 <span class="comment"> *</span>
<a name="l00266"></a>00266 <span class="comment"> * \hideinitializer</span>
<a name="l00267"></a>00267 <span class="comment"> */</span>
<a name="l00268"></a><a class="code" href="a00158.html#gb5d9c0becf7cb32d0aaef466839dd92e">00268</a> <span class="preprocessor">#define PSOCK_READTO(psock, c)                          \</span>
<a name="l00269"></a>00269 <span class="preprocessor">  PT_WAIT_THREAD(&amp;((psock)-&gt;pt), psock_readto(psock, c))</span>
<a name="l00270"></a>00270 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00271"></a>00271 <span class="comment">/**</span>
<a name="l00272"></a>00272 <span class="comment"> * The length of the data that was previously read.</span>
<a name="l00273"></a>00273 <span class="comment"> *</span>
<a name="l00274"></a>00274 <span class="comment"> * This macro returns the length of the data that was previously read</span>
<a name="l00275"></a>00275 <span class="comment"> * using PSOCK_READTO() or PSOCK_READ().</span>
<a name="l00276"></a>00276 <span class="comment"> *</span>
<a name="l00277"></a>00277 <span class="comment"> * \param psock (struct psock *) A pointer to the protosocket holding the data.</span>
<a name="l00278"></a>00278 <span class="comment"> *</span>
<a name="l00279"></a>00279 <span class="comment"> * \hideinitializer</span>
<a name="l00280"></a>00280 <span class="comment"> */</span>
<a name="l00281"></a><a class="code" href="a00158.html#g4ab2de595d36e9e55dd61f6ecd139162">00281</a> <span class="preprocessor">#define PSOCK_DATALEN(psock) psock_datalen(psock)</span>
<a name="l00282"></a>00282 <span class="preprocessor"></span>
<a name="l00283"></a>00283 <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> <a class="code" href="a00158.html#g3178402dd725776415bf9745e7bf92ba">psock_datalen</a>(<span class="keyword">struct</span> psock *psock);
<a name="l00284"></a>00284 <span class="comment"></span>
<a name="l00285"></a>00285 <span class="comment">/**</span>
<a name="l00286"></a>00286 <span class="comment"> * Exit the protosocket's protothread.</span>
<a name="l00287"></a>00287 <span class="comment"> *</span>
<a name="l00288"></a>00288 <span class="comment"> * This macro terminates the protothread of the protosocket and should</span>
<a name="l00289"></a>00289 <span class="comment"> * almost always be used in conjunction with PSOCK_CLOSE().</span>
<a name="l00290"></a>00290 <span class="comment"> *</span>
<a name="l00291"></a>00291 <span class="comment"> * \sa PSOCK_CLOSE_EXIT()</span>
<a name="l00292"></a>00292 <span class="comment"> *</span>
<a name="l00293"></a>00293 <span class="comment"> * \param psock (struct psock *) A pointer to the protosocket.</span>
<a name="l00294"></a>00294 <span class="comment"> *</span>
<a name="l00295"></a>00295 <span class="comment"> * \hideinitializer</span>
<a name="l00296"></a>00296 <span class="comment"> */</span>
<a name="l00297"></a><a class="code" href="a00158.html#gfa11b2a1faf395ae2a6626e01c482d5d">00297</a> <span class="preprocessor">#define PSOCK_EXIT(psock) PT_EXIT(&amp;((psock)-&gt;pt))</span>
<a name="l00298"></a>00298 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00299"></a>00299 <span class="comment">/**</span>
<a name="l00300"></a>00300 <span class="comment"> * Close a protosocket and exit the protosocket's protothread.</span>
<a name="l00301"></a>00301 <span class="comment"> *</span>
<a name="l00302"></a>00302 <span class="comment"> * This macro closes a protosocket and exits the protosocket's protothread.</span>
<a name="l00303"></a>00303 <span class="comment"> *</span>
<a name="l00304"></a>00304 <span class="comment"> * \param psock (struct psock *) A pointer to the protosocket.</span>
<a name="l00305"></a>00305 <span class="comment"> *</span>
<a name="l00306"></a>00306 <span class="comment"> * \hideinitializer</span>
<a name="l00307"></a>00307 <span class="comment"> */</span>
<a name="l00308"></a><a class="code" href="a00158.html#gc7cc1dba1819f7fcdaa9ff9eed5a08f4">00308</a> <span class="preprocessor">#define PSOCK_CLOSE_EXIT(psock)         \</span>
<a name="l00309"></a>00309 <span class="preprocessor">  do {                                          \</span>
<a name="l00310"></a>00310 <span class="preprocessor">    PSOCK_CLOSE(psock);                 \</span>
<a name="l00311"></a>00311 <span class="preprocessor">    PSOCK_EXIT(psock);                  \</span>
<a name="l00312"></a>00312 <span class="preprocessor">  } while(0)</span>
<a name="l00313"></a>00313 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00314"></a>00314 <span class="comment">/**</span>
<a name="l00315"></a>00315 <span class="comment"> * Declare the end of a protosocket's protothread.</span>
<a name="l00316"></a>00316 <span class="comment"> *</span>
<a name="l00317"></a>00317 <span class="comment"> * This macro is used for declaring that the protosocket's protothread</span>
<a name="l00318"></a>00318 <span class="comment"> * ends. It must always be used together with a matching PSOCK_BEGIN()</span>
<a name="l00319"></a>00319 <span class="comment"> * macro.</span>
<a name="l00320"></a>00320 <span class="comment"> *</span>
<a name="l00321"></a>00321 <span class="comment"> * \param psock (struct psock *) A pointer to the protosocket.</span>
<a name="l00322"></a>00322 <span class="comment"> *</span>
<a name="l00323"></a>00323 <span class="comment"> * \hideinitializer</span>
<a name="l00324"></a>00324 <span class="comment"> */</span>
<a name="l00325"></a><a class="code" href="a00158.html#g4a264bb64ae706d53f572b1d9e4037a2">00325</a> <span class="preprocessor">#define PSOCK_END(psock) PT_END(&amp;((psock)-&gt;pt))</span>
<a name="l00326"></a>00326 <span class="preprocessor"></span>
<a name="l00327"></a>00327 <span class="keywordtype">char</span> <a class="code" href="a00158.html#g3b19f65e48079d8105be2a99b5b4b2ae">psock_newdata</a>(<span class="keyword">struct</span> psock *s);
<a name="l00328"></a>00328 <span class="comment"></span>
<a name="l00329"></a>00329 <span class="comment">/**</span>
<a name="l00330"></a>00330 <span class="comment"> * Check if new data has arrived on a protosocket.</span>
<a name="l00331"></a>00331 <span class="comment"> *</span>
<a name="l00332"></a>00332 <span class="comment"> * This macro is used in conjunction with the PSOCK_WAIT_UNTIL()</span>
<a name="l00333"></a>00333 <span class="comment"> * macro to check if data has arrived on a protosocket.</span>
<a name="l00334"></a>00334 <span class="comment"> *</span>
<a name="l00335"></a>00335 <span class="comment"> * \param psock (struct psock *) A pointer to the protosocket.</span>
<a name="l00336"></a>00336 <span class="comment"> *</span>
<a name="l00337"></a>00337 <span class="comment"> * \hideinitializer</span>
<a name="l00338"></a>00338 <span class="comment"> */</span>
<a name="l00339"></a><a class="code" href="a00158.html#g55ce98ea4d6f22e9d5068b904d4d2447">00339</a> <span class="preprocessor">#define PSOCK_NEWDATA(psock) psock_newdata(psock)</span>
<a name="l00340"></a>00340 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00341"></a>00341 <span class="comment">/**</span>
<a name="l00342"></a>00342 <span class="comment"> * Wait until a condition is true.</span>
<a name="l00343"></a>00343 <span class="comment"> *</span>
<a name="l00344"></a>00344 <span class="comment"> * This macro blocks the protothread until the specified condition is</span>
<a name="l00345"></a>00345 <span class="comment"> * true. The macro PSOCK_NEWDATA() can be used to check if new data</span>
<a name="l00346"></a>00346 <span class="comment"> * arrives when the protosocket is waiting.</span>
<a name="l00347"></a>00347 <span class="comment"> *</span>
<a name="l00348"></a>00348 <span class="comment"> * Typically, this macro is used as follows:</span>
<a name="l00349"></a>00349 <span class="comment"> *</span>
<a name="l00350"></a>00350 <span class="comment"> \code</span>
<a name="l00351"></a>00351 <span class="comment"> PT_THREAD(thread(struct psock *s, struct timer *t))</span>
<a name="l00352"></a>00352 <span class="comment"> {</span>
<a name="l00353"></a>00353 <span class="comment">   PSOCK_BEGIN(s);</span>
<a name="l00354"></a>00354 <span class="comment"></span>
<a name="l00355"></a>00355 <span class="comment">   PSOCK_WAIT_UNTIL(s, PSOCK_NEWADATA(s) || timer_expired(t));</span>
<a name="l00356"></a>00356 <span class="comment">   </span>
<a name="l00357"></a>00357 <span class="comment">   if(PSOCK_NEWDATA(s)) {</span>
<a name="l00358"></a>00358 <span class="comment">     PSOCK_READTO(s, '\n');</span>
<a name="l00359"></a>00359 <span class="comment">   } else {</span>
<a name="l00360"></a>00360 <span class="comment">     handle_timed_out(s);</span>
<a name="l00361"></a>00361 <span class="comment">   }</span>
<a name="l00362"></a>00362 <span class="comment">   </span>
<a name="l00363"></a>00363 <span class="comment">   PSOCK_END(s);</span>
<a name="l00364"></a>00364 <span class="comment"> }</span>
<a name="l00365"></a>00365 <span class="comment"> \endcode</span>
<a name="l00366"></a>00366 <span class="comment"> *</span>
<a name="l00367"></a>00367 <span class="comment"> * \param psock (struct psock *) A pointer to the protosocket.</span>
<a name="l00368"></a>00368 <span class="comment"> * \param condition The condition to wait for.</span>
<a name="l00369"></a>00369 <span class="comment"> *</span>
<a name="l00370"></a>00370 <span class="comment"> * \hideinitializer</span>
<a name="l00371"></a>00371 <span class="comment"> */</span>
<a name="l00372"></a><a class="code" href="a00158.html#g2ebfe5c8a7f3173714efdf2df74fc392">00372</a> <span class="preprocessor">#define PSOCK_WAIT_UNTIL(psock, condition)    \</span>
<a name="l00373"></a>00373 <span class="preprocessor">  PT_WAIT_UNTIL(&amp;((psock)-&gt;pt), (condition));</span>
<a name="l00374"></a>00374 <span class="preprocessor"></span>
<a name="l00375"></a><a class="code" href="a00158.html#ga87ff36af81990e6ffe20d76d5e4606f">00375</a> <span class="preprocessor">#define PSOCK_WAIT_THREAD(psock, condition)   \</span>
<a name="l00376"></a>00376 <span class="preprocessor">  PT_WAIT_THREAD(&amp;((psock)-&gt;pt), (condition))</span>
<a name="l00377"></a>00377 <span class="preprocessor"></span>
<a name="l00378"></a>00378 <span class="preprocessor">#endif </span><span class="comment">/* __PSOCK_H__ */</span>
<a name="l00379"></a>00379 <span class="comment"></span>
<a name="l00380"></a>00380 <span class="comment">/** @} */</span>
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
</body>
</html>