mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2025-01-18 13:33:31 +08:00
Merge pull request #3755 from luhuadong/develop
[at_socket] support alloc socket dynamically with at device
This commit is contained in:
commit
688a9f7b1e
@ -82,7 +82,7 @@ if RT_USING_AT
|
|||||||
|
|
||||||
config AT_SW_VERSION_NUM
|
config AT_SW_VERSION_NUM
|
||||||
hex
|
hex
|
||||||
default 0x10300
|
default 0x10301
|
||||||
help
|
help
|
||||||
software module version number
|
software module version number
|
||||||
|
|
||||||
|
@ -302,7 +302,7 @@ static int alloc_empty_socket(rt_slist_t *l)
|
|||||||
return idx;
|
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;
|
static rt_mutex_t at_slock = RT_NULL;
|
||||||
struct at_socket *sock = 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);
|
rt_mutex_take(at_slock, RT_WAITING_FOREVER);
|
||||||
|
|
||||||
/* find an empty at socket entry */
|
/* 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 */
|
/* can't find an empty protocol family entry */
|
||||||
if (idx == device->class->socket_num)
|
if (idx < 0 || idx >= device->class->socket_num)
|
||||||
{
|
{
|
||||||
goto __err;
|
goto __err;
|
||||||
}
|
}
|
||||||
|
|
||||||
sock = &(device->sockets[idx]);
|
sock = &(device->sockets[idx]);
|
||||||
/* the socket descriptor is the number of sockte lists */
|
/* the socket descriptor is the number of sockte lists */
|
||||||
sock->socket = alloc_empty_socket(&(sock->list));
|
sock->socket = alloc_empty_socket(&(sock->list));
|
||||||
@ -374,7 +381,7 @@ __err:
|
|||||||
return RT_NULL;
|
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;
|
extern struct netdev *netdev_default;
|
||||||
struct netdev *netdev = RT_NULL;
|
struct netdev *netdev = RT_NULL;
|
||||||
@ -401,7 +408,7 @@ static struct at_socket *alloc_socket(void)
|
|||||||
return RT_NULL;
|
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);
|
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 */
|
/* allocate and initialize a new AT socket */
|
||||||
sock = alloc_socket();
|
sock = alloc_socket(socket_type);
|
||||||
if (sock == RT_NULL)
|
if (sock == RT_NULL)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
@ -615,7 +622,7 @@ int at_bind(int socket, const struct sockaddr *name, socklen_t namelen)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* allocate new socket */
|
/* 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)
|
if (new_sock == RT_NULL)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -56,6 +56,7 @@ typedef enum
|
|||||||
} at_socket_evt_t;
|
} at_socket_evt_t;
|
||||||
|
|
||||||
struct at_socket;
|
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);
|
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_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]);
|
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);
|
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 */
|
/* AT receive package list structure */
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define AT_SW_VERSION "1.3.0"
|
#define AT_SW_VERSION "1.3.1"
|
||||||
|
|
||||||
#define AT_CMD_NAME_LEN 16
|
#define AT_CMD_NAME_LEN 16
|
||||||
#define AT_END_MARK_LEN 4
|
#define AT_END_MARK_LEN 4
|
||||||
|
Loading…
x
Reference in New Issue
Block a user