bproto_addr.h 21 KB

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