Przeglądaj źródła

Merge pull request #3755 from luhuadong/develop

[at_socket] support alloc socket dynamically with at device
Bernard Xiong 4 lat temu
rodzic
commit
688a9f7b1e

+ 1 - 1
components/net/at/Kconfig

@@ -82,7 +82,7 @@ if RT_USING_AT
 
     config AT_SW_VERSION_NUM
         hex
-        default 0x10300
+        default 0x10301
         help
             software module version number
 

+ 15 - 8
components/net/at/at_socket/at_socket.c

@@ -302,7 +302,7 @@ static int alloc_empty_socket(rt_slist_t *l)
     return idx;
 }
 
-static struct at_socket *alloc_socket_by_device(struct at_device *device)
+static struct at_socket *alloc_socket_by_device(struct at_device *device, enum at_socket_type type)
 {
     static rt_mutex_t at_slock = RT_NULL;
     struct at_socket *sock = RT_NULL;
@@ -323,14 +323,21 @@ static struct at_socket *alloc_socket_by_device(struct at_device *device)
     rt_mutex_take(at_slock, RT_WAITING_FOREVER);
 
     /* find an empty at socket entry */
-    for (idx = 0; idx < device->class->socket_num && device->sockets[idx].magic; idx++);
+    if (device->class->socket_ops->at_socket != RT_NULL)
+    {
+        idx = device->class->socket_ops->at_socket(device, type);
+    }
+    else
+    {
+        for (idx = 0; idx < device->class->socket_num && device->sockets[idx].magic; idx++);
+    }
 
     /* can't find an empty protocol family entry */
-    if (idx == device->class->socket_num)
+    if (idx < 0 || idx >= device->class->socket_num)
     {
         goto __err;
     }
-
+    
     sock = &(device->sockets[idx]);
     /* the socket descriptor is the number of sockte lists */
     sock->socket = alloc_empty_socket(&(sock->list));
@@ -374,7 +381,7 @@ __err:
     return RT_NULL;
 }
 
-static struct at_socket *alloc_socket(void)
+static struct at_socket *alloc_socket(enum at_socket_type type)
 {
     extern struct netdev *netdev_default;
     struct netdev *netdev = RT_NULL;
@@ -401,7 +408,7 @@ static struct at_socket *alloc_socket(void)
         return RT_NULL;
     }
 
-    return alloc_socket_by_device(device);
+    return alloc_socket_by_device(device, type);
 }
 
 static void at_recv_notice_cb(struct at_socket *sock, at_socket_evt_t event, const char *buff, size_t bfsz);
@@ -433,7 +440,7 @@ int at_socket(int domain, int type, int protocol)
     }
 
     /* allocate and initialize a new AT socket */
-    sock = alloc_socket();
+    sock = alloc_socket(socket_type);
     if (sock == RT_NULL)
     {
         return -1;
@@ -615,7 +622,7 @@ int at_bind(int socket, const struct sockaddr *name, socklen_t namelen)
         }
 
         /* allocate new socket */
-        new_sock = alloc_socket_by_device(new_device);
+        new_sock = alloc_socket_by_device(new_device, type);
         if (new_sock == RT_NULL)
         {
             return -1;

+ 2 - 0
components/net/at/at_socket/at_socket.h

@@ -56,6 +56,7 @@ typedef enum
 } at_socket_evt_t;
 
 struct at_socket;
+struct at_device;
 
 typedef void (*at_evt_cb_t)(struct at_socket *socket, at_socket_evt_t event, const char *buff, size_t bfsz);
 
@@ -70,6 +71,7 @@ struct at_socket_ops
     int (*at_send)(struct at_socket *socket, const char *buff, size_t bfsz, enum at_socket_type type);
     int (*at_domain_resolve)(const char *name, char ip[16]);
     void (*at_set_event_cb)(at_socket_evt_t event, at_evt_cb_t cb);
+    int (*at_socket)(struct at_device *device, enum at_socket_type type);
 };
 
 /* AT receive package list structure */

+ 1 - 1
components/net/at/include/at.h

@@ -18,7 +18,7 @@
 extern "C" {
 #endif
 
-#define AT_SW_VERSION                  "1.3.0"
+#define AT_SW_VERSION                  "1.3.1"
 
 #define AT_CMD_NAME_LEN                16
 #define AT_END_MARK_LEN                4