3 * Copyright (C) 2014 John Crispin <blogic@openwrt.org>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2
7 * as published by the Free Software Foundation
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
15 #include <sys/types.h>
25 #include <libubox/utils.h>
26 #include <libubox/uloop.h>
30 #include "data/mbim-service-basic-connect.h"
32 int transaction_id
= 1;
33 uint8_t basic_connect
[16] = { 0xa2, 0x89, 0xcc, 0x33, 0xbc, 0xbb, 0x8b, 0x4f,
34 0xb6, 0xb0, 0x13, 0x3e, 0xc2, 0xaa, 0xe6,0xdf };
35 static int payload_offset
, payload_free
, payload_len
;
36 static uint8_t *payload_buffer
;
39 mbim_add_payload(uint8_t len
)
41 uint32_t offset
= payload_offset
;
43 if (payload_free
< len
)
47 payload_offset
+= len
;
54 mbim_encode_string(struct mbim_string
*str
, char *in
)
57 int s
= mbim_add_payload(l
* 2);
58 uint8_t *p
= &payload_buffer
[s
];
64 str
->offset
= htole32(s
);
65 str
->length
= htole32(l
* 2);
66 for (i
= 0; i
< l
; i
++)
74 mbim_get_string(struct mbim_string
*str
, char *in
)
76 char *p
= &in
[le32toh(str
->offset
)];
79 if (!le32toh(str
->offset
))
82 if (le32toh(str
->length
)) {
83 for (i
= 0; i
< le32toh(str
->length
) / 2; i
++)
93 mbim_get_ipv4(void *buffer
, char *out
, uint32_t offset
)
95 uint8_t *b
= buffer
+ offset
;
97 snprintf(out
, 16, "%d.%d.%d.%d", b
[0], b
[1], b
[2], b
[3]);
101 mbim_get_ipv6(void *buffer
, char *out
, uint32_t offset
)
103 uint8_t *b
= buffer
+ offset
;
105 snprintf(out
, 40, "%x:%x:%x:%x:%x:%x:%x:%x", b
[0] << 8 | b
[1],
106 b
[2] << 8 | b
[3], b
[4] << 8 | b
[5], b
[6] << 8 | b
[7],
107 b
[8] << 8 | b
[9], b
[10] << 8 | b
[11], b
[12] << 8 | b
[13],
112 mbim_get_int(void *buffer
, uint32_t offset
)
114 uint32_t *i
= buffer
+ offset
;
120 mbim_enum_string(struct mbim_enum
*e
, uint32_t key
)
131 mbim_setup_header(struct mbim_message_header
*hdr
, MbimMessageType type
, int length
)
136 hdr
->transaction_id
= htole32(transaction_id
++);
137 hdr
->type
= htole32(type
);
138 hdr
->length
= htole32(length
);
142 mbim_setup_command_msg(uint8_t *uuid
, uint32_t type
, uint32_t command_id
, int len
)
144 struct command_message
*cmd
= (struct command_message
*) mbim_buffer
;
148 memset(mbim_buffer
, 0, mbim_bufsize
);
150 cmd
->fragment_header
.total
= htole32(1);
151 cmd
->fragment_header
.current
= htole32(0);
152 memcpy(cmd
->service_id
, uuid
, 16);
153 cmd
->command_id
= htole32(command_id
);
154 cmd
->command_type
= htole32(type
);
155 cmd
->buffer_length
= htole32(len
);
157 payload_offset
= len
;
158 payload_free
= mbim_bufsize
- (sizeof(*cmd
) + len
);
160 payload_buffer
= cmd
->buffer
;
166 mbim_send_command_msg(void)
168 struct command_message
*cmd
= (struct command_message
*) mbim_buffer
;
172 if (payload_len
& 0x3) {
177 cmd
->buffer_length
= htole32(le32toh(cmd
->buffer_length
) + payload_len
);
178 mbim_setup_header(&cmd
->header
, MBIM_MESSAGE_TYPE_COMMAND
, sizeof(*cmd
) + le32toh(cmd
->buffer_length
));
184 mbim_send_open_msg(void)
186 struct mbim_open_message
*msg
= (struct mbim_open_message
*) mbim_buffer
;
188 mbim_setup_header(&msg
->header
, MBIM_MESSAGE_TYPE_OPEN
, sizeof(*msg
));
189 msg
->max_control_transfer
= htole32(mbim_bufsize
);
195 mbim_send_close_msg(void)
197 struct mbim_message_header
*hdr
= (struct mbim_message_header
*) mbim_buffer
;
199 if (no_close
|| !mbim_buffer
) {
203 mbim_setup_header(hdr
, MBIM_MESSAGE_TYPE_CLOSE
, sizeof(*hdr
));