sgsn: Fill the cch_pdp with a value coming from the tlv structure

For some GGSNs we need to insert the PDP Charging Characteristics
that were returned. We receive these values from GSUP and will
fill them into the tlv structure when finding the ggsn context.

Change-Id: I1725bfd2403d29ce3550bfcd6fcc1498426ef906
diff --git a/src/gprs/gprs_sgsn.c b/src/gprs/gprs_sgsn.c
index 18625ae..11225dd 100644
--- a/src/gprs/gprs_sgsn.c
+++ b/src/gprs/gprs_sgsn.c
@@ -699,10 +699,21 @@
 	sgsn_auth_update(mmctx);
 }
 
-static void insert_qos(struct tlv_parsed *tp, struct sgsn_subscriber_pdp_data *pdp)
+static void insert_extra(struct tlv_parsed *tp,
+			struct sgsn_subscriber_data *data,
+			struct sgsn_subscriber_pdp_data *pdp)
 {
 	tp->lv[OSMO_IE_GSM_SUB_QOS].len = pdp->qos_subscribed_len;
 	tp->lv[OSMO_IE_GSM_SUB_QOS].val = pdp->qos_subscribed;
+
+	/* Prefer PDP charging characteristics of per subscriber one */
+	if (pdp->has_pdp_charg) {
+		tp->lv[OSMO_IE_GSM_CHARG_CHAR].len = sizeof(pdp->pdp_charg);
+		tp->lv[OSMO_IE_GSM_CHARG_CHAR].val = &pdp->pdp_charg[0];
+	} else if (data->has_pdp_charg) {
+		tp->lv[OSMO_IE_GSM_CHARG_CHAR].len = sizeof(data->pdp_charg);
+		tp->lv[OSMO_IE_GSM_CHARG_CHAR].val = &data->pdp_charg[0];
+	}
 }
 
 /**
@@ -751,7 +762,7 @@
 			{
 				allow_any_apn = 1;
 				selected_apn_str = "";
-				insert_qos(tp, pdp);
+				insert_extra(tp, mmctx->subscr->sgsn_data, pdp);
 				continue;
 			}
 			if (!llist_empty(&sgsn_apn_ctxts)) {
@@ -760,7 +771,7 @@
 				if (apn_ctx == NULL)
 					continue;
 			}
-			insert_qos(tp, pdp);
+			insert_extra(tp, mmctx->subscr->sgsn_data, pdp);
 			selected_apn_str = pdp->apn_str;
 			break;
 		}
@@ -768,13 +779,13 @@
 		/* Check whether the given APN is granted */
 		llist_for_each_entry(pdp, &mmctx->subscr->sgsn_data->pdp_list, list) {
 			if (strcmp(pdp->apn_str, "*") == 0) {
-				insert_qos(tp, pdp);
+				insert_extra(tp, mmctx->subscr->sgsn_data, pdp);
 				selected_apn_str = req_apn_str;
 				allow_any_apn = 1;
 				continue;
 			}
 			if (strcasecmp(pdp->apn_str, req_apn_str) == 0) {
-				insert_qos(tp, pdp);
+				insert_extra(tp, mmctx->subscr->sgsn_data, pdp);
 				selected_apn_str = req_apn_str;
 				break;
 			}