1
0
Эх сурвалжийг харах

Merge remote-tracking branch 'bernard/master'

bernard 10 жил өмнө
parent
commit
72298bac32

+ 4 - 0
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)

+ 5 - 5
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;

+ 32 - 5
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)

+ 19 - 0
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);

+ 3 - 3
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;
 

+ 1 - 1
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);