uIP 1.0 based webserver for LPC1114 + ENC28J60

Dependencies:   mbed TMP102

Committer:
ban4jp
Date:
Sat Jun 14 16:02:21 2014 +0000
Revision:
0:685224d2f66d
Child:
3:a2715e9c7737
initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ban4jp 0:685224d2f66d 1 /*
ban4jp 0:685224d2f66d 2 * Copyright (c) 2004, Swedish Institute of Computer Science.
ban4jp 0:685224d2f66d 3 * All rights reserved.
ban4jp 0:685224d2f66d 4 *
ban4jp 0:685224d2f66d 5 * Redistribution and use in source and binary forms, with or without
ban4jp 0:685224d2f66d 6 * modification, are permitted provided that the following conditions
ban4jp 0:685224d2f66d 7 * are met:
ban4jp 0:685224d2f66d 8 * 1. Redistributions of source code must retain the above copyright
ban4jp 0:685224d2f66d 9 * notice, this list of conditions and the following disclaimer.
ban4jp 0:685224d2f66d 10 * 2. Redistributions in binary form must reproduce the above copyright
ban4jp 0:685224d2f66d 11 * notice, this list of conditions and the following disclaimer in the
ban4jp 0:685224d2f66d 12 * documentation and/or other materials provided with the distribution.
ban4jp 0:685224d2f66d 13 * 3. Neither the name of the Institute nor the names of its contributors
ban4jp 0:685224d2f66d 14 * may be used to endorse or promote products derived from this software
ban4jp 0:685224d2f66d 15 * without specific prior written permission.
ban4jp 0:685224d2f66d 16 *
ban4jp 0:685224d2f66d 17 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
ban4jp 0:685224d2f66d 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
ban4jp 0:685224d2f66d 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ban4jp 0:685224d2f66d 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
ban4jp 0:685224d2f66d 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
ban4jp 0:685224d2f66d 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
ban4jp 0:685224d2f66d 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
ban4jp 0:685224d2f66d 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
ban4jp 0:685224d2f66d 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
ban4jp 0:685224d2f66d 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
ban4jp 0:685224d2f66d 27 * SUCH DAMAGE.
ban4jp 0:685224d2f66d 28 *
ban4jp 0:685224d2f66d 29 * This file is part of the uIP TCP/IP stack
ban4jp 0:685224d2f66d 30 *
ban4jp 0:685224d2f66d 31 * Author: Adam Dunkels <adam@sics.se>
ban4jp 0:685224d2f66d 32 *
ban4jp 0:685224d2f66d 33 * $Id: psock.c,v 1.2 2006/06/12 08:00:30 adam Exp $
ban4jp 0:685224d2f66d 34 */
ban4jp 0:685224d2f66d 35
ban4jp 0:685224d2f66d 36 #include <stdio.h>
ban4jp 0:685224d2f66d 37 #include <string.h>
ban4jp 0:685224d2f66d 38
ban4jp 0:685224d2f66d 39 #include "uipopt.h"
ban4jp 0:685224d2f66d 40 #include "psock.h"
ban4jp 0:685224d2f66d 41 #include "uip.h"
ban4jp 0:685224d2f66d 42
ban4jp 0:685224d2f66d 43 #define STATE_NONE 0
ban4jp 0:685224d2f66d 44 #define STATE_ACKED 1
ban4jp 0:685224d2f66d 45 #define STATE_READ 2
ban4jp 0:685224d2f66d 46 #define STATE_BLOCKED_NEWDATA 3
ban4jp 0:685224d2f66d 47 #define STATE_BLOCKED_CLOSE 4
ban4jp 0:685224d2f66d 48 #define STATE_BLOCKED_SEND 5
ban4jp 0:685224d2f66d 49 #define STATE_DATA_SENT 6
ban4jp 0:685224d2f66d 50
ban4jp 0:685224d2f66d 51 /*
ban4jp 0:685224d2f66d 52 * Return value of the buffering functions that indicates that a
ban4jp 0:685224d2f66d 53 * buffer was not filled by incoming data.
ban4jp 0:685224d2f66d 54 *
ban4jp 0:685224d2f66d 55 */
ban4jp 0:685224d2f66d 56 #define BUF_NOT_FULL 0
ban4jp 0:685224d2f66d 57 #define BUF_NOT_FOUND 0
ban4jp 0:685224d2f66d 58
ban4jp 0:685224d2f66d 59 /*
ban4jp 0:685224d2f66d 60 * Return value of the buffering functions that indicates that a
ban4jp 0:685224d2f66d 61 * buffer was completely filled by incoming data.
ban4jp 0:685224d2f66d 62 *
ban4jp 0:685224d2f66d 63 */
ban4jp 0:685224d2f66d 64 #define BUF_FULL 1
ban4jp 0:685224d2f66d 65
ban4jp 0:685224d2f66d 66 /*
ban4jp 0:685224d2f66d 67 * Return value of the buffering functions that indicates that an
ban4jp 0:685224d2f66d 68 * end-marker byte was found.
ban4jp 0:685224d2f66d 69 *
ban4jp 0:685224d2f66d 70 */
ban4jp 0:685224d2f66d 71 #define BUF_FOUND 2
ban4jp 0:685224d2f66d 72
ban4jp 0:685224d2f66d 73 /*---------------------------------------------------------------------------*/
ban4jp 0:685224d2f66d 74 static void
ban4jp 0:685224d2f66d 75 buf_setup(struct psock_buf *buf,
ban4jp 0:685224d2f66d 76 u8_t *bufptr, u16_t bufsize)
ban4jp 0:685224d2f66d 77 {
ban4jp 0:685224d2f66d 78 buf->ptr = bufptr;
ban4jp 0:685224d2f66d 79 buf->left = bufsize;
ban4jp 0:685224d2f66d 80 }
ban4jp 0:685224d2f66d 81 /*---------------------------------------------------------------------------*/
ban4jp 0:685224d2f66d 82 static u8_t
ban4jp 0:685224d2f66d 83 buf_bufdata(struct psock_buf *buf, u16_t len,
ban4jp 0:685224d2f66d 84 u8_t **dataptr, u16_t *datalen)
ban4jp 0:685224d2f66d 85 {
ban4jp 0:685224d2f66d 86 if(*datalen < buf->left) {
ban4jp 0:685224d2f66d 87 memcpy(buf->ptr, *dataptr, *datalen);
ban4jp 0:685224d2f66d 88 buf->ptr += *datalen;
ban4jp 0:685224d2f66d 89 buf->left -= *datalen;
ban4jp 0:685224d2f66d 90 *dataptr += *datalen;
ban4jp 0:685224d2f66d 91 *datalen = 0;
ban4jp 0:685224d2f66d 92 return BUF_NOT_FULL;
ban4jp 0:685224d2f66d 93 } else if(*datalen == buf->left) {
ban4jp 0:685224d2f66d 94 memcpy(buf->ptr, *dataptr, *datalen);
ban4jp 0:685224d2f66d 95 buf->ptr += *datalen;
ban4jp 0:685224d2f66d 96 buf->left = 0;
ban4jp 0:685224d2f66d 97 *dataptr += *datalen;
ban4jp 0:685224d2f66d 98 *datalen = 0;
ban4jp 0:685224d2f66d 99 return BUF_FULL;
ban4jp 0:685224d2f66d 100 } else {
ban4jp 0:685224d2f66d 101 memcpy(buf->ptr, *dataptr, buf->left);
ban4jp 0:685224d2f66d 102 buf->ptr += buf->left;
ban4jp 0:685224d2f66d 103 *datalen -= buf->left;
ban4jp 0:685224d2f66d 104 *dataptr += buf->left;
ban4jp 0:685224d2f66d 105 buf->left = 0;
ban4jp 0:685224d2f66d 106 return BUF_FULL;
ban4jp 0:685224d2f66d 107 }
ban4jp 0:685224d2f66d 108 }
ban4jp 0:685224d2f66d 109 /*---------------------------------------------------------------------------*/
ban4jp 0:685224d2f66d 110 static u8_t
ban4jp 0:685224d2f66d 111 buf_bufto(register struct psock_buf *buf, u8_t endmarker,
ban4jp 0:685224d2f66d 112 register u8_t **dataptr, register u16_t *datalen)
ban4jp 0:685224d2f66d 113 {
ban4jp 0:685224d2f66d 114 u8_t c;
ban4jp 0:685224d2f66d 115 while(buf->left > 0 && *datalen > 0) {
ban4jp 0:685224d2f66d 116 c = *buf->ptr = **dataptr;
ban4jp 0:685224d2f66d 117 ++*dataptr;
ban4jp 0:685224d2f66d 118 ++buf->ptr;
ban4jp 0:685224d2f66d 119 --*datalen;
ban4jp 0:685224d2f66d 120 --buf->left;
ban4jp 0:685224d2f66d 121
ban4jp 0:685224d2f66d 122 if(c == endmarker) {
ban4jp 0:685224d2f66d 123 return BUF_FOUND;
ban4jp 0:685224d2f66d 124 }
ban4jp 0:685224d2f66d 125 }
ban4jp 0:685224d2f66d 126
ban4jp 0:685224d2f66d 127 if(*datalen == 0) {
ban4jp 0:685224d2f66d 128 return BUF_NOT_FOUND;
ban4jp 0:685224d2f66d 129 }
ban4jp 0:685224d2f66d 130
ban4jp 0:685224d2f66d 131 while(*datalen > 0) {
ban4jp 0:685224d2f66d 132 c = **dataptr;
ban4jp 0:685224d2f66d 133 --*datalen;
ban4jp 0:685224d2f66d 134 ++*dataptr;
ban4jp 0:685224d2f66d 135
ban4jp 0:685224d2f66d 136 if(c == endmarker) {
ban4jp 0:685224d2f66d 137 return BUF_FOUND | BUF_FULL;
ban4jp 0:685224d2f66d 138 }
ban4jp 0:685224d2f66d 139 }
ban4jp 0:685224d2f66d 140
ban4jp 0:685224d2f66d 141 return BUF_FULL;
ban4jp 0:685224d2f66d 142 }
ban4jp 0:685224d2f66d 143 /*---------------------------------------------------------------------------*/
ban4jp 0:685224d2f66d 144 static char
ban4jp 0:685224d2f66d 145 send_data(register struct psock *s)
ban4jp 0:685224d2f66d 146 {
ban4jp 0:685224d2f66d 147 if(s->state != STATE_DATA_SENT || uip_rexmit()) {
ban4jp 0:685224d2f66d 148 if(s->sendlen > uip_mss()) {
ban4jp 0:685224d2f66d 149 uip_send(s->sendptr, uip_mss());
ban4jp 0:685224d2f66d 150 } else {
ban4jp 0:685224d2f66d 151 uip_send(s->sendptr, s->sendlen);
ban4jp 0:685224d2f66d 152 }
ban4jp 0:685224d2f66d 153 s->state = STATE_DATA_SENT;
ban4jp 0:685224d2f66d 154 return 1;
ban4jp 0:685224d2f66d 155 }
ban4jp 0:685224d2f66d 156 return 0;
ban4jp 0:685224d2f66d 157 }
ban4jp 0:685224d2f66d 158 /*---------------------------------------------------------------------------*/
ban4jp 0:685224d2f66d 159 static char
ban4jp 0:685224d2f66d 160 data_acked(register struct psock *s)
ban4jp 0:685224d2f66d 161 {
ban4jp 0:685224d2f66d 162 if(s->state == STATE_DATA_SENT && uip_acked()) {
ban4jp 0:685224d2f66d 163 if(s->sendlen > uip_mss()) {
ban4jp 0:685224d2f66d 164 s->sendlen -= uip_mss();
ban4jp 0:685224d2f66d 165 s->sendptr += uip_mss();
ban4jp 0:685224d2f66d 166 } else {
ban4jp 0:685224d2f66d 167 s->sendptr += s->sendlen;
ban4jp 0:685224d2f66d 168 s->sendlen = 0;
ban4jp 0:685224d2f66d 169 }
ban4jp 0:685224d2f66d 170 s->state = STATE_ACKED;
ban4jp 0:685224d2f66d 171 return 1;
ban4jp 0:685224d2f66d 172 }
ban4jp 0:685224d2f66d 173 return 0;
ban4jp 0:685224d2f66d 174 }
ban4jp 0:685224d2f66d 175 /*---------------------------------------------------------------------------*/
ban4jp 0:685224d2f66d 176 PT_THREAD(psock_send(register struct psock *s, const char *buf,
ban4jp 0:685224d2f66d 177 unsigned int len))
ban4jp 0:685224d2f66d 178 {
ban4jp 0:685224d2f66d 179 PT_BEGIN(&s->psockpt);
ban4jp 0:685224d2f66d 180
ban4jp 0:685224d2f66d 181 /* If there is no data to send, we exit immediately. */
ban4jp 0:685224d2f66d 182 if(len == 0) {
ban4jp 0:685224d2f66d 183 PT_EXIT(&s->psockpt);
ban4jp 0:685224d2f66d 184 }
ban4jp 0:685224d2f66d 185
ban4jp 0:685224d2f66d 186 /* Save the length of and a pointer to the data that is to be
ban4jp 0:685224d2f66d 187 sent. */
ban4jp 0:685224d2f66d 188 s->sendptr = buf;
ban4jp 0:685224d2f66d 189 s->sendlen = len;
ban4jp 0:685224d2f66d 190
ban4jp 0:685224d2f66d 191 s->state = STATE_NONE;
ban4jp 0:685224d2f66d 192
ban4jp 0:685224d2f66d 193 /* We loop here until all data is sent. The s->sendlen variable is
ban4jp 0:685224d2f66d 194 updated by the data_sent() function. */
ban4jp 0:685224d2f66d 195 while(s->sendlen > 0) {
ban4jp 0:685224d2f66d 196
ban4jp 0:685224d2f66d 197 /*
ban4jp 0:685224d2f66d 198 * The condition for this PT_WAIT_UNTIL is a little tricky: the
ban4jp 0:685224d2f66d 199 * protothread will wait here until all data has been acknowledged
ban4jp 0:685224d2f66d 200 * (data_acked() returns true) and until all data has been sent
ban4jp 0:685224d2f66d 201 * (send_data() returns true). The two functions data_acked() and
ban4jp 0:685224d2f66d 202 * send_data() must be called in succession to ensure that all
ban4jp 0:685224d2f66d 203 * data is sent. Therefore the & operator is used instead of the
ban4jp 0:685224d2f66d 204 * && operator, which would cause only the data_acked() function
ban4jp 0:685224d2f66d 205 * to be called when it returns false.
ban4jp 0:685224d2f66d 206 */
ban4jp 0:685224d2f66d 207 PT_WAIT_UNTIL(&s->psockpt, data_acked(s) & send_data(s));
ban4jp 0:685224d2f66d 208 }
ban4jp 0:685224d2f66d 209
ban4jp 0:685224d2f66d 210 s->state = STATE_NONE;
ban4jp 0:685224d2f66d 211
ban4jp 0:685224d2f66d 212 PT_END(&s->psockpt);
ban4jp 0:685224d2f66d 213 }
ban4jp 0:685224d2f66d 214 /*---------------------------------------------------------------------------*/
ban4jp 0:685224d2f66d 215 PT_THREAD(psock_generator_send(register struct psock *s,
ban4jp 0:685224d2f66d 216 unsigned short (*generate)(void *), void *arg))
ban4jp 0:685224d2f66d 217 {
ban4jp 0:685224d2f66d 218 PT_BEGIN(&s->psockpt);
ban4jp 0:685224d2f66d 219
ban4jp 0:685224d2f66d 220 /* Ensure that there is a generator function to call. */
ban4jp 0:685224d2f66d 221 if(generate == NULL) {
ban4jp 0:685224d2f66d 222 PT_EXIT(&s->psockpt);
ban4jp 0:685224d2f66d 223 }
ban4jp 0:685224d2f66d 224
ban4jp 0:685224d2f66d 225 /* Call the generator function to generate the data in the
ban4jp 0:685224d2f66d 226 uip_appdata buffer. */
ban4jp 0:685224d2f66d 227 s->sendlen = generate(arg);
ban4jp 0:685224d2f66d 228 s->sendptr = uip_appdata;
ban4jp 0:685224d2f66d 229
ban4jp 0:685224d2f66d 230 s->state = STATE_NONE;
ban4jp 0:685224d2f66d 231 do {
ban4jp 0:685224d2f66d 232 /* Call the generator function again if we are called to perform a
ban4jp 0:685224d2f66d 233 retransmission. */
ban4jp 0:685224d2f66d 234 if(uip_rexmit()) {
ban4jp 0:685224d2f66d 235 generate(arg);
ban4jp 0:685224d2f66d 236 }
ban4jp 0:685224d2f66d 237 /* Wait until all data is sent and acknowledged. */
ban4jp 0:685224d2f66d 238 PT_WAIT_UNTIL(&s->psockpt, data_acked(s) & send_data(s));
ban4jp 0:685224d2f66d 239 } while(s->sendlen > 0);
ban4jp 0:685224d2f66d 240
ban4jp 0:685224d2f66d 241 s->state = STATE_NONE;
ban4jp 0:685224d2f66d 242
ban4jp 0:685224d2f66d 243 PT_END(&s->psockpt);
ban4jp 0:685224d2f66d 244 }
ban4jp 0:685224d2f66d 245 /*---------------------------------------------------------------------------*/
ban4jp 0:685224d2f66d 246 u16_t
ban4jp 0:685224d2f66d 247 psock_datalen(struct psock *psock)
ban4jp 0:685224d2f66d 248 {
ban4jp 0:685224d2f66d 249 return psock->bufsize - psock->buf.left;
ban4jp 0:685224d2f66d 250 }
ban4jp 0:685224d2f66d 251 /*---------------------------------------------------------------------------*/
ban4jp 0:685224d2f66d 252 char
ban4jp 0:685224d2f66d 253 psock_newdata(struct psock *s)
ban4jp 0:685224d2f66d 254 {
ban4jp 0:685224d2f66d 255 if(s->readlen > 0) {
ban4jp 0:685224d2f66d 256 /* There is data in the uip_appdata buffer that has not yet been
ban4jp 0:685224d2f66d 257 read with the PSOCK_READ functions. */
ban4jp 0:685224d2f66d 258 return 1;
ban4jp 0:685224d2f66d 259 } else if(s->state == STATE_READ) {
ban4jp 0:685224d2f66d 260 /* All data in uip_appdata buffer already consumed. */
ban4jp 0:685224d2f66d 261 s->state = STATE_BLOCKED_NEWDATA;
ban4jp 0:685224d2f66d 262 return 0;
ban4jp 0:685224d2f66d 263 } else if(uip_newdata()) {
ban4jp 0:685224d2f66d 264 /* There is new data that has not been consumed. */
ban4jp 0:685224d2f66d 265 return 1;
ban4jp 0:685224d2f66d 266 } else {
ban4jp 0:685224d2f66d 267 /* There is no new data. */
ban4jp 0:685224d2f66d 268 return 0;
ban4jp 0:685224d2f66d 269 }
ban4jp 0:685224d2f66d 270 }
ban4jp 0:685224d2f66d 271 /*---------------------------------------------------------------------------*/
ban4jp 0:685224d2f66d 272 PT_THREAD(psock_readto(register struct psock *psock, unsigned char c))
ban4jp 0:685224d2f66d 273 {
ban4jp 0:685224d2f66d 274 PT_BEGIN(&psock->psockpt);
ban4jp 0:685224d2f66d 275
ban4jp 0:685224d2f66d 276 buf_setup(&psock->buf, psock->bufptr, psock->bufsize);
ban4jp 0:685224d2f66d 277
ban4jp 0:685224d2f66d 278 /* XXX: Should add buf_checkmarker() before do{} loop, if
ban4jp 0:685224d2f66d 279 incoming data has been handled while waiting for a write. */
ban4jp 0:685224d2f66d 280
ban4jp 0:685224d2f66d 281 do {
ban4jp 0:685224d2f66d 282 if(psock->readlen == 0) {
ban4jp 0:685224d2f66d 283 PT_WAIT_UNTIL(&psock->psockpt, psock_newdata(psock));
ban4jp 0:685224d2f66d 284 psock->state = STATE_READ;
ban4jp 0:685224d2f66d 285 psock->readptr = (u8_t *)uip_appdata;
ban4jp 0:685224d2f66d 286 psock->readlen = uip_datalen();
ban4jp 0:685224d2f66d 287 }
ban4jp 0:685224d2f66d 288 } while((buf_bufto(&psock->buf, c,
ban4jp 0:685224d2f66d 289 &psock->readptr,
ban4jp 0:685224d2f66d 290 &psock->readlen) & BUF_FOUND) == 0);
ban4jp 0:685224d2f66d 291
ban4jp 0:685224d2f66d 292 if(psock_datalen(psock) == 0) {
ban4jp 0:685224d2f66d 293 psock->state = STATE_NONE;
ban4jp 0:685224d2f66d 294 PT_RESTART(&psock->psockpt);
ban4jp 0:685224d2f66d 295 }
ban4jp 0:685224d2f66d 296 PT_END(&psock->psockpt);
ban4jp 0:685224d2f66d 297 }
ban4jp 0:685224d2f66d 298 /*---------------------------------------------------------------------------*/
ban4jp 0:685224d2f66d 299 PT_THREAD(psock_readbuf(register struct psock *psock))
ban4jp 0:685224d2f66d 300 {
ban4jp 0:685224d2f66d 301 PT_BEGIN(&psock->psockpt);
ban4jp 0:685224d2f66d 302
ban4jp 0:685224d2f66d 303 buf_setup(&psock->buf, psock->bufptr, psock->bufsize);
ban4jp 0:685224d2f66d 304
ban4jp 0:685224d2f66d 305 /* XXX: Should add buf_checkmarker() before do{} loop, if
ban4jp 0:685224d2f66d 306 incoming data has been handled while waiting for a write. */
ban4jp 0:685224d2f66d 307
ban4jp 0:685224d2f66d 308 do {
ban4jp 0:685224d2f66d 309 if(psock->readlen == 0) {
ban4jp 0:685224d2f66d 310 PT_WAIT_UNTIL(&psock->psockpt, psock_newdata(psock));
ban4jp 0:685224d2f66d 311 printf("Waited for newdata\n");
ban4jp 0:685224d2f66d 312 psock->state = STATE_READ;
ban4jp 0:685224d2f66d 313 psock->readptr = (u8_t *)uip_appdata;
ban4jp 0:685224d2f66d 314 psock->readlen = uip_datalen();
ban4jp 0:685224d2f66d 315 }
ban4jp 0:685224d2f66d 316 } while(buf_bufdata(&psock->buf, psock->bufsize,
ban4jp 0:685224d2f66d 317 &psock->readptr,
ban4jp 0:685224d2f66d 318 &psock->readlen) != BUF_FULL);
ban4jp 0:685224d2f66d 319
ban4jp 0:685224d2f66d 320 if(psock_datalen(psock) == 0) {
ban4jp 0:685224d2f66d 321 psock->state = STATE_NONE;
ban4jp 0:685224d2f66d 322 PT_RESTART(&psock->psockpt);
ban4jp 0:685224d2f66d 323 }
ban4jp 0:685224d2f66d 324 PT_END(&psock->psockpt);
ban4jp 0:685224d2f66d 325 }
ban4jp 0:685224d2f66d 326 /*---------------------------------------------------------------------------*/
ban4jp 0:685224d2f66d 327 void
ban4jp 0:685224d2f66d 328 psock_init(register struct psock *psock, char *buffer, unsigned int buffersize)
ban4jp 0:685224d2f66d 329 {
ban4jp 0:685224d2f66d 330 psock->state = STATE_NONE;
ban4jp 0:685224d2f66d 331 psock->readlen = 0;
ban4jp 0:685224d2f66d 332 psock->bufptr = buffer;
ban4jp 0:685224d2f66d 333 psock->bufsize = buffersize;
ban4jp 0:685224d2f66d 334 buf_setup(&psock->buf, buffer, buffersize);
ban4jp 0:685224d2f66d 335 PT_INIT(&psock->pt);
ban4jp 0:685224d2f66d 336 PT_INIT(&psock->psockpt);
ban4jp 0:685224d2f66d 337 }
ban4jp 0:685224d2f66d 338 /*---------------------------------------------------------------------------*/