summaryrefslogtreecommitdiff
path: root/components/net
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2020-07-27 09:12:20 +0800
committerGitHub <[email protected]>2020-07-27 09:12:20 +0800
commit688a9f7b1e549da31ee044a8cf65de1beac18a63 (patch)
treedf2eb030634bac3b13b05283f44b742c37aec13f /components/net
parente22bbf975e46b714b597fa0c69f06eae4cc6826e (diff)
parentf56af401cc4f41b80b4039fd9aabbf42ffa2ed4b (diff)
Merge pull request #3755 from luhuadong/develop
[at_socket] support alloc socket dynamically with at device
Diffstat (limited to 'components/net')
-rw-r--r--components/net/at/Kconfig2
-rw-r--r--components/net/at/at_socket/at_socket.c23
-rw-r--r--components/net/at/at_socket/at_socket.h2
-rw-r--r--components/net/at/include/at.h2
4 files changed, 19 insertions, 10 deletions
diff --git a/components/net/at/Kconfig b/components/net/at/Kconfig
index 92818331af..4aedbb888b 100644
--- a/components/net/at/Kconfig
+++ b/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
diff --git a/components/net/at/at_socket/at_socket.c b/components/net/at/at_socket/at_socket.c
index ca57677daf..666b0f509e 100644
--- a/components/net/at/at_socket/at_socket.c
+++ b/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;
diff --git a/components/net/at/at_socket/at_socket.h b/components/net/at/at_socket/at_socket.h
index d98fa05f24..3317579f05 100644
--- a/components/net/at/at_socket/at_socket.h
+++ b/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 */
diff --git a/components/net/at/include/at.h b/components/net/at/include/at.h
index a7a6aeca7a..2d0e270f6a 100644
--- a/components/net/at/include/at.h
+++ b/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