|
@@ -25,7 +25,8 @@
|
|
|
|
|
|
#include "mbim.h"
|
|
|
|
|
|
-uint8_t mbim_buffer[MBIM_BUFFER_SIZE];
|
|
|
+size_t mbim_bufsize = 0;
|
|
|
+uint8_t *mbim_buffer = NULL;
|
|
|
static struct uloop_fd mbim_fd;
|
|
|
static uint32_t expected;
|
|
|
int no_close;
|
|
@@ -33,7 +34,7 @@ int no_close;
|
|
|
static void mbim_msg_tout_cb(struct uloop_timeout *t)
|
|
|
{
|
|
|
fprintf(stderr, "ERROR: mbim message timeout\n");
|
|
|
- uloop_end();
|
|
|
+ mbim_end();
|
|
|
}
|
|
|
|
|
|
static struct uloop_timeout tout = {
|
|
@@ -46,7 +47,7 @@ mbim_send(void)
|
|
|
struct mbim_message_header *hdr = (struct mbim_message_header *) mbim_buffer;
|
|
|
int ret = 0;
|
|
|
|
|
|
- if (le32toh(hdr->length) > MBIM_BUFFER_SIZE) {
|
|
|
+ if (le32toh(hdr->length) > mbim_bufsize) {
|
|
|
fprintf(stderr, "message too big %d\n", le32toh(hdr->length));
|
|
|
return -1;
|
|
|
}
|
|
@@ -74,7 +75,7 @@ mbim_send(void)
|
|
|
static void
|
|
|
mbim_recv(struct uloop_fd *u, unsigned int events)
|
|
|
{
|
|
|
- ssize_t cnt = read(u->fd, mbim_buffer, MBIM_BUFFER_SIZE);
|
|
|
+ ssize_t cnt = read(u->fd, mbim_buffer, mbim_bufsize);
|
|
|
struct mbim_message_header *hdr = (struct mbim_message_header *) mbim_buffer;
|
|
|
struct command_done_message *msg = (struct command_done_message *) (hdr + 1);
|
|
|
int i;
|
|
@@ -118,7 +119,7 @@ mbim_recv(struct uloop_fd *u, unsigned int events)
|
|
|
mbim_send_close_msg();
|
|
|
break;
|
|
|
case MBIM_MESSAGE_TYPE_CLOSE_DONE:
|
|
|
- uloop_end();
|
|
|
+ mbim_end();
|
|
|
break;
|
|
|
case MBIM_MESSAGE_TYPE_FUNCTION_ERROR:
|
|
|
no_close = 0;
|
|
@@ -137,5 +138,18 @@ mbim_open(const char *path)
|
|
|
perror("open failed: ");
|
|
|
exit(-1);
|
|
|
}
|
|
|
+ mbim_bufsize = MBIM_BUFFER_SIZE;
|
|
|
+ mbim_buffer = malloc(mbim_bufsize);
|
|
|
uloop_fd_add(&mbim_fd, ULOOP_READ);
|
|
|
}
|
|
|
+
|
|
|
+void
|
|
|
+mbim_end(void)
|
|
|
+{
|
|
|
+ if (mbim_buffer) {
|
|
|
+ free(mbim_buffer);
|
|
|
+ mbim_bufsize = 0;
|
|
|
+ mbim_buffer = NULL;
|
|
|
+ }
|
|
|
+ uloop_end();
|
|
|
+}
|