struct private_object_data {
enum co_context_state state;
- unsigned int id;
+ unsigned char id;
enum co_context_role role;
+ gboolean default_profile;
+ gboolean attach_apn;
char *apn;
char *addr;
enum co_context_type type;
enum co_context_d_comp d_comp;
enum co_context_h_comp h_comp;
-
+ enum co_context_tech tech_pref;
char *username;
char *password;
char *dns1;
union tcore_ip4_type dns_primary_v4;
union tcore_ip4_type dns_secondary_v4;
- /*IPv6 will be supported*/
+ /* IPv6 will be supported */
+ char *ip_v6;
+ char *gateway_v6;
+ char *dns_primary_v6;
+ char *dns_secondary_v6;
+
+ pcscf_addr *pcscf_ipv4;
+ pcscf_addr *pcscf_ipv6;
char *proxy;
char *mmsurl;
char *profile_name;
char devname[16];
+
+ /* Dedicated bearer information */
+ struct dedicated_bearer_info dedicated_bearer;
};
static void _free_hook(CoreObject *o)
po = tcore_object_ref_object(o);
if (po) {
- g_free(po);
+ free(po);
tcore_object_link_object(o, NULL);
}
}
if (!o)
return NULL;
- po = calloc(sizeof(struct private_object_data), 1);
+ po = calloc(1, sizeof(struct private_object_data));
if (!po) {
tcore_object_free(o);
return NULL;
po->h_comp = CONTEXT_H_COMP_OFF;
po->role = CONTEXT_ROLE_UNKNOWN;
po->auth = CONTEXT_AUTH_NONE;
+ po->tech_pref = CONTEXT_TECH_3GPP;
tcore_object_set_type(o, CORE_OBJECT_TYPE_PS_CONTEXT);
tcore_object_link_object(o, po);
return o;
}
-CoreObject *tcore_context_clone(TcorePlugin *p, const char *name, TcoreHal *hal)
-{
- CoreObject *o = NULL;
-
- if (!p)
- return NULL;
-
- o = tcore_object_clone_template_object(p, name, CORE_OBJECT_TYPE_PS_CONTEXT);
- if (!o)
- return NULL;
-
- tcore_object_set_hal(o, hal);
-
- return o;
-}
-
void tcore_context_free(CoreObject *o)
{
- struct private_object_data *po = NULL;
-
CORE_OBJECT_CHECK(o, CORE_OBJECT_TYPE_PS_CONTEXT);
-
- po = tcore_object_ref_object(o);
- if (!po)
- return;
-
- g_free(po);
- tcore_object_link_object(o, NULL);
tcore_object_free(o);
}
return po->state;
}
-TReturn tcore_context_set_id(CoreObject *o, unsigned int id)
+TReturn tcore_context_set_id(CoreObject *o, unsigned char id)
{
struct private_object_data *po = NULL;
return TCORE_RETURN_SUCCESS;
}
-unsigned int tcore_context_get_id(CoreObject *o)
+unsigned char tcore_context_get_id(CoreObject *o)
{
struct private_object_data *po = NULL;
po->apn = NULL;
}
- if (apn) {
+ if (apn)
po->apn = g_strdup(apn);
- }
return TCORE_RETURN_SUCCESS;
}
po->addr = NULL;
}
- if (addr) {
+ if (addr)
po->addr = g_strdup(addr);
- }
return TCORE_RETURN_SUCCESS;
}
return po->h_comp;
}
+TReturn tcore_context_set_tech_preference(CoreObject *o, enum co_context_tech tech)
+{
+ struct private_object_data *po = NULL;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, TCORE_RETURN_EINVAL);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
+ return TCORE_RETURN_EINVAL;
+
+ po->tech_pref = tech;
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+enum co_context_tech tcore_context_get_tech_preference(CoreObject *o)
+{
+ struct private_object_data *po = NULL;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, 0);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
+ return CONTEXT_TECH_INVALID;
+
+ return po->tech_pref;
+}
+
TReturn tcore_context_set_username(CoreObject *o, const char *username)
{
struct private_object_data *po = NULL;
po->username = NULL;
}
- if (username) {
+ if (username)
po->username = g_strdup(username);
- }
return TCORE_RETURN_SUCCESS;
}
po->password = NULL;
}
- if (password) {
+ if (password)
po->password = g_strdup(password);
- }
return TCORE_RETURN_SUCCESS;
}
po->dns1 = NULL;
}
- if (dns) {
+ if (dns)
po->dns1 = g_strdup(dns);
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+TReturn tcore_context_set_ipv6_dns1(CoreObject *o, const char *dns)
+{
+ struct private_object_data *po = NULL;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, TCORE_RETURN_EINVAL);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
+ return TCORE_RETURN_EINVAL;
+
+ if (po->dns_primary_v6) {
+ free(po->dns_primary_v6);
+ po->dns_primary_v6 = NULL;
}
+ if (dns)
+ po->dns_primary_v6 = g_strdup(dns);
+
return TCORE_RETURN_SUCCESS;
}
po->dns2 = NULL;
}
- if (dns) {
+ if (dns)
po->dns2 = g_strdup(dns);
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+TReturn tcore_context_set_ipv6_dns2(CoreObject *o, const char *dns)
+{
+ struct private_object_data *po = NULL;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, TCORE_RETURN_EINVAL);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
+ return TCORE_RETURN_EINVAL;
+
+ if (po->dns_secondary_v6) {
+ free(po->dns_secondary_v6);
+ po->dns_secondary_v6 = NULL;
}
+ if (dns)
+ po->dns_secondary_v6 = g_strdup(dns);
+
return TCORE_RETURN_SUCCESS;
}
po->apn = NULL;
}
- if (proxy) {
+ if (proxy)
po->proxy = g_strdup(proxy);
- }
return TCORE_RETURN_SUCCESS;
}
po->mmsurl = NULL;
}
- if (mmsurl) {
+ if (mmsurl)
po->mmsurl = g_strdup(mmsurl);
- }
return TCORE_RETURN_SUCCESS;
}
po->profile_name = NULL;
}
- if (profile_name) {
+ if (profile_name)
po->profile_name = g_strdup(profile_name);
- }
return TCORE_RETURN_SUCCESS;
}
return g_strdup(po->profile_name);
}
-TReturn tcore_context_set_devinfo(CoreObject *o, struct tnoti_ps_pdp_ipconfiguration *devinfo)
+TReturn tcore_context_set_default_profile(CoreObject *o, gboolean default_conn)
{
struct private_object_data *po = NULL;
po = tcore_object_ref_object(o);
if (!po)
+ return TCORE_RETURN_EINVAL;
+
+ po->default_profile = default_conn;
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+gboolean tcore_context_get_default_profile(CoreObject *o)
+{
+ struct private_object_data *po = NULL;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, FALSE);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
return FALSE;
- if (!devinfo)
- return FALSE;
+ return po->default_profile;
+}
+
+TReturn tcore_context_set_devinfo(CoreObject *o, struct tnoti_ps_pdp_ipconfiguration *devinfo)
+{
+ struct private_object_data *po = NULL;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, TCORE_RETURN_EINVAL);
+
+ po = tcore_object_ref_object(o);
+
+ if (!po || !devinfo)
+ return TCORE_RETURN_EINVAL;
+
+ /* Free context resource if it was already allocated */
+ tcore_context_reset_devinfo(o);
+
+ po->ip_v6 = g_strdup((gchar *)devinfo->ipv6_address);
+ po->dns_primary_v6 = g_strdup((gchar *)devinfo->ipv6_primary_dns);
+ po->dns_secondary_v6 = g_strdup((gchar *)devinfo->ipv6_secondary_dns);
+ po->gateway_v6 = g_strdup((gchar *)devinfo->ipv6_gateway);
memcpy(&(po->ip_v4), devinfo->ip_address, sizeof(union tcore_ip4_type));
memcpy(&(po->dns_primary_v4), devinfo->primary_dns, sizeof(union tcore_ip4_type));
memcpy(&(po->dns_secondary_v4), devinfo->secondary_dns, sizeof(union tcore_ip4_type));
memcpy(&(po->gateway_v4), devinfo->gateway, sizeof(union tcore_ip4_type));
memcpy(po->devname, devinfo->devname, sizeof(char) * 16);
+ po->pcscf_ipv4 = g_try_malloc0(sizeof(pcscf_addr));
+ if (po->pcscf_ipv4) {
+ po->pcscf_ipv4->count = devinfo->pcscf_ipv4_count;
+ if (po->pcscf_ipv4->count > 0) {
+ unsigned int i;
+ po->pcscf_ipv4->addr = g_try_malloc0(sizeof(char *) * po->pcscf_ipv4->count);
+ if ((po->pcscf_ipv4->addr) && (devinfo->pcscf_ipv4))
+ for (i = 0; i < po->pcscf_ipv4->count; i++)
+ po->pcscf_ipv4->addr[i] = g_strdup(devinfo->pcscf_ipv4[i]);
+ }
+ }
+
+ po->pcscf_ipv6 = g_try_malloc0(sizeof(pcscf_addr));
+ if (po->pcscf_ipv6) {
+ po->pcscf_ipv6->count = devinfo->pcscf_ipv6_count;
+ if (po->pcscf_ipv6->count > 0) {
+ unsigned int i;
+ po->pcscf_ipv6->addr = g_try_malloc0(sizeof(char *) * po->pcscf_ipv6->count);
+ if ((po->pcscf_ipv6->addr) && (devinfo->pcscf_ipv6))
+ for (i = 0; i < po->pcscf_ipv6->count; i++)
+ po->pcscf_ipv6->addr[i] = g_strdup(devinfo->pcscf_ipv6[i]);
+ }
+ }
+
return TCORE_RETURN_SUCCESS;
}
TReturn tcore_context_reset_devinfo(CoreObject *o)
{
struct private_object_data *po = NULL;
+ unsigned int i;
CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, TCORE_RETURN_EINVAL);
po = tcore_object_ref_object(o);
if (!po)
- return FALSE;
+ return TCORE_RETURN_EINVAL;
+
+ if (po->ip_v6) {
+ g_free(po->ip_v6);
+ po->ip_v6 = NULL;
+ }
+
+ if (po->dns_primary_v6) {
+ g_free(po->dns_primary_v6);
+ po->dns_primary_v6 = NULL;
+ }
+
+ if (po->dns_secondary_v6) {
+ g_free(po->dns_secondary_v6);
+ po->dns_secondary_v6 = NULL;
+ }
+
+ if (po->gateway_v6) {
+ g_free(po->gateway_v6);
+ po->gateway_v6 = NULL;
+ }
+
+ if (po->pcscf_ipv4) {
+ for (i = 0; i < po->pcscf_ipv4->count; i++)
+ g_free(po->pcscf_ipv4->addr[i]);
+ g_free(po->pcscf_ipv4);
+ po->pcscf_ipv4 = NULL;
+ }
+
+ if (po->pcscf_ipv6) {
+ for (i = 0; i < po->pcscf_ipv6->count; i++)
+ g_free(po->pcscf_ipv6->addr[i]);
+ g_free(po->pcscf_ipv6);
+ po->pcscf_ipv6 = NULL;
+ }
memset(&(po->ip_v4), 0, sizeof(union tcore_ip4_type));
memset(&(po->dns_primary_v4), 0, sizeof(union tcore_ip4_type));
return TCORE_RETURN_SUCCESS;
}
+TReturn tcore_context_set_bearer_info(CoreObject *o, struct tnoti_ps_dedicated_bearer_info *bearer_info)
+{
+ struct private_object_data *po = NULL;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, TCORE_RETURN_EINVAL);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
+ return TCORE_RETURN_EINVAL;
+
+ if (!bearer_info)
+ return TCORE_RETURN_EINVAL;
+
+ if (bearer_info->dedicated_bearer.num_dedicated_bearer > 0)
+ memcpy(&(po->dedicated_bearer), &(bearer_info->dedicated_bearer), sizeof(struct dedicated_bearer_info));
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+TReturn tcore_context_get_bearer_info(CoreObject *o, struct dedicated_bearer_info *bearer_info)
+{
+ struct private_object_data *po = NULL;
+ guchar count = 0;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, TCORE_RETURN_EINVAL);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
+ return TCORE_RETURN_EINVAL;
+
+ if (!bearer_info)
+ return TCORE_RETURN_EINVAL;
+
+ count = po->dedicated_bearer.num_dedicated_bearer;
+ if (count > MAX_NUM_DEDICATED_BEARER)
+ return TCORE_RETURN_EINVAL;
+
+ if (count > 0) {
+ bearer_info->num_dedicated_bearer = count;
+ bearer_info->secondary_context_id = po->dedicated_bearer.secondary_context_id;
+ memcpy(bearer_info->qos, po->dedicated_bearer.qos, count*sizeof(struct qos_parameter));
+ }
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+TReturn tcore_context_reset_bearer_info(CoreObject *o)
+{
+ struct private_object_data *po = NULL;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, TCORE_RETURN_EINVAL);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
+ return TCORE_RETURN_EINVAL;
+
+ if (po->dedicated_bearer.num_dedicated_bearer > 0)
+ memset(&(po->dedicated_bearer), 0, sizeof(struct dedicated_bearer_info));
+
+ return TCORE_RETURN_SUCCESS;
+}
+
void tcore_context_cp_service_info(CoreObject *dest, CoreObject *src)
{
struct private_object_data *d_po = NULL;
d_po->state = s_po->state;
d_po->id = s_po->id;
+
+ d_po->ip_v6 = g_strdup(s_po->ip_v6);
+ d_po->dns_primary_v6 = g_strdup(s_po->dns_primary_v6);
+ d_po->dns_secondary_v6 = g_strdup(s_po->dns_secondary_v6);
+ d_po->gateway_v6 = g_strdup(s_po->gateway_v6);
+
memcpy(&(d_po->ip_v4), &(s_po->ip_v4), sizeof(union tcore_ip4_type));
memcpy(&(d_po->dns_primary_v4), &(s_po->dns_primary_v4), sizeof(union tcore_ip4_type));
memcpy(&(d_po->dns_secondary_v4), &(s_po->dns_secondary_v4), sizeof(union tcore_ip4_type));
memcpy(&(d_po->gateway_v4), &(s_po->gateway_v4), sizeof(union tcore_ip4_type));
memcpy(d_po->devname, s_po->devname, sizeof(char) * 16);
-
- return;
}
-char* tcore_context_get_ipv4_addr(CoreObject *o)
+char *tcore_context_get_ipv4_addr(CoreObject *o)
{
struct private_object_data *po = NULL;
return tcore_util_get_string_by_ip4type(po->ip_v4);
}
-char* tcore_context_get_ipv4_dns1(CoreObject *o)
+char *tcore_context_get_ipv4_dns1(CoreObject *o)
{
struct private_object_data *po = NULL;
return tcore_util_get_string_by_ip4type(po->dns_primary_v4);
}
-char* tcore_context_get_ipv4_dns2(CoreObject *o)
+char *tcore_context_get_ipv4_dns2(CoreObject *o)
{
struct private_object_data *po = NULL;
return tcore_util_get_string_by_ip4type(po->dns_secondary_v4);
}
-char* tcore_context_get_ipv4_gw(CoreObject *o)
+char *tcore_context_get_ipv4_gw(CoreObject *o)
{
struct private_object_data *po = NULL;
return tcore_util_get_string_by_ip4type(po->gateway_v4);
}
-char* tcore_context_get_ipv4_devname(CoreObject *o)
+char *tcore_context_get_ipv4_devname(CoreObject *o)
{
struct private_object_data *po = NULL;
return g_strdup(po->devname);
}
+
+char *tcore_context_get_ipv6_addr(CoreObject *o)
+{
+ struct private_object_data *po = NULL;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, NULL);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
+ return NULL;
+
+ return g_strdup(po->ip_v6);
+}
+
+char *tcore_context_get_ipv6_dns1(CoreObject *o)
+{
+ struct private_object_data *po = NULL;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, NULL);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
+ return NULL;
+
+ return g_strdup(po->dns_primary_v6);
+}
+
+char *tcore_context_get_ipv6_dns2(CoreObject *o)
+{
+ struct private_object_data *po = NULL;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, NULL);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
+ return NULL;
+
+ return g_strdup(po->dns_secondary_v6);
+}
+
+char *tcore_context_get_ipv6_gw(CoreObject *o)
+{
+ struct private_object_data *po = NULL;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, NULL);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
+ return NULL;
+
+ return g_strdup(po->gateway_v6);
+}
+
+pcscf_addr *tcore_context_get_pcscf_ipv4_addr(CoreObject *o)
+{
+ struct private_object_data *po = NULL;
+ pcscf_addr *pcscf_tmp;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, NULL);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
+ return NULL;
+
+ if (!po->pcscf_ipv4)
+ return NULL;
+
+ pcscf_tmp = g_try_malloc0(sizeof(pcscf_addr));
+ if (!pcscf_tmp)
+ return NULL;
+
+ pcscf_tmp->count = po->pcscf_ipv4->count;
+ if (pcscf_tmp->count > 0) {
+ unsigned int i;
+ pcscf_tmp->addr = g_try_malloc0(sizeof(char *) * po->pcscf_ipv4->count);
+ if (!pcscf_tmp->addr) {
+ g_free(pcscf_tmp);
+ return NULL;
+ }
+
+ for (i = 0; i < po->pcscf_ipv4->count; i++)
+ pcscf_tmp->addr[i] = g_strdup(po->pcscf_ipv4->addr[i]);
+ }
+
+ return pcscf_tmp;
+}
+
+pcscf_addr *tcore_context_get_pcscf_ipv6_addr(CoreObject *o)
+{
+ struct private_object_data *po = NULL;
+ pcscf_addr *pcscf_tmp;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, NULL);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
+ return NULL;
+
+ if (!po->pcscf_ipv6)
+ return NULL;
+
+ pcscf_tmp = g_try_malloc0(sizeof(pcscf_addr));
+ if (!pcscf_tmp)
+ return NULL;
+
+ pcscf_tmp->count = po->pcscf_ipv6->count;
+ if (pcscf_tmp->count > 0) {
+ unsigned int i;
+ pcscf_tmp->addr = g_try_malloc0(sizeof(char *) * po->pcscf_ipv6->count);
+ if (!pcscf_tmp->addr) {
+ g_free(pcscf_tmp);
+ return NULL;
+ }
+
+ for (i = 0; i < po->pcscf_ipv6->count; i++)
+ pcscf_tmp->addr[i] = g_strdup(po->pcscf_ipv6->addr[i]);
+ }
+
+ return pcscf_tmp;
+}
+
+TReturn tcore_context_set_attach_apn(CoreObject *o, gboolean flag)
+{
+ struct private_object_data *po = NULL;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, TCORE_RETURN_EINVAL);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
+ return TCORE_RETURN_EINVAL;
+
+ po->attach_apn = flag;
+
+ return TCORE_RETURN_SUCCESS;
+}
+
+gboolean tcore_context_get_attach_apn(CoreObject *o)
+{
+ struct private_object_data *po = NULL;
+
+ CORE_OBJECT_CHECK_RETURN(o, CORE_OBJECT_TYPE_PS_CONTEXT, FALSE);
+
+ po = tcore_object_ref_object(o);
+ if (!po)
+ return FALSE;
+
+ return po->attach_apn;
+}