From 2d67fe65655c1d14d0aa7ba71253de31da591583 Mon Sep 17 00:00:00 2001 From: Bright Pan Date: Fri, 23 Jan 2015 13:27:52 +0800 Subject: [PATCH 1/4] [Driver/ringbuffer]: Fix put_force bug OXape reports: http://www.rt-thread.org/phpBB3/topic3939.html driver/ringbuffer: when data length is bigger than space length for rb, the read_index in rb is not update. When length > space, update the read_index, the bug can be fix, and works fine. --- components/drivers/src/ringbuffer.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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; From eb898f69c97a91a7ac7c813602e1dd560e677911 Mon Sep 17 00:00:00 2001 From: "Aubr.Cool" Date: Tue, 27 Jan 2015 10:58:26 +0800 Subject: [PATCH 2/4] Correct dfs fd_is_open search index error --- components/dfs/src/dfs.c | 4 ++++ 1 file changed, 4 insertions(+) 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) From 627d025cda09850218938a22d86c9d01e9b6d0d2 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Thu, 29 Jan 2015 09:48:48 +0000 Subject: [PATCH 3/4] [lwIP] Modify the ip.c to support NAT --- components/net/lwip-1.4.1/src/core/ipv4/ip.c | 37 +++++++++++++++++--- components/net/lwip_nat/ipv4_nat.c | 6 ++-- components/net/lwip_nat/ipv4_nat.h | 2 +- 3 files changed, 36 insertions(+), 9 deletions(-) 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(¤t_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/ipv4_nat.c b/components/net/lwip_nat/ipv4_nat.c index 63f1b64a3a..58fe18562d 100644 --- a/components/net/lwip_nat/ipv4_nat.c +++ b/components/net/lwip_nat/ipv4_nat.c @@ -434,8 +434,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; @@ -443,7 +443,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); From 7e11b8eb626bf00ddc4a6d29ac54d179455d026c Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Thu, 29 Jan 2015 13:47:57 +0000 Subject: [PATCH 4/4] [lwIP] Add NAT readme --- components/net/lwip_nat/README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 components/net/lwip_nat/README.md 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);