[at_socket] support alloc socket dynamically with at device

This commit is contained in:
luhuadong 2020-07-21 00:29:12 +08:00
parent 8f4333d21f
commit 067106f164
2 changed files with 17 additions and 8 deletions

View File

@ -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;

View File

@ -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);
@ -65,6 +66,7 @@ typedef void (* at_socket_callback)(struct at_socket *conn, int event, uint16_t
/* AT socket operations function */ /* AT socket operations function */
struct at_socket_ops struct at_socket_ops
{ {
int (*at_socket)(struct at_device *device, enum at_socket_type type);
int (*at_connect)(struct at_socket *socket, char *ip, int32_t port, enum at_socket_type type, rt_bool_t is_client); int (*at_connect)(struct at_socket *socket, char *ip, int32_t port, enum at_socket_type type, rt_bool_t is_client);
int (*at_closesocket)(struct at_socket *socket); int (*at_closesocket)(struct at_socket *socket);
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);