ReactOS 0.4.16-dev-732-g2d1144a
altcp.c
Go to the documentation of this file.
1
85/*
86 * Copyright (c) 2017 Simon Goldschmidt
87 * All rights reserved.
88 *
89 * Redistribution and use in source and binary forms, with or without modification,
90 * are permitted provided that the following conditions are met:
91 *
92 * 1. Redistributions of source code must retain the above copyright notice,
93 * this list of conditions and the following disclaimer.
94 * 2. Redistributions in binary form must reproduce the above copyright notice,
95 * this list of conditions and the following disclaimer in the documentation
96 * and/or other materials provided with the distribution.
97 * 3. The name of the author may not be used to endorse or promote products
98 * derived from this software without specific prior written permission.
99 *
100 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
101 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
102 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
103 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
104 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
105 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
106 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
107 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
108 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
109 * OF SUCH DAMAGE.
110 *
111 * This file is part of the lwIP TCP/IP stack.
112 *
113 * Author: Simon Goldschmidt <goldsimon@gmx.de>
114 *
115 */
116
117#include "lwip/opt.h"
118
119#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */
120
121#include "lwip/altcp.h"
122#include "lwip/priv/altcp_priv.h"
123#include "lwip/altcp_tcp.h"
124#include "lwip/tcp.h"
125#include "lwip/mem.h"
126
127#include <string.h>
128
129extern const struct altcp_functions altcp_tcp_functions;
130
135struct altcp_pcb *
136altcp_alloc(void)
137{
138 struct altcp_pcb *ret = (struct altcp_pcb *)memp_malloc(MEMP_ALTCP_PCB);
139 if (ret != NULL) {
140 memset(ret, 0, sizeof(struct altcp_pcb));
141 }
142 return ret;
143}
144
148void
149altcp_free(struct altcp_pcb *conn)
150{
151 if (conn) {
152 if (conn->fns && conn->fns->dealloc) {
153 conn->fns->dealloc(conn);
154 }
155 memp_free(MEMP_ALTCP_PCB, conn);
156 }
157}
158
163struct altcp_pcb *
164altcp_new_ip6(altcp_allocator_t *allocator)
165{
167}
168
173struct altcp_pcb *
174altcp_new(altcp_allocator_t *allocator)
175{
177}
178
188struct altcp_pcb *
189altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type)
190{
191 struct altcp_pcb *conn;
192 if (allocator == NULL) {
193 /* no allocator given, create a simple TCP connection */
194 return altcp_tcp_new_ip_type(ip_type);
195 }
196 if (allocator->alloc == NULL) {
197 /* illegal allocator */
198 return NULL;
199 }
200 conn = allocator->alloc(allocator->arg, ip_type);
201 if (conn == NULL) {
202 /* allocation failed */
203 return NULL;
204 }
205 return conn;
206}
207
212void
213altcp_arg(struct altcp_pcb *conn, void *arg)
214{
215 if (conn) {
216 conn->arg = arg;
217 }
218}
219
224void
226{
227 if (conn != NULL) {
228 conn->accept = accept;
229 }
230}
231
236void
238{
239 if (conn) {
240 conn->recv = recv;
241 }
242}
243
248void
250{
251 if (conn) {
252 conn->sent = sent;
253 }
254}
255
260void
262{
263 if (conn) {
264 conn->poll = poll;
265 conn->pollinterval = interval;
266 if (conn->fns && conn->fns->set_poll) {
267 conn->fns->set_poll(conn, interval);
268 }
269 }
270}
271
276void
277altcp_err(struct altcp_pcb *conn, altcp_err_fn err)
278{
279 if (conn) {
280 conn->err = err;
281 }
282}
283
284/* Generic functions calling the "virtual" ones */
285
290void
291altcp_recved(struct altcp_pcb *conn, u16_t len)
292{
293 if (conn && conn->fns && conn->fns->recved) {
294 conn->fns->recved(conn, len);
295 }
296}
297
302err_t
303altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port)
304{
305 if (conn && conn->fns && conn->fns->bind) {
306 return conn->fns->bind(conn, ipaddr, port);
307 }
308 return ERR_VAL;
309}
310
315err_t
317{
318 if (conn && conn->fns && conn->fns->connect) {
319 return conn->fns->connect(conn, ipaddr, port, connected);
320 }
321 return ERR_VAL;
322}
323
328struct altcp_pcb *
330{
331 if (conn && conn->fns && conn->fns->listen) {
332 return conn->fns->listen(conn, backlog, err);
333 }
334 return NULL;
335}
336
341void
342altcp_abort(struct altcp_pcb *conn)
343{
344 if (conn && conn->fns && conn->fns->abort) {
345 conn->fns->abort(conn);
346 }
347}
348
353err_t
354altcp_close(struct altcp_pcb *conn)
355{
356 if (conn && conn->fns && conn->fns->close) {
357 return conn->fns->close(conn);
358 }
359 return ERR_VAL;
360}
361
366err_t
367altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx)
368{
369 if (conn && conn->fns && conn->fns->shutdown) {
370 return conn->fns->shutdown(conn, shut_rx, shut_tx);
371 }
372 return ERR_VAL;
373}
374
379err_t
380altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags)
381{
382 if (conn && conn->fns && conn->fns->write) {
383 return conn->fns->write(conn, dataptr, len, apiflags);
384 }
385 return ERR_VAL;
386}
387
392err_t
393altcp_output(struct altcp_pcb *conn)
394{
395 if (conn && conn->fns && conn->fns->output) {
396 return conn->fns->output(conn);
397 }
398 return ERR_VAL;
399}
400
405u16_t
406altcp_mss(struct altcp_pcb *conn)
407{
408 if (conn && conn->fns && conn->fns->mss) {
409 return conn->fns->mss(conn);
410 }
411 return 0;
412}
413
418u16_t
419altcp_sndbuf(struct altcp_pcb *conn)
420{
421 if (conn && conn->fns && conn->fns->sndbuf) {
422 return conn->fns->sndbuf(conn);
423 }
424 return 0;
425}
426
431u16_t
432altcp_sndqueuelen(struct altcp_pcb *conn)
433{
434 if (conn && conn->fns && conn->fns->sndqueuelen) {
435 return conn->fns->sndqueuelen(conn);
436 }
437 return 0;
438}
439
440void
441altcp_nagle_disable(struct altcp_pcb *conn)
442{
443 if (conn && conn->fns && conn->fns->nagle_disable) {
444 conn->fns->nagle_disable(conn);
445 }
446}
447
448void
449altcp_nagle_enable(struct altcp_pcb *conn)
450{
451 if (conn && conn->fns && conn->fns->nagle_enable) {
452 conn->fns->nagle_enable(conn);
453 }
454}
455
456int
458{
459 if (conn && conn->fns && conn->fns->nagle_disabled) {
460 return conn->fns->nagle_disabled(conn);
461 }
462 return 0;
463}
464
469void
470altcp_setprio(struct altcp_pcb *conn, u8_t prio)
471{
472 if (conn && conn->fns && conn->fns->setprio) {
473 conn->fns->setprio(conn, prio);
474 }
475}
476
477err_t
479{
480 if (conn && conn->fns && conn->fns->addrinfo) {
481 return conn->fns->addrinfo(conn, local, addr, port);
482 }
483 return ERR_VAL;
484}
485
486ip_addr_t *
487altcp_get_ip(struct altcp_pcb *conn, int local)
488{
489 if (conn && conn->fns && conn->fns->getip) {
490 return conn->fns->getip(conn, local);
491 }
492 return NULL;
493}
494
495u16_t
496altcp_get_port(struct altcp_pcb *conn, int local)
497{
498 if (conn && conn->fns && conn->fns->getport) {
499 return conn->fns->getport(conn, local);
500 }
501 return 0;
502}
503
504#if LWIP_TCP_KEEPALIVE
505void
506altcp_keepalive_disable(struct altcp_pcb *conn)
507{
508 if (conn && conn->fns && conn->fns->keepalive_disable) {
509 conn->fns->keepalive_disable(conn);
510 }
511}
512
513void
514altcp_keepalive_enable(struct altcp_pcb *conn, u32_t idle, u32_t intvl, u32_t count)
515{
516 if (conn && conn->fns && conn->fns->keepalive_enable) {
517 conn->fns->keepalive_enable(conn, idle, intvl, count);
518 }
519}
520#endif
521
522#ifdef LWIP_DEBUG
523enum tcp_state
524altcp_dbg_get_tcp_state(struct altcp_pcb *conn)
525{
526 if (conn && conn->fns && conn->fns->dbg_get_tcp_state) {
527 return conn->fns->dbg_get_tcp_state(conn);
528 }
529 return CLOSED;
530}
531#endif
532
533/* Default implementations for the "virtual" functions */
534
535void
536altcp_default_set_poll(struct altcp_pcb *conn, u8_t interval)
537{
538 if (conn && conn->inner_conn) {
539 altcp_poll(conn->inner_conn, conn->poll, interval);
540 }
541}
542
543void
544altcp_default_recved(struct altcp_pcb *conn, u16_t len)
545{
546 if (conn && conn->inner_conn) {
547 altcp_recved(conn->inner_conn, len);
548 }
549}
550
551err_t
552altcp_default_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port)
553{
554 if (conn && conn->inner_conn) {
555 return altcp_bind(conn->inner_conn, ipaddr, port);
556 }
557 return ERR_VAL;
558}
559
560err_t
561altcp_default_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx)
562{
563 if (conn) {
564 if (shut_rx && shut_tx && conn->fns && conn->fns->close) {
565 /* default shutdown for both sides is close */
566 return conn->fns->close(conn);
567 }
568 if (conn->inner_conn) {
569 return altcp_shutdown(conn->inner_conn, shut_rx, shut_tx);
570 }
571 }
572 return ERR_VAL;
573}
574
575err_t
576altcp_default_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags)
577{
578 if (conn && conn->inner_conn) {
579 return altcp_write(conn->inner_conn, dataptr, len, apiflags);
580 }
581 return ERR_VAL;
582}
583
584err_t
585altcp_default_output(struct altcp_pcb *conn)
586{
587 if (conn && conn->inner_conn) {
588 return altcp_output(conn->inner_conn);
589 }
590 return ERR_VAL;
591}
592
593u16_t
594altcp_default_mss(struct altcp_pcb *conn)
595{
596 if (conn && conn->inner_conn) {
597 return altcp_mss(conn->inner_conn);
598 }
599 return 0;
600}
601
602u16_t
603altcp_default_sndbuf(struct altcp_pcb *conn)
604{
605 if (conn && conn->inner_conn) {
606 return altcp_sndbuf(conn->inner_conn);
607 }
608 return 0;
609}
610
611u16_t
612altcp_default_sndqueuelen(struct altcp_pcb *conn)
613{
614 if (conn && conn->inner_conn) {
615 return altcp_sndqueuelen(conn->inner_conn);
616 }
617 return 0;
618}
619
620void
621altcp_default_nagle_disable(struct altcp_pcb *conn)
622{
623 if (conn && conn->inner_conn) {
624 altcp_nagle_disable(conn->inner_conn);
625 }
626}
627
628void
629altcp_default_nagle_enable(struct altcp_pcb *conn)
630{
631 if (conn && conn->inner_conn) {
632 altcp_nagle_enable(conn->inner_conn);
633 }
634}
635
636int
637altcp_default_nagle_disabled(struct altcp_pcb *conn)
638{
639 if (conn && conn->inner_conn) {
640 return altcp_nagle_disabled(conn->inner_conn);
641 }
642 return 0;
643}
644
645void
646altcp_default_setprio(struct altcp_pcb *conn, u8_t prio)
647{
648 if (conn && conn->inner_conn) {
649 altcp_setprio(conn->inner_conn, prio);
650 }
651}
652
653void
654altcp_default_dealloc(struct altcp_pcb *conn)
655{
656 LWIP_UNUSED_ARG(conn);
657 /* nothing to do */
658}
659
660err_t
661altcp_default_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port)
662{
663 if (conn && conn->inner_conn) {
664 return altcp_get_tcp_addrinfo(conn->inner_conn, local, addr, port);
665 }
666 return ERR_VAL;
667}
668
669ip_addr_t *
670altcp_default_get_ip(struct altcp_pcb *conn, int local)
671{
672 if (conn && conn->inner_conn) {
673 return altcp_get_ip(conn->inner_conn, local);
674 }
675 return NULL;
676}
677
678u16_t
679altcp_default_get_port(struct altcp_pcb *conn, int local)
680{
681 if (conn && conn->inner_conn) {
682 return altcp_get_port(conn->inner_conn, local);
683 }
684 return 0;
685}
686
687#if LWIP_TCP_KEEPALIVE
688void
689altcp_default_keepalive_disable(struct altcp_pcb *conn)
690{
691 if (conn && conn->inner_conn) {
692 altcp_keepalive_disable(conn->inner_conn);
693 }
694}
695
696void
697altcp_default_keepalive_enable(struct altcp_pcb *conn, u32_t idle, u32_t intvl, u32_t count)
698{
699 if (conn && conn->inner_conn) {
700 altcp_keepalive_enable(conn->inner_conn, idle, intvl, count);
701 }
702}
703#endif
704
705#ifdef LWIP_DEBUG
706enum tcp_state
707altcp_default_dbg_get_tcp_state(struct altcp_pcb *conn)
708{
709 if (conn && conn->inner_conn) {
710 return altcp_dbg_get_tcp_state(conn->inner_conn);
711 }
712 return CLOSED;
713}
714#endif
715
716
717#endif /* LWIP_ALTCP */
@ sent
Definition: SystemMenu.c:27
#define altcp_accept
Definition: altcp.h:169
#define altcp_new_ip_type(allocator, ip_type)
Definition: altcp.h:166
#define altcp_write
Definition: altcp.h:187
#define altcp_output
Definition: altcp.h:188
#define altcp_poll_fn
Definition: altcp.h:156
#define altcp_get_ip(pcb, local)
Definition: altcp.h:199
#define altcp_sndqueuelen
Definition: altcp.h:192
#define altcp_mss
Definition: altcp.h:190
#define altcp_recv_fn
Definition: altcp.h:154
#define altcp_arg
Definition: altcp.h:168
#define altcp_accept_fn
Definition: altcp.h:152
#define altcp_connect
Definition: altcp.h:177
#define altcp_sndbuf
Definition: altcp.h:191
#define altcp_shutdown
Definition: altcp.h:185
#define altcp_poll
Definition: altcp.h:172
#define altcp_err_fn
Definition: altcp.h:157
#define altcp_sent
Definition: altcp.h:171
#define altcp_nagle_enable
Definition: altcp.h:194
#define altcp_listen_with_backlog_and_err
Definition: altcp.h:179
#define altcp_nagle_disabled
Definition: altcp.h:195
#define altcp_setprio
Definition: altcp.h:196
#define altcp_nagle_disable
Definition: altcp.h:193
#define altcp_get_tcp_addrinfo
Definition: altcp.h:198
#define altcp_err
Definition: altcp.h:173
#define altcp_recv
Definition: altcp.h:170
#define altcp_pcb
Definition: altcp.h:159
#define altcp_sent_fn
Definition: altcp.h:155
#define altcp_close
Definition: altcp.h:184
#define altcp_abort
Definition: altcp.h:183
#define altcp_connected_fn
Definition: altcp.h:153
#define altcp_new(allocator)
Definition: altcp.h:164
#define altcp_recved
Definition: altcp.h:175
#define altcp_new_ip6(allocator)
Definition: altcp.h:165
#define altcp_tcp_new_ip_type
Definition: altcp.h:160
#define altcp_bind
Definition: altcp.h:176
void idle(int argc, const char *argv[])
Definition: cmds.c:1581
#define NULL
Definition: types.h:112
USHORT port
Definition: uri.c:228
INT WSAAPI recv(IN SOCKET s, OUT CHAR FAR *buf, IN INT len, IN INT flags)
Definition: recv.c:23
#define local
Definition: zutil.h:30
int connected
Definition: main.c:61
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum const GLvoid * addr
Definition: glext.h:9621
GLenum GLsizei len
Definition: glext.h:6722
uint32_t u32_t
Definition: arch.h:129
uint8_t u8_t
Definition: arch.h:125
#define LWIP_UNUSED_ARG(x)
Definition: arch.h:373
uint16_t u16_t
Definition: arch.h:127
s8_t err_t
Definition: err.h:96
@ ERR_VAL
Definition: err.h:67
@ IPADDR_TYPE_V6
Definition: ip_addr.h:58
@ IPADDR_TYPE_V4
Definition: ip_addr.h:56
ip6_addr_t ip_addr_t
Definition: ip_addr.h:344
int const JOCTET * dataptr
Definition: jpeglib.h:1031
void * memp_malloc(memp_t type)
Definition: memp.c:337
void memp_free(memp_t type, void *mem)
Definition: memp.c:420
#define err(...)
#define memset(x, y, z)
Definition: compat.h:39
SOCKET WSAAPI accept(IN SOCKET s, OUT LPSOCKADDR addr, OUT INT FAR *addrlen)
Definition: socklife.c:23
int ret
void * arg
Definition: msvc.h:10
#define poll
Definition: wintirpc.h:59