bproto_addr.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675
  1. /*
  2. DO NOT EDIT THIS FILE!
  3. This file was automatically generated by the bproto generator.
  4. */
  5. #include <stdint.h>
  6. #include <string.h>
  7. #include <misc/debug.h>
  8. #include <misc/byteorder.h>
  9. #include <bproto/BProto.h>
  10. #define addr_SIZEtype (sizeof(struct BProto_header_s) + sizeof(struct BProto_uint8_s))
  11. #define addr_SIZEip_port (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (2))
  12. #define addr_SIZEipv4_addr (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (4))
  13. #define addr_SIZEipv6_addr (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (16))
  14. typedef struct {
  15. uint8_t *out;
  16. int used;
  17. int type_count;
  18. int ip_port_count;
  19. int ipv4_addr_count;
  20. int ipv6_addr_count;
  21. } addrWriter;
  22. static void addrWriter_Init (addrWriter *o, uint8_t *out);
  23. static int addrWriter_Finish (addrWriter *o);
  24. static void addrWriter_Addtype (addrWriter *o, uint8_t v);
  25. static uint8_t * addrWriter_Addip_port (addrWriter *o);
  26. static uint8_t * addrWriter_Addipv4_addr (addrWriter *o);
  27. static uint8_t * addrWriter_Addipv6_addr (addrWriter *o);
  28. typedef struct {
  29. uint8_t *buf;
  30. int buf_len;
  31. int type_start;
  32. int type_span;
  33. int type_pos;
  34. int ip_port_start;
  35. int ip_port_span;
  36. int ip_port_pos;
  37. int ipv4_addr_start;
  38. int ipv4_addr_span;
  39. int ipv4_addr_pos;
  40. int ipv6_addr_start;
  41. int ipv6_addr_span;
  42. int ipv6_addr_pos;
  43. } addrParser;
  44. static int addrParser_Init (addrParser *o, uint8_t *buf, int buf_len);
  45. static int addrParser_GotEverything (addrParser *o);
  46. static int addrParser_Gettype (addrParser *o, uint8_t *v);
  47. static void addrParser_Resettype (addrParser *o);
  48. static void addrParser_Forwardtype (addrParser *o);
  49. static int addrParser_Getip_port (addrParser *o, uint8_t **data);
  50. static void addrParser_Resetip_port (addrParser *o);
  51. static void addrParser_Forwardip_port (addrParser *o);
  52. static int addrParser_Getipv4_addr (addrParser *o, uint8_t **data);
  53. static void addrParser_Resetipv4_addr (addrParser *o);
  54. static void addrParser_Forwardipv4_addr (addrParser *o);
  55. static int addrParser_Getipv6_addr (addrParser *o, uint8_t **data);
  56. static void addrParser_Resetipv6_addr (addrParser *o);
  57. static void addrParser_Forwardipv6_addr (addrParser *o);
  58. void addrWriter_Init (addrWriter *o, uint8_t *out)
  59. {
  60. o->out = out;
  61. o->used = 0;
  62. o->type_count = 0;
  63. o->ip_port_count = 0;
  64. o->ipv4_addr_count = 0;
  65. o->ipv6_addr_count = 0;
  66. }
  67. int addrWriter_Finish (addrWriter *o)
  68. {
  69. ASSERT(o->used >= 0)
  70. ASSERT(o->type_count == 1)
  71. ASSERT(o->ip_port_count >= 0 && o->ip_port_count <= 1)
  72. ASSERT(o->ipv4_addr_count >= 0 && o->ipv4_addr_count <= 1)
  73. ASSERT(o->ipv6_addr_count >= 0 && o->ipv6_addr_count <= 1)
  74. return o->used;
  75. }
  76. void addrWriter_Addtype (addrWriter *o, uint8_t v)
  77. {
  78. ASSERT(o->used >= 0)
  79. ASSERT(o->type_count == 0)
  80. struct BProto_header_s header;
  81. header.id = htol16(1);
  82. header.type = htol16(BPROTO_TYPE_UINT8);
  83. memcpy(o->out + o->used, &header, sizeof(header));
  84. o->used += sizeof(struct BProto_header_s);
  85. struct BProto_uint8_s data;
  86. data.v = htol8(v);
  87. memcpy(o->out + o->used, &data, sizeof(data));
  88. o->used += sizeof(struct BProto_uint8_s);
  89. o->type_count++;
  90. }
  91. uint8_t * addrWriter_Addip_port (addrWriter *o)
  92. {
  93. ASSERT(o->used >= 0)
  94. ASSERT(o->ip_port_count == 0)
  95. struct BProto_header_s header;
  96. header.id = htol16(2);
  97. header.type = htol16(BPROTO_TYPE_CONSTDATA);
  98. memcpy(o->out + o->used, &header, sizeof(header));
  99. o->used += sizeof(struct BProto_header_s);
  100. struct BProto_data_header_s data;
  101. data.len = htol32(2);
  102. memcpy(o->out + o->used, &data, sizeof(data));
  103. o->used += sizeof(struct BProto_data_header_s);
  104. uint8_t *dest = (o->out + o->used);
  105. o->used += (2);
  106. o->ip_port_count++;
  107. return dest;
  108. }
  109. uint8_t * addrWriter_Addipv4_addr (addrWriter *o)
  110. {
  111. ASSERT(o->used >= 0)
  112. ASSERT(o->ipv4_addr_count == 0)
  113. struct BProto_header_s header;
  114. header.id = htol16(3);
  115. header.type = htol16(BPROTO_TYPE_CONSTDATA);
  116. memcpy(o->out + o->used, &header, sizeof(header));
  117. o->used += sizeof(struct BProto_header_s);
  118. struct BProto_data_header_s data;
  119. data.len = htol32(4);
  120. memcpy(o->out + o->used, &data, sizeof(data));
  121. o->used += sizeof(struct BProto_data_header_s);
  122. uint8_t *dest = (o->out + o->used);
  123. o->used += (4);
  124. o->ipv4_addr_count++;
  125. return dest;
  126. }
  127. uint8_t * addrWriter_Addipv6_addr (addrWriter *o)
  128. {
  129. ASSERT(o->used >= 0)
  130. ASSERT(o->ipv6_addr_count == 0)
  131. struct BProto_header_s header;
  132. header.id = htol16(4);
  133. header.type = htol16(BPROTO_TYPE_CONSTDATA);
  134. memcpy(o->out + o->used, &header, sizeof(header));
  135. o->used += sizeof(struct BProto_header_s);
  136. struct BProto_data_header_s data;
  137. data.len = htol32(16);
  138. memcpy(o->out + o->used, &data, sizeof(data));
  139. o->used += sizeof(struct BProto_data_header_s);
  140. uint8_t *dest = (o->out + o->used);
  141. o->used += (16);
  142. o->ipv6_addr_count++;
  143. return dest;
  144. }
  145. int addrParser_Init (addrParser *o, uint8_t *buf, int buf_len)
  146. {
  147. ASSERT(buf_len >= 0)
  148. o->buf = buf;
  149. o->buf_len = buf_len;
  150. o->type_start = o->buf_len;
  151. o->type_span = 0;
  152. o->type_pos = 0;
  153. o->ip_port_start = o->buf_len;
  154. o->ip_port_span = 0;
  155. o->ip_port_pos = 0;
  156. o->ipv4_addr_start = o->buf_len;
  157. o->ipv4_addr_span = 0;
  158. o->ipv4_addr_pos = 0;
  159. o->ipv6_addr_start = o->buf_len;
  160. o->ipv6_addr_span = 0;
  161. o->ipv6_addr_pos = 0;
  162. int type_count = 0;
  163. int ip_port_count = 0;
  164. int ipv4_addr_count = 0;
  165. int ipv6_addr_count = 0;
  166. int pos = 0;
  167. int left = o->buf_len;
  168. while (left > 0) {
  169. int entry_pos = pos;
  170. if (!(left >= sizeof(struct BProto_header_s))) {
  171. return 0;
  172. }
  173. struct BProto_header_s header;
  174. memcpy(&header, o->buf + pos, sizeof(header));
  175. pos += sizeof(struct BProto_header_s);
  176. left -= sizeof(struct BProto_header_s);
  177. uint16_t type = ltoh16(header.type);
  178. uint16_t id = ltoh16(header.id);
  179. switch (type) {
  180. case BPROTO_TYPE_UINT8: {
  181. if (!(left >= sizeof(struct BProto_uint8_s))) {
  182. return 0;
  183. }
  184. pos += sizeof(struct BProto_uint8_s);
  185. left -= sizeof(struct BProto_uint8_s);
  186. switch (id) {
  187. case 1:
  188. if (o->type_start == o->buf_len) {
  189. o->type_start = entry_pos;
  190. }
  191. o->type_span = pos - o->type_start;
  192. type_count++;
  193. break;
  194. default:
  195. return 0;
  196. }
  197. } break;
  198. case BPROTO_TYPE_UINT16: {
  199. if (!(left >= sizeof(struct BProto_uint16_s))) {
  200. return 0;
  201. }
  202. pos += sizeof(struct BProto_uint16_s);
  203. left -= sizeof(struct BProto_uint16_s);
  204. switch (id) {
  205. default:
  206. return 0;
  207. }
  208. } break;
  209. case BPROTO_TYPE_UINT32: {
  210. if (!(left >= sizeof(struct BProto_uint32_s))) {
  211. return 0;
  212. }
  213. pos += sizeof(struct BProto_uint32_s);
  214. left -= sizeof(struct BProto_uint32_s);
  215. switch (id) {
  216. default:
  217. return 0;
  218. }
  219. } break;
  220. case BPROTO_TYPE_UINT64: {
  221. if (!(left >= sizeof(struct BProto_uint64_s))) {
  222. return 0;
  223. }
  224. pos += sizeof(struct BProto_uint64_s);
  225. left -= sizeof(struct BProto_uint64_s);
  226. switch (id) {
  227. default:
  228. return 0;
  229. }
  230. } break;
  231. case BPROTO_TYPE_DATA:
  232. case BPROTO_TYPE_CONSTDATA:
  233. {
  234. if (!(left >= sizeof(struct BProto_data_header_s))) {
  235. return 0;
  236. }
  237. struct BProto_data_header_s val;
  238. memcpy(&val, o->buf + pos, sizeof(val));
  239. pos += sizeof(struct BProto_data_header_s);
  240. left -= sizeof(struct BProto_data_header_s);
  241. uint32_t payload_len = ltoh32(val.len);
  242. if (!(left >= payload_len)) {
  243. return 0;
  244. }
  245. pos += payload_len;
  246. left -= payload_len;
  247. switch (id) {
  248. case 2:
  249. if (!(type == BPROTO_TYPE_CONSTDATA)) {
  250. return 0;
  251. }
  252. if (!(payload_len == (2))) {
  253. return 0;
  254. }
  255. if (o->ip_port_start == o->buf_len) {
  256. o->ip_port_start = entry_pos;
  257. }
  258. o->ip_port_span = pos - o->ip_port_start;
  259. ip_port_count++;
  260. break;
  261. case 3:
  262. if (!(type == BPROTO_TYPE_CONSTDATA)) {
  263. return 0;
  264. }
  265. if (!(payload_len == (4))) {
  266. return 0;
  267. }
  268. if (o->ipv4_addr_start == o->buf_len) {
  269. o->ipv4_addr_start = entry_pos;
  270. }
  271. o->ipv4_addr_span = pos - o->ipv4_addr_start;
  272. ipv4_addr_count++;
  273. break;
  274. case 4:
  275. if (!(type == BPROTO_TYPE_CONSTDATA)) {
  276. return 0;
  277. }
  278. if (!(payload_len == (16))) {
  279. return 0;
  280. }
  281. if (o->ipv6_addr_start == o->buf_len) {
  282. o->ipv6_addr_start = entry_pos;
  283. }
  284. o->ipv6_addr_span = pos - o->ipv6_addr_start;
  285. ipv6_addr_count++;
  286. break;
  287. default:
  288. return 0;
  289. }
  290. } break;
  291. default:
  292. return 0;
  293. }
  294. }
  295. if (!(type_count == 1)) {
  296. return 0;
  297. }
  298. if (!(ip_port_count <= 1)) {
  299. return 0;
  300. }
  301. if (!(ipv4_addr_count <= 1)) {
  302. return 0;
  303. }
  304. if (!(ipv6_addr_count <= 1)) {
  305. return 0;
  306. }
  307. return 1;
  308. }
  309. int addrParser_GotEverything (addrParser *o)
  310. {
  311. return (
  312. o->type_pos == o->type_span
  313. &&
  314. o->ip_port_pos == o->ip_port_span
  315. &&
  316. o->ipv4_addr_pos == o->ipv4_addr_span
  317. &&
  318. o->ipv6_addr_pos == o->ipv6_addr_span
  319. );
  320. }
  321. int addrParser_Gettype (addrParser *o, uint8_t *v)
  322. {
  323. ASSERT(o->type_pos >= 0)
  324. ASSERT(o->type_pos <= o->type_span)
  325. int left = o->type_span - o->type_pos;
  326. while (left > 0) {
  327. ASSERT(left >= sizeof(struct BProto_header_s))
  328. struct BProto_header_s header;
  329. memcpy(&header, o->buf + o->type_start + o->type_pos, sizeof(header));
  330. o->type_pos += sizeof(struct BProto_header_s);
  331. left -= sizeof(struct BProto_header_s);
  332. uint16_t type = ltoh16(header.type);
  333. uint16_t id = ltoh16(header.id);
  334. switch (type) {
  335. case BPROTO_TYPE_UINT8: {
  336. ASSERT(left >= sizeof(struct BProto_uint8_s))
  337. struct BProto_uint8_s val;
  338. memcpy(&val, o->buf + o->type_start + o->type_pos, sizeof(val));
  339. o->type_pos += sizeof(struct BProto_uint8_s);
  340. left -= sizeof(struct BProto_uint8_s);
  341. if (id == 1) {
  342. *v = ltoh8(val.v);
  343. return 1;
  344. }
  345. } break;
  346. case BPROTO_TYPE_UINT16: {
  347. ASSERT(left >= sizeof(struct BProto_uint16_s))
  348. o->type_pos += sizeof(struct BProto_uint16_s);
  349. left -= sizeof(struct BProto_uint16_s);
  350. } break;
  351. case BPROTO_TYPE_UINT32: {
  352. ASSERT(left >= sizeof(struct BProto_uint32_s))
  353. o->type_pos += sizeof(struct BProto_uint32_s);
  354. left -= sizeof(struct BProto_uint32_s);
  355. } break;
  356. case BPROTO_TYPE_UINT64: {
  357. ASSERT(left >= sizeof(struct BProto_uint64_s))
  358. o->type_pos += sizeof(struct BProto_uint64_s);
  359. left -= sizeof(struct BProto_uint64_s);
  360. } break;
  361. case BPROTO_TYPE_DATA:
  362. case BPROTO_TYPE_CONSTDATA:
  363. {
  364. ASSERT(left >= sizeof(struct BProto_data_header_s))
  365. struct BProto_data_header_s val;
  366. memcpy(&val, o->buf + o->type_start + o->type_pos, sizeof(val));
  367. o->type_pos += sizeof(struct BProto_data_header_s);
  368. left -= sizeof(struct BProto_data_header_s);
  369. uint32_t payload_len = ltoh32(val.len);
  370. ASSERT(left >= payload_len)
  371. o->type_pos += payload_len;
  372. left -= payload_len;
  373. } break;
  374. default:
  375. ASSERT(0);
  376. }
  377. }
  378. return 0;
  379. }
  380. void addrParser_Resettype (addrParser *o)
  381. {
  382. o->type_pos = 0;
  383. }
  384. void addrParser_Forwardtype (addrParser *o)
  385. {
  386. o->type_pos = o->type_span;
  387. }
  388. int addrParser_Getip_port (addrParser *o, uint8_t **data)
  389. {
  390. ASSERT(o->ip_port_pos >= 0)
  391. ASSERT(o->ip_port_pos <= o->ip_port_span)
  392. int left = o->ip_port_span - o->ip_port_pos;
  393. while (left > 0) {
  394. ASSERT(left >= sizeof(struct BProto_header_s))
  395. struct BProto_header_s header;
  396. memcpy(&header, o->buf + o->ip_port_start + o->ip_port_pos, sizeof(header));
  397. o->ip_port_pos += sizeof(struct BProto_header_s);
  398. left -= sizeof(struct BProto_header_s);
  399. uint16_t type = ltoh16(header.type);
  400. uint16_t id = ltoh16(header.id);
  401. switch (type) {
  402. case BPROTO_TYPE_UINT8: {
  403. ASSERT(left >= sizeof(struct BProto_uint8_s))
  404. o->ip_port_pos += sizeof(struct BProto_uint8_s);
  405. left -= sizeof(struct BProto_uint8_s);
  406. } break;
  407. case BPROTO_TYPE_UINT16: {
  408. ASSERT(left >= sizeof(struct BProto_uint16_s))
  409. o->ip_port_pos += sizeof(struct BProto_uint16_s);
  410. left -= sizeof(struct BProto_uint16_s);
  411. } break;
  412. case BPROTO_TYPE_UINT32: {
  413. ASSERT(left >= sizeof(struct BProto_uint32_s))
  414. o->ip_port_pos += sizeof(struct BProto_uint32_s);
  415. left -= sizeof(struct BProto_uint32_s);
  416. } break;
  417. case BPROTO_TYPE_UINT64: {
  418. ASSERT(left >= sizeof(struct BProto_uint64_s))
  419. o->ip_port_pos += sizeof(struct BProto_uint64_s);
  420. left -= sizeof(struct BProto_uint64_s);
  421. } break;
  422. case BPROTO_TYPE_DATA:
  423. case BPROTO_TYPE_CONSTDATA:
  424. {
  425. ASSERT(left >= sizeof(struct BProto_data_header_s))
  426. struct BProto_data_header_s val;
  427. memcpy(&val, o->buf + o->ip_port_start + o->ip_port_pos, sizeof(val));
  428. o->ip_port_pos += sizeof(struct BProto_data_header_s);
  429. left -= sizeof(struct BProto_data_header_s);
  430. uint32_t payload_len = ltoh32(val.len);
  431. ASSERT(left >= payload_len)
  432. uint8_t *payload = o->buf + o->ip_port_start + o->ip_port_pos;
  433. o->ip_port_pos += payload_len;
  434. left -= payload_len;
  435. if (type == BPROTO_TYPE_CONSTDATA && id == 2) {
  436. *data = payload;
  437. return 1;
  438. }
  439. } break;
  440. default:
  441. ASSERT(0);
  442. }
  443. }
  444. return 0;
  445. }
  446. void addrParser_Resetip_port (addrParser *o)
  447. {
  448. o->ip_port_pos = 0;
  449. }
  450. void addrParser_Forwardip_port (addrParser *o)
  451. {
  452. o->ip_port_pos = o->ip_port_span;
  453. }
  454. int addrParser_Getipv4_addr (addrParser *o, uint8_t **data)
  455. {
  456. ASSERT(o->ipv4_addr_pos >= 0)
  457. ASSERT(o->ipv4_addr_pos <= o->ipv4_addr_span)
  458. int left = o->ipv4_addr_span - o->ipv4_addr_pos;
  459. while (left > 0) {
  460. ASSERT(left >= sizeof(struct BProto_header_s))
  461. struct BProto_header_s header;
  462. memcpy(&header, o->buf + o->ipv4_addr_start + o->ipv4_addr_pos, sizeof(header));
  463. o->ipv4_addr_pos += sizeof(struct BProto_header_s);
  464. left -= sizeof(struct BProto_header_s);
  465. uint16_t type = ltoh16(header.type);
  466. uint16_t id = ltoh16(header.id);
  467. switch (type) {
  468. case BPROTO_TYPE_UINT8: {
  469. ASSERT(left >= sizeof(struct BProto_uint8_s))
  470. o->ipv4_addr_pos += sizeof(struct BProto_uint8_s);
  471. left -= sizeof(struct BProto_uint8_s);
  472. } break;
  473. case BPROTO_TYPE_UINT16: {
  474. ASSERT(left >= sizeof(struct BProto_uint16_s))
  475. o->ipv4_addr_pos += sizeof(struct BProto_uint16_s);
  476. left -= sizeof(struct BProto_uint16_s);
  477. } break;
  478. case BPROTO_TYPE_UINT32: {
  479. ASSERT(left >= sizeof(struct BProto_uint32_s))
  480. o->ipv4_addr_pos += sizeof(struct BProto_uint32_s);
  481. left -= sizeof(struct BProto_uint32_s);
  482. } break;
  483. case BPROTO_TYPE_UINT64: {
  484. ASSERT(left >= sizeof(struct BProto_uint64_s))
  485. o->ipv4_addr_pos += sizeof(struct BProto_uint64_s);
  486. left -= sizeof(struct BProto_uint64_s);
  487. } break;
  488. case BPROTO_TYPE_DATA:
  489. case BPROTO_TYPE_CONSTDATA:
  490. {
  491. ASSERT(left >= sizeof(struct BProto_data_header_s))
  492. struct BProto_data_header_s val;
  493. memcpy(&val, o->buf + o->ipv4_addr_start + o->ipv4_addr_pos, sizeof(val));
  494. o->ipv4_addr_pos += sizeof(struct BProto_data_header_s);
  495. left -= sizeof(struct BProto_data_header_s);
  496. uint32_t payload_len = ltoh32(val.len);
  497. ASSERT(left >= payload_len)
  498. uint8_t *payload = o->buf + o->ipv4_addr_start + o->ipv4_addr_pos;
  499. o->ipv4_addr_pos += payload_len;
  500. left -= payload_len;
  501. if (type == BPROTO_TYPE_CONSTDATA && id == 3) {
  502. *data = payload;
  503. return 1;
  504. }
  505. } break;
  506. default:
  507. ASSERT(0);
  508. }
  509. }
  510. return 0;
  511. }
  512. void addrParser_Resetipv4_addr (addrParser *o)
  513. {
  514. o->ipv4_addr_pos = 0;
  515. }
  516. void addrParser_Forwardipv4_addr (addrParser *o)
  517. {
  518. o->ipv4_addr_pos = o->ipv4_addr_span;
  519. }
  520. int addrParser_Getipv6_addr (addrParser *o, uint8_t **data)
  521. {
  522. ASSERT(o->ipv6_addr_pos >= 0)
  523. ASSERT(o->ipv6_addr_pos <= o->ipv6_addr_span)
  524. int left = o->ipv6_addr_span - o->ipv6_addr_pos;
  525. while (left > 0) {
  526. ASSERT(left >= sizeof(struct BProto_header_s))
  527. struct BProto_header_s header;
  528. memcpy(&header, o->buf + o->ipv6_addr_start + o->ipv6_addr_pos, sizeof(header));
  529. o->ipv6_addr_pos += sizeof(struct BProto_header_s);
  530. left -= sizeof(struct BProto_header_s);
  531. uint16_t type = ltoh16(header.type);
  532. uint16_t id = ltoh16(header.id);
  533. switch (type) {
  534. case BPROTO_TYPE_UINT8: {
  535. ASSERT(left >= sizeof(struct BProto_uint8_s))
  536. o->ipv6_addr_pos += sizeof(struct BProto_uint8_s);
  537. left -= sizeof(struct BProto_uint8_s);
  538. } break;
  539. case BPROTO_TYPE_UINT16: {
  540. ASSERT(left >= sizeof(struct BProto_uint16_s))
  541. o->ipv6_addr_pos += sizeof(struct BProto_uint16_s);
  542. left -= sizeof(struct BProto_uint16_s);
  543. } break;
  544. case BPROTO_TYPE_UINT32: {
  545. ASSERT(left >= sizeof(struct BProto_uint32_s))
  546. o->ipv6_addr_pos += sizeof(struct BProto_uint32_s);
  547. left -= sizeof(struct BProto_uint32_s);
  548. } break;
  549. case BPROTO_TYPE_UINT64: {
  550. ASSERT(left >= sizeof(struct BProto_uint64_s))
  551. o->ipv6_addr_pos += sizeof(struct BProto_uint64_s);
  552. left -= sizeof(struct BProto_uint64_s);
  553. } break;
  554. case BPROTO_TYPE_DATA:
  555. case BPROTO_TYPE_CONSTDATA:
  556. {
  557. ASSERT(left >= sizeof(struct BProto_data_header_s))
  558. struct BProto_data_header_s val;
  559. memcpy(&val, o->buf + o->ipv6_addr_start + o->ipv6_addr_pos, sizeof(val));
  560. o->ipv6_addr_pos += sizeof(struct BProto_data_header_s);
  561. left -= sizeof(struct BProto_data_header_s);
  562. uint32_t payload_len = ltoh32(val.len);
  563. ASSERT(left >= payload_len)
  564. uint8_t *payload = o->buf + o->ipv6_addr_start + o->ipv6_addr_pos;
  565. o->ipv6_addr_pos += payload_len;
  566. left -= payload_len;
  567. if (type == BPROTO_TYPE_CONSTDATA && id == 4) {
  568. *data = payload;
  569. return 1;
  570. }
  571. } break;
  572. default:
  573. ASSERT(0);
  574. }
  575. }
  576. return 0;
  577. }
  578. void addrParser_Resetipv6_addr (addrParser *o)
  579. {
  580. o->ipv6_addr_pos = 0;
  581. }
  582. void addrParser_Forwardipv6_addr (addrParser *o)
  583. {
  584. o->ipv6_addr_pos = o->ipv6_addr_span;
  585. }