Пример #1
0
/**
 * Produces a JSON-encoded msg containing the TID response
 *
 * @param mem_ctx talloc context for the return value
 * @param resp outgoing response
 * @return JSON-encoded message containing the TID response
 */
static char *tids_encode_response(TALLOC_CTX *mem_ctx, TID_RESP *resp)
{
  TR_MSG mresp;
  char *resp_buf = NULL;

  /* Construct the response message */
  tid_set_tr_msg_resp(&mresp, resp);

  /* Encode the message to JSON */
  resp_buf = tr_msg_encode(mem_ctx, &mresp);
  if (resp_buf == NULL) {
    tr_err("tids_encode_response: Error encoding json response.");
    return NULL;
  }
  tr_debug("tids_encode_response: Encoded response: %s", resp_buf);

  /* Success */
  return resp_buf;
}
Пример #2
0
DH *tr_create_matching_dh (unsigned char *priv_key,
			   size_t keylen,
			   DH *in_dh) {
  DH *dh = NULL;
  int dh_err = 0;

  if (!in_dh)
    return NULL;

  if (NULL == (dh = DH_new())) {
    tr_crit("tr_create_matching_dh: unable to allocate new DH structure.");
    return NULL;
  }

  if ((NULL == (dh->g = BN_dup(in_dh->g))) ||
      (NULL == (dh->p = BN_dup(in_dh->p)))) {
    DH_free(dh);
    tr_debug("tr_create_matching_dh: Invalid dh parameter values, can't be duped.");
    return NULL;
  }

  /* TBD -- share code with previous function */
  if ((priv_key) && (keylen > 0))
    dh->priv_key = BN_bin2bn(priv_key, keylen, NULL);

  DH_generate_key(dh);		/* generates the public key */
  DH_check(dh, &dh_err);
  if (0 != dh_err) {
    tr_warning("Warning: dh_check failed with %d", dh_err);
    if (dh_err & DH_CHECK_P_NOT_PRIME)
      tr_warning(": p value is not prime");
    else if (dh_err & DH_CHECK_P_NOT_SAFE_PRIME)
      tr_warning(": p value is not a safe prime");
    else if (dh_err & DH_UNABLE_TO_CHECK_GENERATOR)
      tr_warning(": unable to check the generator value");
    else if (dh_err & DH_NOT_SUITABLE_GENERATOR)
      tr_warning(": the g value is not a generator");
    else
      tr_warning("unhandled error %i", dh_err);
  }

  return(dh);
}
Пример #3
0
/*
 * \brief A function which will be eventually called by NanoStack OS when ever the OS has an event to deliver.
 * @param event, describes the sender, receiver and event type.
 *
 * NOTE: Interrupts requested by HW are possible during this function!
 */
void nd_tasklet_main(arm_event_s *event)
{
    arm_library_event_type_e event_type;
    event_type = (arm_library_event_type_e) event->event_type;

    switch (event_type) {
        case ARM_LIB_NWK_INTERFACE_EVENT:
            /* This event is delivered every and each time when there is new
             * information of network connectivity.
             */
            nd_tasklet_parse_network_event(event);
            break;

        case ARM_LIB_TASKLET_INIT_EVENT:
            /* Event with type EV_INIT is an initializer event of NanoStack OS.
             * The event is delivered when the NanoStack OS is running fine.
             * This event should be delivered ONLY ONCE.
             */
            tasklet_data_ptr->node_main_tasklet_id = event->receiver;
            mesh_system_send_connect_event(tasklet_data_ptr->tasklet);
            break;

        case ARM_LIB_SYSTEM_TIMER_EVENT:
            eventOS_event_timer_cancel(event->event_id,
                                       tasklet_data_ptr->node_main_tasklet_id);

            if (event->event_id == TIMER_EVENT_START_BOOTSTRAP) {
                tr_debug("Restart bootstrap");
                nd_tasklet_configure_and_connect_to_network();
            }
            break;

        case APPLICATION_EVENT:
            if (event->event_id == APPL_EVENT_CONNECT) {
                nd_tasklet_configure_and_connect_to_network();
            }
            break;

        default:
            break;
    } // switch(event_type)
}
Пример #4
0
TR_IDP_REALM *tr_cfg_find_idp (TR_CFG *tr_cfg, TR_NAME *idp_id, TR_CFG_RC *rc)
{

  TR_IDP_REALM *cfg_idp;

  if ((!tr_cfg) || (!idp_id)) {
    if (rc)
      *rc = TR_CFG_BAD_PARAMS;
    return NULL;
  }

  for (cfg_idp = tr_cfg->idp_realms; NULL != cfg_idp; cfg_idp = cfg_idp->next) {
    if (!tr_name_cmp (idp_id, cfg_idp->realm_id)) {
      tr_debug("tr_cfg_find_idp: Found %s.", idp_id->buf);
      return cfg_idp;
    }
  }
  /* if we didn't find one, return NULL */ 
  return NULL;
}
Пример #5
0
void thread_security_prev_key_generate(protocol_interface_info_entry_t *cur, uint8_t *masterKey, uint32_t keySequence)
{
    uint8_t key_material[32];
    uint8_t key_index;
    uint32_t thrKeySequenceCounter;
    if (keySequence == 0) {
        // in initial value there is no prev available
        return;
    }
    thrKeySequenceCounter = keySequence - 1;
    /* Produced keys from Thread security material: MAC key | MLE key */
    thread_key_get(masterKey, key_material, thrKeySequenceCounter);
    /* Update keys as primary keys */
    key_index = THREAD_KEY_INDEX(thrKeySequenceCounter);
    tr_debug("Set previous key Id: %u", key_index);
    mac_helper_security_prev_key_set(cur, &key_material[16], key_index, MAC_KEY_ID_MODE_IDX);
    mle_service_security_set_security_key(cur->id, key_material, key_index, false);
    //copy master secret material to history
    thread_history_key_material_push(cur->thread_info, key_material, key_index);
}
Пример #6
0
void pana_session_init_by_session_ptr(sec_suite_t *suite, auth_info_t *auth_ptr)
{
    if (suite) {
        suite->setups = 0;
        pana_session_state_init(&suite->pana_session);
        suite->pana_session.auth_info = auth_ptr;

        eap_fragmentation_init(suite);
        if (suite->pana_session.session_ready) {
            tr_debug("Ping Notify");
            suite->state = PANA_PING_REQ;
            suite->timer = 1;
            suite->retry_counter = 0;
        } else {
            if (sec_pana_protocol_init(suite) == 0) {
                sec_lib_state_machine_trig(suite, PANA_ERROR);
            }
        }
    }
}
Пример #7
0
void tr_audit_req(TID_REQ *req) {

  if (NULL != req) {

    char *attrs[] = { audit_fmt("comm", NULL != req->comm ? req->comm->buf : NULL),
                      audit_fmt("rp_realm", NULL != req->rp_realm ? req->rp_realm->buf : NULL),
                      audit_fmt("realm", NULL != req->realm ? req->realm->buf : NULL),
                    };

    char *msg = join_audit_msg(sizeof(attrs) / sizeof(attrs[0]), attrs);
    free_array(sizeof(attrs) / sizeof(attrs[0]), attrs);

    fire_log(LOG_INFO, AUDIT_FACILITY, "%s%s%s", LOG_PREFIX, msg, LOG_MSG_TERMINATOR);

    free(msg);
  }
  else {

        tr_debug("tr_audit_req: Message dropped, null pointer passed.");
  }
}
Пример #8
0
/**
 * Parse a signed integer
 *
 * If the key does not exist in the src object, returns success but does fill in *dest.
 *
 * @param src JSON object to pull a value from
 * @param key key to pull
 * @param dest (output) pointer to an allocated integer
 * @return TR_CFG_SUCCESS or an error code
 */
static TR_CFG_RC tr_cfg_parse_integer(json_t *src, const char *key, int *dest)
{
  json_t *jtmp;

  /* Validate parameters */
  if ((src == NULL) || (key == NULL) || (dest == NULL))
    return TR_CFG_BAD_PARAMS;

  /* See if we have a value for this key; do nothing if not */
  jtmp = json_object_get(src, key);
  if (jtmp) {
    if (json_is_number(jtmp)) {
      *dest = (int) json_integer_value(jtmp);
    } else {
      tr_debug("tr_cfg_parse_unsigned: Parsing error, %s is not a number.", key);
      return TR_CFG_NOPARSE;
    }
  }

  return TR_CFG_SUCCESS;
}
Пример #9
0
nsapi_error_t NanostackInterface::socket_bind(void *handle, const SocketAddress &address)
{
    // Validate parameters
    NanostackSocket *socket = static_cast<NanostackSocket *>(handle);
    if (handle == NULL) {
        MBED_ASSERT(false);
        return NSAPI_ERROR_NO_SOCKET;
    }

    const void *addr_field;
    switch (address.get_ip_version()) {
        case NSAPI_IPv6:
            addr_field = address.get_ip_bytes();
            break;
        case NSAPI_UNSPEC:
            addr_field = &ns_in6addr_any;
            break;
        default:
            return NSAPI_ERROR_UNSUPPORTED;
    }

    NanostackLockGuard lock;

    ns_address_t ns_address;
    ns_address.type = ADDRESS_IPV6;
    memcpy(ns_address.address, addr_field, sizeof ns_address.address);
    ns_address.identifier = address.get_port();
    nsapi_error_t ret;
    int retcode = ::socket_bind(socket->socket_id, &ns_address);

    if (retcode == 0) {
        ret = NSAPI_ERROR_OK;
    } else {
        ret = NSAPI_ERROR_PARAMETER;
    }

    tr_debug("socket_bind(socket=%p) sock_id=%d, retcode=%i, ret=%i", socket, socket->socket_id, retcode, ret);

    return ret;
}
Пример #10
0
bool M2MResource::remove_resource_instance(uint16_t inst_id)
{
    tr_debug("M2MResource::remove_resource(inst_id %d)", inst_id);
    bool success = false;
    if(!_resource_instance_list.empty()) {
        M2MResourceInstance* res = NULL;
        M2MResourceInstanceList::const_iterator it;
        it = _resource_instance_list.begin();
        int pos = 0;
        for ( ; it != _resource_instance_list.end(); it++, pos++ ) {
            if(((*it)->instance_id() == inst_id)) {
                // Resource found and deleted.
                res = *it;
                delete res;
                _resource_instance_list.erase(pos);
                success = true;
                break;
            }
        }
    }
    return success;
}
Пример #11
0
TR_RP_CLIENT *tr_cfg_find_rp (TR_CFG *tr_cfg, TR_NAME *rp_gss, TR_CFG_RC *rc)
{
  TR_RP_CLIENT *cfg_rp;
  int i;

  if ((!tr_cfg) || (!rp_gss)) {
    if (rc)
      *rc = TR_CFG_BAD_PARAMS;
    return NULL;
  }

  for (cfg_rp = tr_cfg->rp_clients; NULL != cfg_rp; cfg_rp = cfg_rp->next) {
    for (i = 0; i < TR_MAX_GSS_NAMES; i++) {
      if (!tr_name_cmp (rp_gss, cfg_rp->gss_names[i])) {
	tr_debug("tr_cfg_find_rp: Found %s.", rp_gss->buf);
	return cfg_rp;
      }
    }
  }
  /* if we didn't find one, return NULL */ 
  return NULL;
}
Пример #12
0
int thread_management_partition_weighting_set(int8_t interface_id, uint8_t partition_weighting)
{
#ifdef HAVE_THREAD
    protocol_interface_info_entry_t *cur;

    cur = protocol_stack_interface_info_get_by_id(interface_id);
    if (!cur || !cur->thread_info) {
        tr_debug("Invalid interface id");
        return -1;
    }

    if (cur->thread_info->partition_weighting == partition_weighting) {
        return 0;
    }

    bool trig_network_scan = false;
    if (cur->thread_info->thread_leader_data) {
        if (cur->thread_info->thread_leader_data->weighting < partition_weighting) {
            trig_network_scan = true;
        }
    }

    cur->thread_info->partition_weighting = partition_weighting;

    if (cur->lowpan_info & INTERFACE_NWK_ACTIVE) {
        if (trig_network_scan && thread_extension_enabled(cur)) {
            thread_nvm_store_link_info_clear();
            // bootstrap active and weighting has changed
            thread_bootstrap_reset_restart(interface_id);
        }
    }

    return 0;
#else
    (void) interface_id;
    (void) partition_weighting;
    return -1;
#endif
}
Пример #13
0
static void thread_discover_device_descriptor_set(struct mac_api_s *api, const uint8_t *device_extended_address, uint8_t attribute_index)
{
    if (!api) {
        return;
    }

    mlme_device_descriptor_t device_desc;
    mlme_set_t set_req;
    device_desc.FrameCounter = 0;
    device_desc.Exempt = false;
    device_desc.ShortAddress = 0xffff;
    memcpy(device_desc.ExtAddress, device_extended_address, 8);
    device_desc.PANId = 0xffff;


    set_req.attr = macDeviceTable;
    set_req.attr_index = attribute_index;
    set_req.value_pointer = (void *)&device_desc;
    set_req.value_size = sizeof(mlme_device_descriptor_t);
    tr_debug("Register Discovery device descriptor");
    api->mlme_req(api, MLME_SET, &set_req);
}
Пример #14
0
int str2sev(const char* sev) {

  if (strcmp(sev, "debug") ==0 ) {

    return LOG_DEBUG;
  }
  else if (strcmp(sev, "info") == 0) {

    return LOG_INFO;
  }
  else if (strcmp(sev, "notice") == 0) {

    return LOG_NOTICE;
  }
  else if (strcmp(sev, "warning") == 0 ) {

    return LOG_WARNING;
  }
  else if (strcmp(sev, "err") == 0) {

    return LOG_ERR;
  }
  else if (strcmp(sev, "crit") == 0) {

    return LOG_CRIT;
  }
  else if (strcmp(sev, "alert") == 0) {

    return LOG_ALERT;
  }
  else if (strcmp(sev, "emerg")  == 0) {

    return LOG_EMERG;
  }

  tr_debug("str2sev: invalid severity specified: %s, logging everything", sev);

  return LOG_DEBUG;
}
Пример #15
0
int tidc_open_connection (TIDC_INSTANCE *tidc, 
			  const char *server,
			  unsigned int port,
			  gss_ctx_id_t *gssctx)
{
  int err = 0;
  int conn = -1;
  unsigned int use_port = 0;

  if (0 == port)
    use_port = TID_PORT;
  else
    use_port = port;

  tr_debug("tidc_open_connection: opening tidc connection to %s:%d", server, port);
  err = gsscon_connect(server, use_port, "trustidentity", &conn, gssctx);

  if (!err)
    return conn;
  else
    return -1;
}
Пример #16
0
void tr_audit_resp(TID_RESP *resp) {

  if (NULL != resp) {

    char *attrs[] = { audit_fmt("result", resp->result ? "error" : "success"),
                      audit_fmt("comm", NULL != resp->comm ? resp->comm->buf : NULL),
                      audit_fmt("rp_realm", NULL != resp->rp_realm ? resp->rp_realm->buf : NULL),
                      audit_fmt("realm", NULL != resp->realm ? resp->realm->buf : NULL),
                      audit_fmt("err", NULL != resp->err_msg ? resp->err_msg->buf : NULL)
                    };

    char *msg = join_audit_msg(sizeof(attrs) / sizeof(attrs[0]), attrs);
    free_array(sizeof(attrs) / sizeof(attrs[0]), attrs);

    fire_log(LOG_INFO, AUDIT_FACILITY, "%s%s%s", LOG_PREFIX, msg, LOG_MSG_TERMINATOR);

    free(msg);
  }
  else {

    tr_debug("tr_audit_resp: Message dropped, null pointer passed.");
  }
}
Пример #17
0
static void mac_helper_keytable_pairwise_descriptor_set(struct mac_api_s *api, const uint8_t *key, const uint8_t *mac64, uint8_t attribute_id) {
    mlme_set_t set_req;
    mlme_key_id_lookup_descriptor_t lookup_description;
    mlme_key_descriptor_entry_t key_description;
    if (key) {
        memcpy(lookup_description.LookupData, mac64, 8);
        lookup_description.LookupData[8] = 0;
        lookup_description.LookupDataSize = 1;
        tr_debug("Key add %u index %s", attribute_id,trace_array(lookup_description.LookupData, 9));
        memset(&key_description, 0, sizeof(mlme_key_descriptor_entry_t));
        memcpy(key_description.Key, key, 16);
        key_description.KeyIdLookupList = &lookup_description;
        key_description.KeyIdLookupListEntries = 1;
    } else {
        memset(&key_description, 0, sizeof(mlme_key_descriptor_entry_t));
    }
    set_req.attr = macKeyTable;
    set_req.attr_index = attribute_id;
    set_req.value_pointer = &key_description;
    set_req.value_size = sizeof(mlme_key_descriptor_entry_t);

    api->mlme_req(api,MLME_SET , &set_req);
}
Пример #18
0
static TR_CFG_RC tr_cfg_parse_monitoring(TR_CFG *trc, json_t *jmon)
{
  int enabled = 1; /* assume we are enabled unless we are told not to be */

  const char *allowed_keys[] = {"enabled", "port", "authorized_credentials", 0};
  if (!check_allowed_keys(jmon, allowed_keys, NULL))
    return TR_CFG_NOPARSE;

  NOPARSE_UNLESS(tr_cfg_parse_boolean(jmon, "enabled", &enabled));
  if (enabled) {
    NOPARSE_UNLESS(tr_cfg_parse_integer(jmon, "port", &(trc->internal->mons_port)));
    if (trc->internal->mons_port == 0) {
      /* Catch this as a special case because 0 means that monitoring is disabled. */
      tr_debug("tr_cfg_parse_monitoring: invalid monitoring port (0). Use \"enabled\":false to disable monitoring.");
      return TR_CFG_BAD_PARAMS;
    }
    NOPARSE_UNLESS(tr_cfg_parse_gss_names(trc->internal,
                                          json_object_get(jmon, "authorized_credentials"),
                                          &(trc->internal->monitoring_credentials)));
  }

  return TR_CFG_SUCCESS;
}
Пример #19
0
/**
 * Parse a string
 *
 * If the key does not exist in the src object, returns success but does not allocate
 * a return value in dest. Nulls the destination pointer if there is no return value.
 *
 * Return value is allocated in talloc's NULL context and must be freed with talloc_free()
 * or put into a non-NULL context with talloc_steal()
 *
 * @param src JSON object to pull a value from
 * @param key key to pull
 * @param dest (output) pointer to a pointer that will hold the newly allocated return value
 * @return TR_CFG_SUCCESS or an error code
 */
static TR_CFG_RC tr_cfg_parse_string(json_t *src, const char *key, const char **dest)
{
  json_t *jtmp;

  /* Validate parameters */
  if ((src == NULL) || (key == NULL) || (dest == NULL))
    return TR_CFG_BAD_PARAMS;

  /* See if we have a value for this key; do nothing if not */
  jtmp = json_object_get(src, key);
  if (!jtmp) {
    *dest = NULL; /* No return value, null this out */
  } else {
    if (json_is_string(jtmp)) {
      *dest = talloc_strdup(NULL, json_string_value(jtmp));
    } else {
      tr_debug("tr_cfg_parse_string: Parsing error, %s is not a string.", key);
      return TR_CFG_NOPARSE;
    }
  }

  return TR_CFG_SUCCESS;
}
Пример #20
0
int thread_network_data_malformed_check(uint8_t *network_data_ptr, uint16_t network_data_length)
{
    uint8_t *dptr;
    uint8_t length;
    uint8_t type;
    dptr = network_data_ptr;
    while (network_data_length) {
        if (network_data_length >= 2) {
            type  = *dptr++;
            length = *dptr++;

            if (length == 0) {
                // 0 is not valid length for TLV
                return -1;
            }
            network_data_length -= 2;
            if (network_data_length >= length) {
                if (type == THREAD_NWK_DATA_TYPE_PREFIX) {
                    //Do subTLV Malformed test
                    if (thread_network_data_prefix_sub_tlv_malformed_check(dptr, length) != 0) {
                        tr_debug("prefixSubMal");
                        return -1;
                    }
                }
                network_data_length -= length;
                dptr += length;
            } else {
                // buffer is overrun this is malformed.
                tr_error("Lenf fail");
                return -1;
            }
        } else {
            return -1;
        }
    }
    return 0;
}
int NanostackInterface::socket_recvfrom(void *handle, SocketAddress *address, void *buffer, unsigned size)
{
    // Validate parameters
    NanostackSocket * socket = static_cast<NanostackSocket *>(handle);
    if (NULL == handle) {
        MBED_ASSERT(false);
        return NSAPI_ERROR_NO_SOCKET;
    }
    if (NULL == buffer) {
        MBED_ASSERT(false);
        return NSAPI_ERROR_PARAMETER;
    }
    if (0 == size) {
        MBED_ASSERT(false);
        return NSAPI_ERROR_PARAMETER;
    }

    nanostack_lock();

    int ret;
    if (socket->closed()) {
        ret = NSAPI_ERROR_NO_CONNECTION;
    } else if (NANOSTACK_SOCKET_TCP == socket->proto) {
        tr_error("recv_from() not supported with SOCKET_STREAM!");
        ret = NSAPI_ERROR_UNSUPPORTED;
    } else if (!socket->data_available()) {
        ret = NSAPI_ERROR_WOULD_BLOCK;
    } else {
        ret = socket->data_copy_and_free(buffer, size, address, false);
    }

    nanostack_unlock();

    tr_debug("socket_recvfrom(socket=%p) sock_id=%d, ret=%i", socket, socket->socket_id, ret);

    return ret;
}
Пример #22
0
M2MReportHandler::M2MReportHandler(M2MReportObserver &observer)
: _observer(observer),
  _under_observation(false),  
  _pmax(-1.0f),
  _pmin(1.0f),
  _gt(0.0f),
  _lt(0.0f),
  _st(0.0f),
  _pmin_exceeded(false),
  _pmax_exceeded(false),
  _report_scheduled(false),
  _pmin_timer(NULL),
  _pmax_timer(NULL),  
  _high_step(0.0f),
  _low_step(0.0f),
  _current_value(0.0f),
  _last_value(0.0f),
  _attribute_state(0),
  _notify(false)
{
    tr_debug("M2MReportHandler::M2MReportHandler()");
    _pmax_timer = new M2MTimer(*this);
    _pmin_timer = new M2MTimer(*this);
}
Пример #23
0
/* TRP update msg */
static json_t *tr_msg_encode_trp_upd(TRP_UPD *update)
{
  json_t *jupdate=NULL;
  json_t *jrecords=NULL;
  json_t *jrec=NULL;
  TRP_INFOREC *rec;

  if (update==NULL)
    return NULL;

  jupdate=json_object();
  if (jupdate==NULL)
    return NULL;

  jrecords=json_array();
  if (jrecords==NULL) {
    json_decref(jupdate);
    return NULL;
  }
  json_object_set_new(jupdate, "records", jrecords); /* jrecords now a "borrowed" reference */
  for (rec=trp_upd_get_inforec(update); rec!=NULL; rec=trp_inforec_get_next(rec)) {
    tr_debug("tr_msg_encode_trp_upd: encoding inforec.");
    jrec=tr_msg_encode_inforec(rec);
    if (jrec==NULL) {
      json_decref(jupdate); /* also decs jrecords and any elements */
      return NULL;
    }
    if (0!=json_array_append_new(jrecords, jrec)) {
      json_decref(jupdate); /* also decs jrecords and any elements */
      json_decref(jrec); /* this one did not get added so dec explicitly */
      return NULL;
    }
  }

  return jupdate;
}
Пример #24
0
bool PPPCellularInterface::nwk_registration(uint8_t nwk_type)
{
    bool success = false;
     bool registered = false;

     char str[35];
     int retcode;
     int retry_counter = 0;
     unsigned int reg_status;

     success = nwk_type == PACKET_SWITCHED ?
                     _at->send("AT+CGREG=0") :
                     _at->send("AT+CREG=0") && _at->recv("OK\n");

     success = _at->send("AT+COPS=0") //initiate auto-registration
                    && _at->recv("OK");
     if (!success) {
         tr_error("Modem not responding.");
         return false;
     }

     //Network search
     //If not registered after 60 attempts, i.e., 30 seconds wait, give up
     tr_debug("Searching Network ...");

     while (!registered) {

         if (retry_counter > 60) {
             success = false;
             goto give_up;
         }

         success = nwk_type == PACKET_SWITCHED ?
                         _at->send("AT+CGREG?")
                         && _at->recv("+CGREG: %34[^\n]\n", str)
                         && _at->recv("OK\n") :
                         _at->send("AT+CREG?")
                         && _at->recv("+CREG: %34[^\n]\n", str)
                         && _at->recv("OK\n");

         retcode = sscanf(str, "%*u,%u", &reg_status);

         if (retcode >= 1) {
             if (nwk_type == PACKET_SWITCHED) {
                 set_nwk_reg_status_psd(reg_status);
                 if (is_registered_psd()) {
                     registered = true;
                 }
             } else if (nwk_type == CIRCUIT_SWITCHED) {
                 set_nwk_reg_status_csd(reg_status);
                 if (is_registered_csd()) {
                     registered = true;
                 }
             }
         }

         if (registered) {
             break;
         } else {
             wait_ms(500);
         }

         retry_counter++;
     }

 give_up:
     return registered;
}
Пример #25
0
nsapi_size_or_error_t NanostackInterface::do_sendto(void *handle, const ns_address_t *address, const void *data, nsapi_size_t size)
{
    // Validate parameters
    NanostackSocket * socket = static_cast<NanostackSocket *>(handle);
    if (handle == NULL) {
        MBED_ASSERT(false);
        return NSAPI_ERROR_NO_SOCKET;
    }

    nsapi_size_or_error_t ret;

    NanostackLockGuard lock;

    if (socket->closed() || (!address && !socket->is_connected())) {
        ret = NSAPI_ERROR_NO_CONNECTION;
        goto out;
    }

    if (address && socket->proto == SOCKET_TCP) {
        tr_error("socket_sendto() not supported with TCP!");
        ret = NSAPI_ERROR_IS_CONNECTED;
        goto out;
    }

    int retcode;
#if 0
    retcode = ::socket_sendto(socket->socket_id, address,
                                            data, size);
#else
    // Use sendmsg purely to get the new return style
    // of returning data written rather than 0 on success,
    // which means TCP can do partial writes. (Sadly,
    // it's the only call which takes flags so we can
    // leave the NS_MSG_LEGACY0 flag clear).
    ns_msghdr_t msg;
    ns_iovec_t iov;
    iov.iov_base = const_cast<void *>(data);
    iov.iov_len = size;
    msg.msg_name = const_cast<ns_address_t *>(address);
    msg.msg_namelen = address ? sizeof *address : 0;
    msg.msg_iov = &iov;
    msg.msg_iovlen = 1;
    msg.msg_control = NULL;
    msg.msg_controllen = 0;
    retcode = ::socket_sendmsg(socket->socket_id, &msg, 0);
#endif

    /*
     * \return length if entire amount written (which could be 0)
     * \return value >0 and <length if partial amount written (stream only)
     * \return NS_EWOULDBLOCK if nothing written due to lack of queue space.
     * \return -1 Invalid socket ID or message structure.
     * \return -2 Socket memory allocation fail.
     * \return -3 TCP state not established or address scope not defined .
     * \return -4 Socket TX process busy or unknown interface.
     * \return -5 Socket not connected
     * \return -6 Packet too short (ICMP raw socket error).
     * */
    if (retcode == NS_EWOULDBLOCK) {
        ret = NSAPI_ERROR_WOULD_BLOCK;
    } else if (retcode < 0) {
        tr_error("socket_sendmsg: error=%d", retcode);
        ret = NSAPI_ERROR_DEVICE_ERROR;
    } else {
        ret = retcode;
    }

out:
    tr_debug("socket_sendto(socket=%p) sock_id=%d, ret=%i", socket, socket->socket_id, ret);

    return ret;
}
Пример #26
0
void NanostackSocket::socket_callback(void *cb) {
    nanostack_assert_locked();

    socket_callback_t *sock_cb = (socket_callback_t *) cb;
    NanostackSocket *socket = socket_tbl[sock_cb->socket_id];
    MBED_ASSERT(socket != NULL);

    tr_debug("socket_callback() sock=%d, event=%d, interface=%d, data len=%d",
                     sock_cb->socket_id, sock_cb->event_type, sock_cb->interface_id, sock_cb->d_len);

    switch (sock_cb->event_type) {
        case SOCKET_DATA:
            tr_debug("SOCKET_DATA, sock=%d, bytes=%d", sock_cb->socket_id, sock_cb->d_len);
            socket->event_data(sock_cb);
            break;
        case SOCKET_CONNECT_DONE:
            tr_debug("SOCKET_CONNECT_DONE");
            socket->event_connect_done(sock_cb);
            break;
        case SOCKET_CONNECT_FAIL:
            tr_debug("SOCKET_CONNECT_FAIL");
            socket->event_connect_fail(sock_cb);
            break;
        case SOCKET_CONNECT_AUTH_FAIL:
            tr_debug("SOCKET_CONNECT_AUTH_FAIL");
            break;
        case SOCKET_INCOMING_CONNECTION:
            tr_debug("SOCKET_INCOMING_CONNECTION");
            socket->event_incoming_connection(sock_cb);
            break;
        case SOCKET_TX_FAIL:
            tr_debug("SOCKET_TX_FAIL");
            socket->event_tx_fail(sock_cb);
            break;
        case SOCKET_CONNECT_CLOSED:
            tr_debug("SOCKET_CONNECT_CLOSED");
            socket->event_connect_closed(sock_cb);
            break;
        case SOCKET_CONNECTION_RESET:
            tr_debug("SOCKET_CONNECTION_RESET");
            socket->event_connection_reset(sock_cb);
            break;
        case SOCKET_NO_ROUTE:
            tr_debug("SOCKET_NO_ROUTE");
            socket->event_tx_fail(sock_cb);
            break;
        case SOCKET_TX_DONE:
            socket->event_tx_done(sock_cb);
            break;
        case SOCKET_NO_RAM:
            tr_debug("SOCKET_NO_RAM");
            socket->event_tx_fail(sock_cb);
            break;
        case SOCKET_CONNECTION_PROBLEM:
            tr_debug("SOCKET_CONNECTION_PROBLEM");
            break;
        default:
            break;
    }
}
Пример #27
0
void pana_session_startms_parse(buffer_t *buf, pana_header_t *header, sec_suite_t *suite)
{
    uint32_t prf_algorythm = 0;
    uint32_t integrity_algorythm = 12;
    uint32_t key_wrap = 0;
    bool key_wrap_parsed = false;
    uint16_t len = buffer_data_length(buf);
    uint8_t *ptr = buffer_data_pointer(buf);

    pana_avp_t avp_temp;
    //Read Resul and Key id if they are coming
    avp_temp.code = AVP_PRF_ALGORYTHM_CODE;
    avp_temp.len = 0;
    if (pana_avp_discover(ptr, len, &avp_temp) &&  avp_temp.len == 4) {
        prf_algorythm = common_read_32_bit(avp_temp.avp_ptr);
    }

    avp_temp.code = AVP_INTEGRIRTY_ALGORYTHM_CODE;
    avp_temp.len = 0;
    if (pana_avp_discover(ptr, len, &avp_temp) &&  avp_temp.len == 4) {
        integrity_algorythm = common_read_32_bit(avp_temp.avp_ptr);
    }

    avp_temp.code = AVP_KEY_WRAP_ALG_CODE;
    avp_temp.len = 0;
    if (pana_avp_discover(ptr, len, &avp_temp) &&  avp_temp.len == 4) {
        key_wrap = common_read_32_bit(avp_temp.avp_ptr);
        key_wrap_parsed = true;
    }

    bool drop_message = false;
    if ((header->flags & PANA_FLAGS_REQUEST)  == PANA_FLAGS_RESPONSE) {
        if (prf_algorythm != suite->pana_session.prf_algorythm) {
            tr_debug("PRF!!");
            drop_message = true;
        } else if (integrity_algorythm != suite->pana_session.integrity_algorythm) {
            tr_debug("int!!");
            drop_message = true;
        }
        if (key_wrap_parsed && key_wrap != suite->pana_session.key_wrap) {
            tr_debug("key!!");
            drop_message = true;
        }

    } else {
        if (prf_algorythm != 5) {
            drop_message = true;
        } else if (integrity_algorythm != 12) {
            drop_message = true;
        }
    }

    if (!drop_message) {
        if (key_wrap_parsed) {
            suite->pana_session.key_warp = true;
            suite->pana_session.key_wrap = key_wrap;
        }
        len += 16;
        ptr -= 16; //Shift Pana Headers back
        if ((header->flags & PANA_FLAGS_REQUEST)  == PANA_FLAGS_RESPONSE) {
            sec_lib_state_machine_trig(suite, EAP_IDENTITY_REQ);
            pana_handshake_copy(ptr, len, false, suite);
        } else {
            suite->pana_session.integrity_algorythm = integrity_algorythm;
            suite->pana_session.prf_algorythm = prf_algorythm;
            sec_lib_state_machine_trig(suite, PANA_START_RESPONSE);
            pana_handshake_copy(ptr, len, true, suite);
        }
        suite->retry_counter = 0;

    }

    buffer_free(buf);
}
Пример #28
0
void pana_down(buffer_t *buf, sec_suite_t *suite)
{
    //Check Request Or Response
    pana_header_t header;
    header.type = PANA_MSG_PA;
    if (suite->pana_session.user_server) {
        if (suite->state == PANA_REQUEST_TX) {
            header.flags = PANA_FLAGS_START | PANA_FLAGS_REQUEST;
        } else if (suite->state == EAP_PANA_FINISH || suite->state == PANA_FAILURE) {
            header.flags = (PANA_FLAGS_REQUEST | PANA_FLAGS_COMPLETE);
        } else if (suite->state == PANA_FAILURE_RESPONSE) {
            header.flags = (PANA_FLAGS_RESPONSE | PANA_FLAGS_COMPLETE);
        } else {
            header.flags = PANA_FLAGS_REQUEST;
        }
    } else {

        if (suite->state == PANA_FAILURE) {
            header.flags = PANA_FLAGS_COMPLETE;
        } else if (suite->state == PANA_START_RESPONSE) {
            header.flags = PANA_FLAGS_START;
        } else {
            header.flags = 0;
        }
    }

    if (header.flags & PANA_FLAGS_REQUEST) {
        header.seq = suite->pana_session.req_seq;
    } else {
        header.seq = suite->pana_session.res_seq;
    }
    header.session_id = suite->pana_session.session_id;
    pana_set_agend_address(buf, false, suite);
    buf = build_pana_base(buf, &header, suite);
    if (buf) {
        /**
         * Copy Authentication start message
         */
        if (header.flags & PANA_FLAGS_START) {
            uint16_t len = buffer_data_length(buf);
            uint8_t *ptr = buffer_data_pointer(buf);

            if (header.flags & PANA_FLAGS_REQUEST) {
                pana_handshake_copy(ptr, len, true, suite);
            } else {
                pana_handshake_copy(ptr, len, false, suite);
            }
        }

        if (suite->pana_session.address_status & 1) {
            tr_debug("Build Relay");
            buf = pana_relay_avp_build(buf, suite);
            if (buf) {
                header.flags = 0;
                header.type = PANA_MSG_RELAY;
                header.session_id = 0;
                header.seq = 0;
                buf = build_pana_base(buf, &header, suite);
            }
        }

        protocol_push(buf);
    }


}
Пример #29
0
/*
 * \brief Configure and establish network connection
 *
 */
void nd_tasklet_configure_and_connect_to_network(void)
{
    int8_t status;
    char *sec_mode;

    // configure bootstrap
    arm_nwk_interface_configure_6lowpan_bootstrap_set(
        tasklet_data_ptr->network_interface_id, tasklet_data_ptr->mode,
        NET_6LOWPAN_ND_WITH_MLE);

    sec_mode = STR(MBED_CONF_MBED_MESH_API_6LOWPAN_ND_SECURITY_MODE);

    if (strcmp(sec_mode, "PSK") == 0) {
        tr_debug("Using PSK security mode.");
        tasklet_data_ptr->sec_mode = NET_SEC_MODE_PSK_LINK_SECURITY;
        tasklet_data_ptr->psk_sec_info.key_id = MBED_CONF_MBED_MESH_API_6LOWPAN_ND_PSK_KEY_ID;
        memcpy(tasklet_data_ptr->psk_sec_info.security_key, (const uint8_t[16])MBED_CONF_MBED_MESH_API_6LOWPAN_ND_PSK_KEY, 16);
    } else {
        tr_debug("Link-layer security NOT enabled.");
        tasklet_data_ptr->sec_mode = NET_SEC_MODE_NO_LINK_SECURITY;
    }

    // configure link layer security
    arm_nwk_link_layer_security_mode(
        tasklet_data_ptr->network_interface_id,
        tasklet_data_ptr->sec_mode,
        MBED_CONF_MBED_MESH_API_6LOWPAN_ND_SEC_LEVEL,
        &tasklet_data_ptr->psk_sec_info);

    // configure scan parameters
    arm_nwk_6lowpan_link_scan_parameter_set(tasklet_data_ptr->network_interface_id, 5);

    // configure scan channels
    initialize_channel_list();

    // Configure scan options (NULL disables filter)
    arm_nwk_6lowpan_link_nwk_id_filter_for_nwk_scan(
        tasklet_data_ptr->network_interface_id, NULL);

    arm_nwk_6lowpan_link_panid_filter_for_nwk_scan(
         tasklet_data_ptr->network_interface_id,
         MBED_CONF_MBED_MESH_API_6LOWPAN_ND_PANID_FILTER);

    // Enable MPL by default
    const uint8_t all_mpl_forwarders[16] = {0xff, 0x03, [15]=0xfc};
    multicast_mpl_domain_subscribe(tasklet_data_ptr->network_interface_id,
                                      all_mpl_forwarders,
                                      MULTICAST_MPL_SEED_ID_DEFAULT,
                                      NULL);

    status = arm_nwk_interface_up(tasklet_data_ptr->network_interface_id);
    if (status >= 0) {
        tasklet_data_ptr->tasklet_state = TASKLET_STATE_BOOTSTRAP_STARTED;
        tr_info("Start 6LoWPAN ND Bootstrap");
        nd_tasklet_network_state_changed(MESH_BOOTSTRAP_STARTED);
    } else {
        tasklet_data_ptr->tasklet_state = TASKLET_STATE_BOOTSTRAP_FAILED;
        tr_err("Bootstrap start failed, %d", status);
        nd_tasklet_network_state_changed(MESH_BOOTSTRAP_START_FAILED);
    }
}
Пример #30
0
static void tr_talloc_log(const char *msg)
{
  tr_debug("talloc: %s", msg);
}