Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
M
mongoose
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
esp
mongoose
Commits
06b430e5
Commit
06b430e5
authored
Oct 26, 2016
by
Alexander Alashkin
Committed by
Cesanta Bot
Oct 26, 2016
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
PIC32 Harmony TCP/IP support basics
PUBLISHED_FROM=31f8f61de954fa3a36ebad162bdb730c0db95b58
parent
f061dcf8
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
277 additions
and
1 deletion
+277
-1
mongoose.c
mongoose.c
+238
-1
mongoose.h
mongoose.h
+39
-0
No files found.
mongoose.c
View file @
06b430e5
...
...
@@ -7866,7 +7866,7 @@ void mg_sock_addr_to_str(const union socket_address *sa, char *buf, size_t len,
if
(
inet_ntop
(
sa
->
sa
.
sa_family
,
addr
,
start
,
capacity
)
==
NULL
)
{
*
buf
=
'\0'
;
}
#elif defined(_WIN32) || MG_LWIP
#elif defined(_WIN32) || MG_LWIP
|| (MG_NET_IF == MG_NET_IF_PIC32_HARMONY)
/* Only Windoze Vista (and newer) have inet_ntop() */
strncpy
(
buf
,
inet_ntoa
(
sa
->
sin
.
sin_addr
),
len
);
#else
...
...
@@ -12316,3 +12316,240 @@ static void mg_gmt_time_string(char *buf, size_t buf_len, time_t *t) {
}
#endif
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/pic32_harmony/pic32_harmony_net_if.c"
#endif
/*
* Copyright (c) 2014-2016 Cesanta Software Limited
* All rights reserved
*/
#if CS_PLATFORM == CS_P_PIC32_HARMONY
int
mg_if_create_conn
(
struct
mg_connection
*
nc
)
{
(
void
)
nc
;
return
1
;
}
void
mg_if_recved
(
struct
mg_connection
*
nc
,
size_t
len
)
{
(
void
)
nc
;
(
void
)
len
;
}
void
mg_ev_mgr_add_conn
(
struct
mg_connection
*
nc
)
{
(
void
)
nc
;
}
void
mg_ev_mgr_init
(
struct
mg_mgr
*
mgr
)
{
(
void
)
mgr
;
(
void
)
mg_get_errno
();
/* Shutup compiler */
}
void
mg_ev_mgr_free
(
struct
mg_mgr
*
mgr
)
{
(
void
)
mgr
;
}
void
mg_ev_mgr_remove_conn
(
struct
mg_connection
*
nc
)
{
(
void
)
nc
;
}
void
mg_if_destroy_conn
(
struct
mg_connection
*
nc
)
{
if
(
nc
->
sock
==
INVALID_SOCKET
)
return
;
/* For UDP, only close outgoing sockets or listeners. */
if
(
!
(
nc
->
flags
&
MG_F_UDP
))
{
/* Close TCP */
TCPIP_TCP_Close
((
TCP_SOCKET
)
nc
->
sock
);
}
else
if
(
nc
->
listener
==
NULL
)
{
/* Only close outgoing UDP or listeners. */
TCPIP_UDP_Close
((
UDP_SOCKET
)
nc
->
sock
);
}
nc
->
sock
=
INVALID_SOCKET
;
}
int
mg_if_listen_udp
(
struct
mg_connection
*
nc
,
union
socket_address
*
sa
)
{
nc
->
sock
=
TCPIP_UDP_ServerOpen
(
sa
->
sin
.
sin_family
==
AF_INET
?
IP_ADDRESS_TYPE_IPV4
:
IP_ADDRESS_TYPE_IPV6
,
ntohs
(
sa
->
sin
.
sin_port
),
sa
->
sin
.
sin_addr
.
s_addr
==
0
?
0
:
(
IP_MULTI_ADDRESS
*
)
&
sa
->
sin
);
if
(
nc
->
sock
==
INVALID_SOCKET
)
{
return
-
1
;
}
return
0
;
}
void
mg_if_udp_send
(
struct
mg_connection
*
nc
,
const
void
*
buf
,
size_t
len
)
{
mbuf_append
(
&
nc
->
send_mbuf
,
buf
,
len
);
}
void
mg_if_tcp_send
(
struct
mg_connection
*
nc
,
const
void
*
buf
,
size_t
len
)
{
mbuf_append
(
&
nc
->
send_mbuf
,
buf
,
len
);
}
int
mg_if_listen_tcp
(
struct
mg_connection
*
nc
,
union
socket_address
*
sa
)
{
nc
->
sock
=
TCPIP_TCP_ServerOpen
(
sa
->
sin
.
sin_family
==
AF_INET
?
IP_ADDRESS_TYPE_IPV4
:
IP_ADDRESS_TYPE_IPV6
,
ntohs
(
sa
->
sin
.
sin_port
),
sa
->
sin
.
sin_addr
.
s_addr
==
0
?
0
:
(
IP_MULTI_ADDRESS
*
)
&
sa
->
sin
);
memcpy
(
&
nc
->
sa
,
sa
,
sizeof
(
*
sa
));
if
(
nc
->
sock
==
INVALID_SOCKET
)
{
return
-
1
;
}
return
0
;
}
static
int
mg_accept_conn
(
struct
mg_connection
*
lc
)
{
struct
mg_connection
*
nc
;
TCP_SOCKET_INFO
si
;
union
socket_address
sa
;
nc
=
mg_if_accept_new_conn
(
lc
);
if
(
nc
==
NULL
)
{
return
0
;
}
nc
->
sock
=
lc
->
sock
;
nc
->
flags
&=
~
MG_F_LISTENING
;
if
(
!
TCPIP_TCP_SocketInfoGet
((
TCP_SOCKET
)
nc
->
sock
,
&
si
))
{
return
0
;
}
if
(
si
.
addressType
==
IP_ADDRESS_TYPE_IPV4
)
{
sa
.
sin
.
sin_family
=
AF_INET
;
sa
.
sin
.
sin_port
=
htons
(
si
.
remotePort
);
sa
.
sin
.
sin_addr
.
s_addr
=
si
.
remoteIPaddress
.
v4Add
.
Val
;
}
else
{
/* TODO(alashkin): do something with _potential_ IPv6 */
memset
(
&
sa
,
0
,
sizeof
(
sa
));
}
mg_if_accept_tcp_cb
(
nc
,
(
union
socket_address
*
)
&
sa
,
sizeof
(
sa
));
return
mg_if_listen_tcp
(
lc
,
&
lc
->
sa
)
>=
0
;
}
char
*
inet_ntoa
(
struct
in_addr
in
)
{
static
char
addr
[
17
];
snprintf
(
addr
,
sizeof
(
addr
),
"%d.%d.%d.%d"
,
(
int
)
in
.
S_un
.
S_un_b
.
s_b1
,
(
int
)
in
.
S_un
.
S_un_b
.
s_b2
,
(
int
)
in
.
S_un
.
S_un_b
.
s_b3
,
(
int
)
in
.
S_un
.
S_un_b
.
s_b4
);
return
addr
;
}
static
void
mg_handle_send
(
struct
mg_connection
*
nc
)
{
uint16_t
bytes_written
=
0
;
if
(
nc
->
flags
&
MG_F_UDP
)
{
bytes_written
=
TCPIP_UDP_TxPutIsReady
((
UDP_SOCKET
)
nc
->
sock
,
0
);
if
(
bytes_written
>=
nc
->
send_mbuf
.
len
)
{
if
(
TCPIP_UDP_ArrayPut
((
UDP_SOCKET
)
nc
->
sock
,
(
uint8_t
*
)
nc
->
send_mbuf
.
buf
,
nc
->
send_mbuf
.
len
)
!=
nc
->
send_mbuf
.
len
)
{
nc
->
flags
|=
MG_F_CLOSE_IMMEDIATELY
;
bytes_written
=
0
;
}
}
}
else
{
bytes_written
=
TCPIP_TCP_FifoTxFreeGet
((
TCP_SOCKET
)
nc
->
sock
);
if
(
bytes_written
!=
0
)
{
if
(
bytes_written
>
nc
->
send_mbuf
.
len
)
{
bytes_written
=
nc
->
send_mbuf
.
len
;
}
if
(
TCPIP_TCP_ArrayPut
((
TCP_SOCKET
)
nc
->
sock
,
(
uint8_t
*
)
nc
->
send_mbuf
.
buf
,
bytes_written
)
!=
bytes_written
)
{
nc
->
flags
|=
MG_F_CLOSE_IMMEDIATELY
;
bytes_written
=
0
;
}
}
}
if
(
bytes_written
!=
0
)
{
mbuf_remove
(
&
nc
->
send_mbuf
,
bytes_written
);
mg_if_sent_cb
(
nc
,
bytes_written
);
}
}
static
void
mg_handle_recv
(
struct
mg_connection
*
nc
)
{
uint16_t
bytes_read
=
0
;
uint8_t
*
buf
=
NULL
;
if
(
nc
->
flags
&
MG_F_UDP
)
{
bytes_read
=
TCPIP_UDP_GetIsReady
((
UDP_SOCKET
)
nc
->
sock
);
if
(
bytes_read
!=
0
&&
(
nc
->
recv_mbuf_limit
==
-
1
||
nc
->
recv_mbuf
.
len
+
bytes_read
<
nc
->
recv_mbuf_limit
))
{
buf
=
(
uint8_t
*
)
MG_MALLOC
(
bytes_read
);
if
(
TCPIP_UDP_ArrayGet
((
UDP_SOCKET
)
nc
->
sock
,
buf
,
bytes_read
)
!=
bytes_read
)
{
nc
->
flags
|=
MG_F_CLOSE_IMMEDIATELY
;
bytes_read
=
0
;
MG_FREE
(
buf
);
}
}
}
else
{
bytes_read
=
TCPIP_TCP_GetIsReady
((
TCP_SOCKET
)
nc
->
sock
);
if
(
bytes_read
!=
0
)
{
if
(
nc
->
recv_mbuf_limit
!=
-
1
&&
nc
->
recv_mbuf_limit
-
nc
->
recv_mbuf
.
len
>
bytes_read
)
{
bytes_read
=
nc
->
recv_mbuf_limit
-
nc
->
recv_mbuf
.
len
;
}
buf
=
(
uint8_t
*
)
MG_MALLOC
(
bytes_read
);
if
(
TCPIP_TCP_ArrayGet
((
TCP_SOCKET
)
nc
->
sock
,
buf
,
bytes_read
)
!=
bytes_read
)
{
nc
->
flags
|=
MG_F_CLOSE_IMMEDIATELY
;
MG_FREE
(
buf
);
bytes_read
=
0
;
}
}
}
if
(
bytes_read
!=
0
)
{
mg_if_recv_tcp_cb
(
nc
,
buf
,
bytes_read
);
}
}
time_t
mg_mgr_poll
(
struct
mg_mgr
*
mgr
,
int
timeout_ms
)
{
double
now
=
mg_time
();
struct
mg_connection
*
nc
,
*
tmp
;
for
(
nc
=
mgr
->
active_connections
;
nc
!=
NULL
;
nc
=
tmp
)
{
tmp
=
nc
->
next
;
if
(
nc
->
flags
&
MG_F_CONNECTING
)
{
/* processing connections */
if
(
nc
->
flags
&
MG_F_UDP
||
TCPIP_TCP_IsConnected
((
TCP_SOCKET
)
nc
->
sock
))
{
mg_if_connect_cb
(
nc
,
0
);
}
}
else
if
(
nc
->
flags
&
MG_F_LISTENING
)
{
if
(
TCPIP_TCP_IsConnected
((
TCP_SOCKET
)
nc
->
sock
))
{
/* accept new connections */
mg_accept_conn
(
nc
);
}
}
else
{
if
(
nc
->
send_mbuf
.
len
!=
0
)
{
mg_handle_send
(
nc
);
}
if
(
nc
->
recv_mbuf_limit
==
-
1
||
nc
->
recv_mbuf
.
len
<
nc
->
recv_mbuf_limit
)
{
mg_handle_recv
(
nc
);
}
}
}
for
(
nc
=
mgr
->
active_connections
;
nc
!=
NULL
;
nc
=
tmp
)
{
tmp
=
nc
->
next
;
if
((
nc
->
flags
&
MG_F_CLOSE_IMMEDIATELY
)
||
(
nc
->
send_mbuf
.
len
==
0
&&
(
nc
->
flags
&
MG_F_SEND_AND_CLOSE
)))
{
mg_close_conn
(
nc
);
}
}
return
now
;
}
#endif
/* CS_PLATFORM == CS_P_PIC32_HARMONY */
mongoose.h
View file @
06b430e5
...
...
@@ -52,6 +52,7 @@
#define CS_P_WINCE 8
#define CS_P_NXP_KINETIS 9
#define CS_P_NRF52 10
#define CS_P_PIC32_HARMONY 11
/* If not specified explicitly, we guess platform by defines. */
#ifndef CS_PLATFORM
...
...
@@ -71,6 +72,8 @@
#define CS_PLATFORM CS_P_MBED
#elif defined(FRDM_K64F) || defined(FREEDOM)
#define CS_PLATFORM CS_P_NXP_KINETIS
#elif defined(PIC32)
#define CS_PLATFORM CS_P_PIC32_HARMONY
#endif
#ifndef CS_PLATFORM
...
...
@@ -82,6 +85,7 @@
#define MG_NET_IF_SOCKET 1
#define MG_NET_IF_SIMPLELINK 2
#define MG_NET_IF_LWIP_LOW_LEVEL 3
#define MG_NET_IF_PIC32_HARMONY 4
/* Amalgamated: #include "common/platforms/platform_unix.h" */
/* Amalgamated: #include "common/platforms/platform_windows.h" */
...
...
@@ -92,6 +96,7 @@
/* Amalgamated: #include "common/platforms/platform_nrf52.h" */
/* Amalgamated: #include "common/platforms/platform_wince.h" */
/* Amalgamated: #include "common/platforms/platform_nxp_kinetis.h" */
/* Amalgamated: #include "common/platforms/platform_pic32_harmony.h" */
/* Common stuff */
...
...
@@ -1191,6 +1196,40 @@ typedef struct stat cs_stat_t;
#endif
/* CS_PLATFORM == CS_P_NXP_KINETIS */
#endif
/* CS_COMMON_PLATFORMS_PLATFORM_NXP_KINETIS_H_ */
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_pic32_harmony.h"
#endif
/*
* Copyright (c) 2014-2016 Cesanta Software Limited
* All rights reserved
*/
#ifndef CS_COMMON_PLATFORMS_PLATFORM_PIC32_HARMONY_H_
#define CS_COMMON_PLATFORMS_PLATFORM_PIC32_HARMONY_H_
#if CS_PLATFORM == CS_P_PIC32_HARMONY
#define MG_NET_IF MG_NET_IF_PIC32_HARMONY
#include <stdint.h>
#include <time.h>
#include <ctype.h>
#include <stdlib.h>
#include <system_config.h>
#include <system_definitions.h>
typedef
TCP_SOCKET
sock_t
;
#define to64(x) strtoll(x, NULL, 10)
#define SIZE_T_FMT "lu"
#define INT64_FMT "lld"
char
*
inet_ntoa
(
struct
in_addr
in
);
#endif
/* CS_PLATFORM == CS_P_PIC32_HARMONY */
#endif
/* CS_COMMON_PLATFORMS_PLATFORM_PIC32_HARMONY_H_ */
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/lwip/mg_lwip.h"
#endif
/*
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment