[svn-commits] dvossel: branch group/aoc r251398 - in /team/group/aoc: include/asterisk/ main/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Mar 8 18:15:54 CST 2010


Author: dvossel
Date: Mon Mar  8 18:15:50 2010
New Revision: 251398

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=251398
Log:
addition of generic aoc encode routine

Modified:
    team/group/aoc/include/asterisk/aoc.h
    team/group/aoc/main/aoc.c

Modified: team/group/aoc/include/asterisk/aoc.h
URL: http://svnview.digium.com/svn/asterisk/team/group/aoc/include/asterisk/aoc.h?view=diff&rev=251398&r1=251397&r2=251398
==============================================================================
--- team/group/aoc/include/asterisk/aoc.h (original)
+++ team/group/aoc/include/asterisk/aoc.h Mon Mar  8 18:15:50 2010
@@ -49,10 +49,10 @@
 };
 
 enum ast_aoc_type {
-	/* AOC_S */  /* Reserved for AOC-S support */
+	AOC_REQUEST = 0,
 	AOC_D,
 	AOC_E,
-	AOC_REQUEST,
+	/* AOC_S */  /* Reserved for AOC-S support */
 };
 
 enum ast_aoc_charge_type {

Modified: team/group/aoc/main/aoc.c
URL: http://svnview.digium.com/svn/asterisk/team/group/aoc/main/aoc.c?view=diff&rev=251398&r1=251397&r2=251398
==============================================================================
--- team/group/aoc/main/aoc.c (original)
+++ team/group/aoc/main/aoc.c Mon Mar  8 18:15:50 2010
@@ -24,11 +24,14 @@
  */
 
 #include "asterisk.h"
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$");
+
 #include "asterisk/aoc.h"
 #include "asterisk/utils.h"
 #include "asterisk/strings.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$");
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
 
 #include "asterisk/_private.h"
 
@@ -50,6 +53,8 @@
 
 #define AOC_ENCODED_CHARGE_SUBTOTAL (1 << 7)
 #define AOC_ENCODED_CHARGE_TOTAL    (0 << 7)
+
+#define AOC_ENCODE_VERSION 1
 
 /* AOC Payload Header. Holds all the encoded AOC data to pass on the wire */
 struct ast_aoc_encoded {
@@ -80,13 +85,13 @@
 
 	/* Charging Association information */
 	int charging_association_id;
-	char charging_association_number[64];
+	char charging_association_number[32];
 };
 
 struct aoc_pl_ie_hdr {
 	uint8_t ie_id;
 	uint8_t datalen;
-	unsigned char data[0];
+	char data[0];
 };
 
 /* AOC Payload Information Elements */
@@ -103,22 +108,15 @@
 	uint8_t  type;
 };
 
-#define AOCE_IE_BILLING 3
-struct aoce_ie_billing {
-	uint8_t aoce_billing_id;
-};
-
-#define AOCD_IE_BILLING 4
-struct aocd_ie_billing {
-	uint8_t aocd_billing_id;
+#define AOC_IE_BILLING 3
+struct aoc_ie_billing {
+	uint8_t id;
 };
 
 #define AOC_IE_CHARGING_ASSOCIATION 5
 struct aoc_ie_charging_association {
-	int16_t charge_id;
-	uint8_t datalen;
-	unsigned char data[0];
-
+	int32_t charge_id;
+	char charge_number[32];
 };
 
 struct ast_aoc_decoded *ast_aoc_create(const enum ast_aoc_type msg_type,
@@ -129,7 +127,10 @@
 
 	if (!(decoded = ast_calloc(1, sizeof(struct ast_aoc_decoded)))) {
 		ast_log(LOG_WARNING, "Failed to create ast_aoc_decoded object \n");
-	}
+		return NULL;
+	}
+
+	decoded->msg_type = msg_type;
 
 	if (msg_type == AOC_REQUEST) {
 		decoded->request_flag = requests;
@@ -160,16 +161,129 @@
 	return decoded;
 }
 
+struct aoc_ie_data {
+	unsigned char buf[1024];
+	int pos;
+};
+
+/* \brief append an AOC information element
+ * \note data is expecte to already be in network byte order at this point
+ */
+static int append_ie(struct aoc_ie_data *ied, unsigned short ie_id, const void *data, unsigned short datalen)
+{
+	if (datalen > ((int)sizeof(ied->buf) - ied->pos)) {
+		ast_log(LOG_WARNING, "Failure to append AOC information element, out of space \n");
+		return -1;
+	}
+	ied->buf[ied->pos++] = htons(ie_id);
+	ied->buf[ied->pos++] = htons(datalen);
+	memcpy(ied->buf + ied->pos, data, datalen);
+	ied->pos += datalen;
+	return 0;
+}
+
 struct ast_aoc_encoded *ast_aoc_encode(struct ast_aoc_decoded *decoded)
 {
 	struct ast_aoc_encoded *encoded = ast_calloc(1, sizeof(struct ast_aoc_encoded));
+	struct aoc_ie_data ied = { .pos = 0 };
 
 	if (!encoded) {
 		ast_log(LOG_WARNING, "Failed to create ast_aoc_encoded object during decode routine. \n");
 		return NULL;
 	}
 
-//todohere actually encode a msg 
+	/* encode the message */
+	encoded->version = AOC_ENCODE_VERSION;
+
+	/* set msg type */
+	switch (decoded->msg_type) {
+	case AOC_D:
+		encoded->flags |= AOC_ENCODED_TYPE_D;
+		break;
+	case AOC_E:
+		encoded->flags |= AOC_ENCODED_TYPE_E;
+		break;
+	case AOC_REQUEST:
+	default:
+		break;
+	}
+
+	/* set request type */
+	if (encoded->flags | AOC_ENCODED_TYPE_REQUEST) {
+		if (decoded->request_flag | AOC_REQUEST_S) {
+			encoded->flags |= AOC_ENCODED_REQUEST_S;
+		}
+		if (decoded->request_flag | AOC_REQUEST_D) {
+			encoded->flags |= AOC_ENCODED_REQUEST_D;
+		}
+		if (decoded->request_flag | AOC_REQUEST_E) {
+			encoded->flags |= AOC_ENCODED_REQUEST_E;
+		}
+	}
+
+	/* set charge type */
+	if (!(encoded->flags & AOC_ENCODED_TYPE_REQUEST)) {
+		switch (decoded->charge_type) {
+		case AOC_CHARGE_UNIT:
+			encoded->flags |= AOC_ENCODED_CHARGE_UNIT;
+			break;
+		case AOC_CHARGE_CURRENCY:
+			encoded->flags |= AOC_ENCODED_CHARGE_CURRENCY;
+			break;
+		case AOC_CHARGE_FREE:
+			encoded->flags |= AOC_ENCODED_CHARGE_FREE;
+		case AOC_CHARGE_NA:
+		default:
+			break;
+		}
+
+	}
+
+	/* set total type */
+	if (decoded->total_type == AOC_SUBTOTAL) {
+		encoded->flags |= AOC_ENCODED_CHARGE_SUBTOTAL;
+	}
+
+	/* Append Information Elements
+	 * NOTE, everything must be in NETWORK BYTE ORDER */
+
+	if (decoded->currency_amount) {
+		struct aoc_ie_currency ie = { 0 };
+
+		ie.amount = htonl(decoded->currency_amount);
+		ie.multiplier = htons(decoded->multiplier);
+		if (!ast_strlen_zero(decoded->currency_name)) {
+			ast_copy_string(ie.name, decoded->currency_name, sizeof(ie.name));
+		}
+
+		append_ie(&ied, AOC_IE_CURRENCY, (const void *) &ie, sizeof(ie));
+	}
+
+	if (decoded->unit_count) {
+		struct aoc_ie_unit ie = { 0 };
+		int i;
+		for (i = 0; i < decoded->unit_count; i++) {
+			ie.amount = htonl(decoded->unit_list[i].amount);
+			ie.type = htons(decoded->unit_list[i].type);
+			append_ie(&ied, AOC_IE_UNIT, (const void *) &ie, sizeof(ie));
+		}
+	}
+
+	if (decoded->billing_id) {
+		struct aoc_ie_billing ie;
+		ie.id = htons(decoded->billing_id);
+		append_ie(&ied, AOC_IE_BILLING, (const void *) &ie, sizeof(ie));
+	}
+
+	if (decoded->charging_association_id ||
+		!ast_strlen_zero(decoded->charging_association_number)) {
+		struct aoc_ie_charging_association ie;
+		ie.charge_id = htonl(decoded->charging_association_id);
+		if (!ast_strlen_zero(decoded->charging_association_number)) {
+			ast_copy_string(ie.charge_number, decoded->charging_association_number, sizeof(ie.charge_number));
+		}
+		append_ie(&ied, AOC_IE_CHARGING_ASSOCIATION, (const void *) &ie, sizeof(ie));
+	}
 
 	return encoded;
 }




More information about the svn-commits mailing list