summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/dfs/src/dfs.c4
-rw-r--r--components/drivers/src/ringbuffer.c10
-rw-r--r--components/net/lwip-1.4.1/src/core/ipv4/ip.c37
-rw-r--r--components/net/lwip_nat/README.md19
-rw-r--r--components/net/lwip_nat/ipv4_nat.c6
-rw-r--r--components/net/lwip_nat/ipv4_nat.h2
6 files changed, 64 insertions, 14 deletions
diff --git a/components/dfs/src/dfs.c b/components/dfs/src/dfs.c
index 4e38615ba7..7e56137aba 100644
--- a/components/dfs/src/dfs.c
+++ b/components/dfs/src/dfs.c
@@ -234,7 +234,11 @@ int fd_is_open(const char *pathname)
mountpath = fullpath + strlen(fs->path);
dfs_lock();
+#ifdef DFS_USING_STDIO
+ for (index = 3; index < DFS_FD_MAX+3; index++)
+#else
for (index = 0; index < DFS_FD_MAX; index++)
+#endif
{
fd = &(fd_table[index]);
if (fd->fs == RT_NULL)
diff --git a/components/drivers/src/ringbuffer.c b/components/drivers/src/ringbuffer.c
index 6212b10258..8c2705ceb1 100644
--- a/components/drivers/src/ringbuffer.c
+++ b/components/drivers/src/ringbuffer.c
@@ -100,13 +100,13 @@ rt_size_t rt_ringbuffer_put_force(struct rt_ringbuffer *rb,
const rt_uint8_t *ptr,
rt_uint16_t length)
{
- enum rt_ringbuffer_state old_state;
+ rt_uint16_t space_length;
RT_ASSERT(rb != RT_NULL);
- old_state = rt_ringbuffer_status(rb);
+ space_length = rt_ringbuffer_space_len(rb);
- if (length > rb->buffer_size)
+ if (length > space_length)
length = rb->buffer_size;
if (rb->buffer_size - rb->write_index > length)
@@ -117,7 +117,7 @@ rt_size_t rt_ringbuffer_put_force(struct rt_ringbuffer *rb,
* length of data in current mirror */
rb->write_index += length;
- if (old_state == RT_RINGBUFFER_FULL)
+ if (length > space_length)
rb->read_index = rb->write_index;
return length;
@@ -134,7 +134,7 @@ rt_size_t rt_ringbuffer_put_force(struct rt_ringbuffer *rb,
rb->write_mirror = ~rb->write_mirror;
rb->write_index = length - (rb->buffer_size - rb->write_index);
- if (old_state == RT_RINGBUFFER_FULL)
+ if (length > space_length)
{
rb->read_mirror = ~rb->read_mirror;
rb->read_index = rb->write_index;
diff --git a/components/net/lwip-1.4.1/src/core/ipv4/ip.c b/components/net/lwip-1.4.1/src/core/ipv4/ip.c
index 95d2db404c..17bcd3929a 100644
--- a/components/net/lwip-1.4.1/src/core/ipv4/ip.c
+++ b/components/net/lwip-1.4.1/src/core/ipv4/ip.c
@@ -312,6 +312,11 @@ ip_input(struct pbuf *p, struct netif *inp)
int check_ip_src=1;
#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
+#if IP_NAT
+ extern u8_t ip_nat_input(struct pbuf *p);
+ extern u8_t ip_nat_out(struct pbuf *p);
+#endif
+
IP_STATS_INC(ip.recv);
snmp_inc_ipinreceives();
@@ -487,15 +492,30 @@ ip_input(struct pbuf *p, struct netif *inp)
/* packet not for us? */
if (netif == NULL) {
+#if IP_FORWARD || IP_NAT
+ u8_t taken = 0;
+#endif /* IP_FORWARD || IP_NAT */
/* packet not for us, route or discard */
LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: packet not for us.\n"));
-#if IP_FORWARD
+#if IP_FORWARD || IP_NAT
/* non-broadcast packet? */
- if (!ip_addr_isbroadcast(&current_iphdr_dest, inp)) {
- /* try to forward IP packet on (other) interfaces */
- ip_forward(p, iphdr, inp);
- } else
+ if (!ip_addr_isbroadcast(&(iphdr->dest), inp)) {
+#if IP_NAT
+ /* check if we want to perform NAT with this packet. */
+ taken = ip_nat_out(p);
+ if (!taken)
+#endif /* IP_NAT */
+ {
+#if IP_FORWARD
+ /* try to forward IP packet on (other) interfaces */
+ if (ip_forward(p, iphdr, inp) != NULL) {
+ taken = 1;
+ }
#endif /* IP_FORWARD */
+ }
+ }
+ if (!taken)
+#endif /* IP_FORWARD || IP_NAT */
{
snmp_inc_ipinaddrerrors();
snmp_inc_ipindiscards();
@@ -553,6 +573,13 @@ ip_input(struct pbuf *p, struct netif *inp)
current_netif = inp;
current_header = iphdr;
+#if IP_NAT
+ if (!ip_addr_isbroadcast(&(iphdr->dest), inp) &&
+ (ip_nat_input(p) != 0)) {
+ LWIP_DEBUGF(IP_DEBUG, ("ip_input: packet consumed by nat layer\n"));
+ } else
+#endif /* IP_NAT */
+
#if LWIP_RAW
/* raw input did not eat the packet? */
if (raw_input(p, inp) == 0)
diff --git a/components/net/lwip_nat/README.md b/components/net/lwip_nat/README.md
new file mode 100644
index 0000000000..9672a11b54
--- /dev/null
+++ b/components/net/lwip_nat/README.md
@@ -0,0 +1,19 @@
+lwIP NAT componenent
+
+If you want to use lwIP NAT componenent, please define LWIP_USING_NAT in rtconfig.h.
+
+In this case the network 213.129.231.168/29 is nat'ed when packets are sent to the
+destination network 10.0.0.0/24 (untypical example - most users will have the other
+way around).
+
+Use following code to add a NAT entry:
+
+ ip_nat_entry_t nat_entry;
+
+ nat_entry.out_if = (struct netif *)&emac_if1;
+ nat_entry.in_if = (struct netif *)&emac_if2;
+ IP4_ADDR(&nat_entry.source_net, 213, 129, 231, 168);
+ IP4_ADDR(&nat_entry.source_netmask, 255, 255, 255, 248);
+ IP4_ADDR(&nat_entry.dest_net, 10, 0, 0, 0);
+ IP4_ADDR(&nat_entry.source_netmask, 255, 0, 0, 0);
+ ip_nat_add(&_nat_entry);
diff --git a/components/net/lwip_nat/ipv4_nat.c b/components/net/lwip_nat/ipv4_nat.c
index ab63c2dafb..8084720fb4 100644
--- a/components/net/lwip_nat/ipv4_nat.c
+++ b/components/net/lwip_nat/ipv4_nat.c
@@ -435,8 +435,8 @@ ip_nat_check_header(struct pbuf *p, u16_t min_size)
* @return 1 if the packet has been consumed (it was a NAT packet),
* 0 if the packet has not been consumed (no NAT packet)
*/
-int
-ip_nat_input(struct pbuf *p, struct netif *inp)
+u8_t
+ip_nat_input(struct pbuf *p)
{
struct ip_hdr *iphdr = (struct ip_hdr*)p->payload;
struct tcp_hdr *tcphdr;
@@ -444,7 +444,7 @@ ip_nat_input(struct pbuf *p, struct netif *inp)
struct icmp_echo_hdr *icmphdr;
nat_entry_t nat_entry;
err_t err;
- int consumed = 0;
+ u8_t consumed = 0;
int i;
struct pbuf *q = NULL;
diff --git a/components/net/lwip_nat/ipv4_nat.h b/components/net/lwip_nat/ipv4_nat.h
index b455d8cbc9..e369c781da 100644
--- a/components/net/lwip_nat/ipv4_nat.h
+++ b/components/net/lwip_nat/ipv4_nat.h
@@ -88,7 +88,7 @@ typedef struct ip_nat_entry
void ip_nat_init(void);
void ip_nat_tmr(void);
-int ip_nat_input(struct pbuf *p, struct netif *inp);
+u8_t ip_nat_input(struct pbuf *p);
u8_t ip_nat_out(struct pbuf *p);
err_t ip_nat_add(const ip_nat_entry_t *new_entry);