aoc.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. /*
  2. * Asterisk -- An open source telephony toolkit.
  3. *
  4. * Copyright (C) 2010, Digium, Inc.
  5. *
  6. * David Vossel <dvossel@digium.com>
  7. *
  8. * See http://www.asterisk.org for more information about
  9. * the Asterisk project. Please do not directly contact
  10. * any of the maintainers of this project for assistance;
  11. * the project provides a web site, mailing lists and IRC
  12. * channels for your use.
  13. *
  14. * This program is free software, distributed under the terms of
  15. * the GNU General Public License Version 2. See the LICENSE file
  16. * at the top of the source tree.
  17. */
  18. /*!
  19. * \file
  20. * \brief Generic Advice of Charge encode and decode routines
  21. *
  22. * \author David Vossel <dvossel@digium.com>
  23. */
  24. #ifndef _AST_AOC_H_
  25. #define _AST_AOC_H_
  26. #include "asterisk/channel.h"
  27. #define AOC_CURRENCY_NAME_SIZE (10 + 1)
  28. /*! \brief Defines the currency multiplier for an aoc message. */
  29. enum ast_aoc_currency_multiplier {
  30. AST_AOC_MULT_ONETHOUSANDTH = 1,
  31. AST_AOC_MULT_ONEHUNDREDTH,
  32. AST_AOC_MULT_ONETENTH,
  33. AST_AOC_MULT_ONE,
  34. AST_AOC_MULT_TEN,
  35. AST_AOC_MULT_HUNDRED,
  36. AST_AOC_MULT_THOUSAND,
  37. AST_AOC_MULT_NUM_ENTRIES, /* must remain the last item in enum, this is not a valid type */
  38. };
  39. /*!
  40. * \brief Defines the billing id options for an aoc message.
  41. * \note AOC-D is limited to NORMAL, REVERSE_CHARGE, and CREDIT_CARD.
  42. */
  43. enum ast_aoc_billing_id {
  44. AST_AOC_BILLING_NA = 0,
  45. AST_AOC_BILLING_NORMAL,
  46. AST_AOC_BILLING_REVERSE_CHARGE,
  47. AST_AOC_BILLING_CREDIT_CARD,
  48. AST_AOC_BILLING_CALL_FWD_UNCONDITIONAL,
  49. AST_AOC_BILLING_CALL_FWD_BUSY,
  50. AST_AOC_BILLING_CALL_FWD_NO_REPLY,
  51. AST_AOC_BILLING_CALL_DEFLECTION,
  52. AST_AOC_BILLING_CALL_TRANSFER,
  53. AST_AOC_BILLING_NUM_ENTRIES /* must remain the last item in enum, not a valid billing id */
  54. };
  55. enum ast_aoc_type {
  56. AST_AOC_REQUEST = 0,
  57. AST_AOC_S,
  58. AST_AOC_D,
  59. AST_AOC_E, /* aoc-e must remain the last item in this enum */
  60. };
  61. enum ast_aoc_charge_type {
  62. AST_AOC_CHARGE_NA = 0,
  63. AST_AOC_CHARGE_FREE,
  64. AST_AOC_CHARGE_CURRENCY,
  65. AST_AOC_CHARGE_UNIT, /* unit must remain the last item in enum */
  66. };
  67. enum ast_aoc_request {
  68. AST_AOC_REQUEST_S = (1 << 0),
  69. AST_AOC_REQUEST_D = (1 << 1),
  70. AST_AOC_REQUEST_E = (1 << 2),
  71. };
  72. enum ast_aoc_total_type {
  73. AST_AOC_TOTAL = 0,
  74. AST_AOC_SUBTOTAL = 1,
  75. };
  76. enum ast_aoc_time_scale {
  77. AST_AOC_TIME_SCALE_HUNDREDTH_SECOND,
  78. AST_AOC_TIME_SCALE_TENTH_SECOND,
  79. AST_AOC_TIME_SCALE_SECOND,
  80. AST_AOC_TIME_SCALE_TEN_SECOND,
  81. AST_AOC_TIME_SCALE_MINUTE,
  82. AST_AOC_TIME_SCALE_HOUR,
  83. AST_AOC_TIME_SCALE_DAY,
  84. };
  85. struct ast_aoc_time {
  86. /*! LengthOfTimeUnit (Not valid if length is zero.) */
  87. uint32_t length;
  88. uint16_t scale;
  89. };
  90. struct ast_aoc_duration_rate {
  91. uint32_t amount;
  92. uint32_t time;
  93. /*! Not present if the granularity time is zero. */
  94. uint32_t granularity_time;
  95. uint16_t multiplier;
  96. uint16_t time_scale;
  97. uint16_t granularity_time_scale;
  98. /*! Name of currency involved. Null terminated. */
  99. char currency_name[AOC_CURRENCY_NAME_SIZE];
  100. /*!
  101. * \brief Charging interval type
  102. * \details
  103. * continuousCharging(0),
  104. * stepFunction(1)
  105. */
  106. uint8_t charging_type;
  107. };
  108. enum ast_aoc_volume_unit {
  109. AST_AOC_VOLUME_UNIT_OCTET,
  110. AST_AOC_VOLUME_UNIT_SEGMENT,
  111. AST_AOC_VOLUME_UNIT_MESSAGE,
  112. };
  113. struct ast_aoc_volume_rate {
  114. uint32_t amount;
  115. uint16_t multiplier;
  116. uint16_t volume_unit;
  117. char currency_name[AOC_CURRENCY_NAME_SIZE];
  118. };
  119. struct ast_aoc_flat_rate {
  120. uint32_t amount;
  121. uint16_t multiplier;
  122. /*! Name of currency involved. Null terminated. */
  123. char currency_name[AOC_CURRENCY_NAME_SIZE];
  124. };
  125. enum ast_aoc_s_charged_item {
  126. AST_AOC_CHARGED_ITEM_NA,
  127. AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT,
  128. AST_AOC_CHARGED_ITEM_BASIC_COMMUNICATION,
  129. AST_AOC_CHARGED_ITEM_CALL_ATTEMPT,
  130. AST_AOC_CHARGED_ITEM_CALL_SETUP,
  131. AST_AOC_CHARGED_ITEM_USER_USER_INFO,
  132. AST_AOC_CHARGED_ITEM_SUPPLEMENTARY_SERVICE,
  133. };
  134. enum ast_aoc_s_rate_type {
  135. AST_AOC_RATE_TYPE_NA,
  136. AST_AOC_RATE_TYPE_FREE,
  137. AST_AOC_RATE_TYPE_FREE_FROM_BEGINNING,
  138. AST_AOC_RATE_TYPE_DURATION,
  139. AST_AOC_RATE_TYPE_FLAT,
  140. AST_AOC_RATE_TYPE_VOLUME,
  141. AST_AOC_RATE_TYPE_SPECIAL_CODE,
  142. };
  143. struct ast_aoc_s_entry {
  144. uint16_t charged_item;
  145. uint16_t rate_type;
  146. /*! \brief Charge rate being applied. */
  147. union {
  148. struct ast_aoc_duration_rate duration;
  149. struct ast_aoc_flat_rate flat;
  150. struct ast_aoc_volume_rate volume;
  151. uint16_t special_code; /* 1...10 */
  152. } rate;
  153. } __attribute__((packed));
  154. struct ast_aoc_unit_entry {
  155. char valid_amount;
  156. unsigned int amount;
  157. char valid_type;
  158. unsigned int type; /* 1 - 16 by ETSI standard */
  159. };
  160. enum AST_AOC_CHARGING_ASSOCIATION {
  161. AST_AOC_CHARGING_ASSOCIATION_NA,
  162. AST_AOC_CHARGING_ASSOCIATION_NUMBER,
  163. AST_AOC_CHARGING_ASSOCIATION_ID,
  164. };
  165. struct ast_aoc_charging_association_number {
  166. uint8_t plan;
  167. char number[32];
  168. } __attribute__((packed));
  169. struct ast_aoc_charging_association {
  170. union {
  171. int32_t id;
  172. struct ast_aoc_charging_association_number number;
  173. } charge;
  174. /*! \see enum AST_AOC_CHARGING_ASSOCIATION */
  175. uint8_t charging_type;
  176. } __attribute__((packed));
  177. /*! \brief AOC Payload Header. Holds all the encoded AOC data to pass on the wire */
  178. struct ast_aoc_encoded;
  179. /*! \brief Decoded AOC data. This value is used to set all the values in an AOC message before encoding.*/
  180. struct ast_aoc_decoded;
  181. /*!
  182. * \brief creates a ast_aoc_decode object of a specific message type
  183. * \since 1.8
  184. *
  185. * \param msg_type AOC-D, AOC-E, or AOC Request
  186. * \param charge_type this is ignored if message type is not AOC-D or AOC-E.
  187. * \param requests flags. This defines the types of AOC requested. This
  188. * field should only be set when the message type is AOC Request,
  189. * the value is ignored otherwise.
  190. *
  191. * \retval heap allocated ast_aoc_decoded object ptr on success
  192. * \retval NULL failure
  193. */
  194. struct ast_aoc_decoded *ast_aoc_create(const enum ast_aoc_type msg_type,
  195. const enum ast_aoc_charge_type charge_type,
  196. const enum ast_aoc_request requests);
  197. /*! \brief free an ast_aoc_decoded object */
  198. void *ast_aoc_destroy_decoded(struct ast_aoc_decoded *decoded);
  199. /*! \brief free an ast_aoc_encoded object */
  200. void *ast_aoc_destroy_encoded(struct ast_aoc_encoded *encoded);
  201. /*!
  202. * \brief decodes an encoded aoc payload.
  203. * \since 1.8
  204. *
  205. * \param encoded the encoded payload to decode.
  206. * \param size total size of encoded payload
  207. * \param chan ast channel, Optional for DEBUG output purposes
  208. *
  209. * \retval heap allocated ast_aoc_decoded object ptr on success
  210. * \retval NULL failure
  211. */
  212. struct ast_aoc_decoded *ast_aoc_decode(struct ast_aoc_encoded *encoded, size_t size, struct ast_channel *chan);
  213. /*!
  214. * \brief encodes a decoded aoc structure so it can be passed on the wire
  215. * \since 1.8
  216. *
  217. * \param decoded the decoded struct to be encoded
  218. * \param out_size output parameter representing size of encoded data
  219. * \param chan ast channel, Optional for DEBUG output purposes
  220. *
  221. * \retval pointer to encoded data
  222. * \retval NULL failure
  223. */
  224. struct ast_aoc_encoded *ast_aoc_encode(struct ast_aoc_decoded *decoded, size_t *out_size, struct ast_channel *chan);
  225. /*!
  226. * \brief Sets the type of total for a AOC-D message
  227. * \since 1.8
  228. *
  229. * \param decoded ast_aoc_decoded struct to set values on
  230. * \param type total type: TOTAL or SUBTOTAL
  231. *
  232. * \note If this value is not set, the default for the message is TOTAL
  233. *
  234. * \retval 0 success
  235. */
  236. int ast_aoc_set_total_type(struct ast_aoc_decoded *decoded, const enum ast_aoc_total_type type);
  237. /*!
  238. * \brief Sets the currency values for a AOC-D or AOC-E message
  239. * \since 1.8
  240. *
  241. * \param decoded ast_aoc_decoded struct to set values on
  242. * \param amount currency amount REQUIRED
  243. * \param multiplier currency multiplier REQUIRED, 0 or undefined value defaults to AST_AOC_MULT_ONE.
  244. * \param name currency name OPTIONAL
  245. *
  246. * \retval 0 success
  247. */
  248. int ast_aoc_set_currency_info(struct ast_aoc_decoded *decoded,
  249. const unsigned int amount,
  250. const enum ast_aoc_currency_multiplier multiplier,
  251. const char *name);
  252. /*!
  253. * \brief Adds a unit entry into the list of units
  254. * \since 1.8
  255. *
  256. * \param decoded ast_aoc_decoded struct to set values on
  257. * \param amount_is_present set this if the number of units is actually present.
  258. * \param amount number of units
  259. * \param type_is_present set this if the type value is present
  260. * \param type unit type
  261. *
  262. * \note If neither the amount nor the type is present, the entry will
  263. * not be added.
  264. *
  265. * \retval 0 success
  266. */
  267. int ast_aoc_add_unit_entry(struct ast_aoc_decoded *decoded,
  268. const unsigned int amount_is_present,
  269. const unsigned int amount,
  270. const unsigned int type_is_present,
  271. const unsigned int type);
  272. /*!
  273. * \brief set the billing id for a AOC-D or AST_AOC_E message
  274. * \since 1.8
  275. *
  276. * \param decoded ast_aoc_decoded struct to set values on
  277. * \param id billing id
  278. *
  279. * \retval 0 success
  280. */
  281. int ast_aoc_set_billing_id(struct ast_aoc_decoded *decoded, const enum ast_aoc_billing_id id);
  282. /*!
  283. * \brief set the charging association id for an AST_AOC_E message
  284. * \since 1.8
  285. *
  286. * \param decoded ast_aoc_decoded struct to set values on
  287. * \param id charging association identifier
  288. *
  289. * \note If the association number was set, this will override that value. Only the id OR the
  290. * number can be set at a time, not both.
  291. *
  292. * \retval 0 success
  293. */
  294. int ast_aoc_set_association_id(struct ast_aoc_decoded *decoded, const int id);
  295. /*!
  296. * \brief set the charging accociation number for an AOC-E message
  297. * \since 1.8
  298. *
  299. * \param decoded ast_aoc_decoded struct to set values on
  300. * \param num charging association number
  301. * \param plan charging association number plan and type-of-number fields
  302. *
  303. * \note If the association id was set, this will override that value. Only the id OR the
  304. * number can be set at a time, not both.
  305. *
  306. * \retval 0 success
  307. */
  308. int ast_aoc_set_association_number(struct ast_aoc_decoded *decoded, const char *num, uint8_t plan);
  309. /*!
  310. * \brief Mark the AST_AOC_REQUEST message as a termination request.
  311. * \since 1.8
  312. *
  313. * \param decoded ast_aoc_decoded struct to set values on
  314. *
  315. * \note A termination request indicates that the call has terminated,
  316. * but that the other side is waiting for a short period of time before
  317. * hanging up so it can get the final AOC-E message.
  318. *
  319. * \retval 0 success
  320. * \retval -1 failure
  321. */
  322. int ast_aoc_set_termination_request(struct ast_aoc_decoded *decoded);
  323. /*!
  324. * \brief Add AOC-S duration rate entry
  325. * \since 1.8
  326. *
  327. * \param decoded aoc decoded object to add entry to
  328. * \param charged_item ast_aoc_s_charged_item
  329. * \param amount currency amount
  330. * \param multiplier currency multiplier
  331. * \param currency_name truncated after 10 characters
  332. * \param time
  333. * \param time_scale from ast_aoc_time_scale enum
  334. * \param granularity_time (optional, set to 0 if not present);
  335. * \param granularity_time_scale (optional, set to 0 if not present);
  336. * \param step_function set to 1 if this is to use a step function, 0 if continuious
  337. *
  338. * \retval 0 success
  339. * \retval -1 failure
  340. */
  341. int ast_aoc_s_add_rate_duration(struct ast_aoc_decoded *decoded,
  342. enum ast_aoc_s_charged_item charged_item,
  343. unsigned int amount,
  344. enum ast_aoc_currency_multiplier multiplier,
  345. const char *currency_name,
  346. unsigned long time,
  347. enum ast_aoc_time_scale time_scale,
  348. unsigned long granularity_time,
  349. enum ast_aoc_time_scale granularity_time_scale,
  350. int step_function);
  351. /*!
  352. * \brief Add AOC-S flat rate entry
  353. * \since 1.8
  354. *
  355. * \param decoded aoc decoded object to add entry to
  356. * \param charged_item ast_aoc_s_charged_item
  357. * \param amount currency amount
  358. * \param multiplier currency multiplier
  359. * \param currency_name truncated after 10 characters
  360. *
  361. * \retval 0 success
  362. * \retval -1 failure
  363. */
  364. int ast_aoc_s_add_rate_flat(struct ast_aoc_decoded *decoded,
  365. enum ast_aoc_s_charged_item charged_item,
  366. unsigned int amount,
  367. enum ast_aoc_currency_multiplier multiplier,
  368. const char *currency_name);
  369. /*!
  370. * \brief Add AOC-S volume rate entry
  371. * \since 1.8
  372. *
  373. * \param decoded aoc decoded object to add entry to
  374. * \param charged_item ast_aoc_s_charged_item
  375. * \param volume_unit from ast_aoc_volume_unit enum
  376. * \param amount currency amount
  377. * \param multiplier currency multiplier
  378. * \param currency_name truncated after 10 characters
  379. *
  380. * \retval 0 success
  381. * \retval -1 failure
  382. */
  383. int ast_aoc_s_add_rate_volume(struct ast_aoc_decoded *decoded,
  384. enum ast_aoc_s_charged_item charged_item,
  385. enum ast_aoc_volume_unit volume_unit,
  386. unsigned int amount,
  387. enum ast_aoc_currency_multiplier multiplier,
  388. const char *currency_name);
  389. /*!
  390. * \brief Add AOC-S special rate entry
  391. * \since 1.8
  392. *
  393. * \param decoded aoc decoded object to add entry to
  394. * \param charged_item ast_aoc_s_charged_item
  395. * \param code special charging code
  396. *
  397. * \retval 0 success
  398. * \retval -1 failure
  399. */
  400. int ast_aoc_s_add_rate_special_charge_code(struct ast_aoc_decoded *decoded,
  401. enum ast_aoc_s_charged_item charged_item,
  402. unsigned int code);
  403. /*!
  404. * \brief Add AOC-S indicating charge item is free
  405. * \since 1.8
  406. *
  407. * \param decoded aoc decoded object to add entry to
  408. * \param charged_item ast_aoc_s_charged_item
  409. * \param from_beginning TRUE if the rate is free from beginning.
  410. *
  411. * \retval 0 success
  412. * \retval -1 failure
  413. */
  414. int ast_aoc_s_add_rate_free(struct ast_aoc_decoded *decoded,
  415. enum ast_aoc_s_charged_item charged_item, int from_beginning);
  416. /*!
  417. * \brief Add AOC-S entry indicating charge item is not available
  418. * \since 1.8
  419. *
  420. * \param decoded aoc decoded object to add entry to
  421. * \param charged_item ast_aoc_s_charged_item
  422. *
  423. * \retval 0 success
  424. * \retval -1 failure
  425. */
  426. int ast_aoc_s_add_rate_na(struct ast_aoc_decoded *decoded,
  427. enum ast_aoc_s_charged_item charged_item);
  428. /*!
  429. * \brief Add AOC-S special arrangement entry
  430. * \since 1.8
  431. *
  432. * \param decoded aoc decoded object to add entry to
  433. * \param code special arrangement code
  434. *
  435. * \retval 0 success
  436. * \retval -1 failure
  437. */
  438. int ast_aoc_s_add_special_arrangement(struct ast_aoc_decoded *decoded,
  439. unsigned int code);
  440. /*!
  441. * \brief Convert decoded aoc msg to string representation
  442. * \since 1.8
  443. *
  444. * \param decoded ast_aoc_decoded struct to convert to string
  445. * \param msg dynamic heap allocated ast_str object to store string representation in
  446. *
  447. * \retval 0 success
  448. * \retval -1 failure
  449. */
  450. int ast_aoc_decoded2str(const struct ast_aoc_decoded *decoded, struct ast_str **msg);
  451. /*!
  452. * \brief generate AOC manager event for an AOC-S, AOC-D, or AOC-E msg
  453. * \pre chan is locked
  454. */
  455. int ast_aoc_manager_event(const struct ast_aoc_decoded *decoded, struct ast_channel *chan);
  456. /*! \brief get the message type, AOC-D, AOC-E, or AOC Request */
  457. enum ast_aoc_type ast_aoc_get_msg_type(struct ast_aoc_decoded *decoded);
  458. /*! \brief get the charging type for an AOC-D or AOC-E message */
  459. enum ast_aoc_charge_type ast_aoc_get_charge_type(struct ast_aoc_decoded *decoded);
  460. /*! \brief get the types of AOC requested for when message type is AOC Request */
  461. enum ast_aoc_request ast_aoc_get_request(struct ast_aoc_decoded *decoded);
  462. /*! \brief get the type of total for a AOC-D message */
  463. enum ast_aoc_total_type ast_aoc_get_total_type(struct ast_aoc_decoded *decoded);
  464. /*! \brief get the currency amount for AOC-D and AOC-E messages*/
  465. unsigned int ast_aoc_get_currency_amount(struct ast_aoc_decoded *decoded);
  466. /*! \brief get the number rates associated with an AOC-S message */
  467. unsigned int ast_aoc_s_get_count(struct ast_aoc_decoded *decoded);
  468. /*!
  469. * \brief get a specific AOC-S rate entry.
  470. * \since 1.8
  471. *
  472. * \note This can be used in conjunction with ast_aoc_s_get_count to create
  473. * a unit entry iterator.
  474. */
  475. const struct ast_aoc_s_entry *ast_aoc_s_get_rate_info(struct ast_aoc_decoded *decoded, unsigned int entry_number);
  476. /*! \brief get the number of unit entries for AOC-D and AOC-E messages*/
  477. unsigned int ast_aoc_get_unit_count(struct ast_aoc_decoded *decoded);
  478. /*!
  479. * \brief get a specific unit entry.
  480. * \since 1.8
  481. *
  482. * \note This can be used in conjunction with ast_aoc_get_unit_count to create
  483. * a unit entry iterator.
  484. */
  485. const struct ast_aoc_unit_entry *ast_aoc_get_unit_info(struct ast_aoc_decoded *decoded, unsigned int entry_number);
  486. /*! \brief get the currency multiplier for AOC-D and AOC-E messages */
  487. enum ast_aoc_currency_multiplier ast_aoc_get_currency_multiplier(struct ast_aoc_decoded *decoded);
  488. /*! \brief get the currency multiplier for AOC-D and AOC-E messages in decimal format */
  489. const char *ast_aoc_get_currency_multiplier_decimal(struct ast_aoc_decoded *decoded);
  490. /*! \brief get the currency name for AOC-D and AOC-E messages*/
  491. const char *ast_aoc_get_currency_name(struct ast_aoc_decoded *decoded);
  492. /*! \brief get the billing id for AOC-D and AOC-E messages*/
  493. enum ast_aoc_billing_id ast_aoc_get_billing_id(struct ast_aoc_decoded *decoded);
  494. /*! \brief get the charging association info for AOC-E messages*/
  495. const struct ast_aoc_charging_association *ast_aoc_get_association_info(struct ast_aoc_decoded *decoded);
  496. /*!
  497. * \brief get whether or not the AST_AOC_REQUEST message as a termination request.
  498. * \since 1.8
  499. *
  500. * \note a termination request indicates that the call has terminated,
  501. * but that the other side is waiting for a short period of time
  502. * before hanging up so it can get the final AOC-E message.
  503. *
  504. * \param decoded ast_aoc_decoded struct to get values on
  505. *
  506. * \retval 0 not a termination request
  507. * \retval 1 is a termination request
  508. */
  509. int ast_aoc_get_termination_request(struct ast_aoc_decoded *decoded);
  510. /*!
  511. * \brief test aoc encode decode routines.
  512. * \since 1.8
  513. *
  514. * \note This function verifies that a decoded message matches itself after
  515. * the encode decode routine.
  516. */
  517. int ast_aoc_test_encode_decode_match(struct ast_aoc_decoded *decoded);
  518. /*! \brief enable aoc cli options */
  519. int ast_aoc_cli_init(void);
  520. #endif /* _AST_AOC_H_ */