blob: 2bb5d4b5362f7892407231c95d798ab53d59c3d9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include <assert.h>
#include <string.h>
#include "os/mynewt.h"
#include <log/log.h>
#include "oic/oc_log.h"
#include "oic/oc_ri.h"
#include "api/oc_priv.h"
#include "oic/port/oc_connectivity.h"
#include "oic/port/mynewt/adaptor.h"
#include "oic/port/mynewt/transport.h"
static struct os_eventq *oc_evq;
const struct oc_transport *oc_transports[OC_TRANSPORT_MAX];
struct os_eventq *
oc_evq_get(void)
{
return oc_evq;
}
void
oc_evq_set(struct os_eventq *evq)
{
oc_evq = evq;
}
int8_t
oc_transport_register(const struct oc_transport *ot)
{
int i;
int first = -1;
for (i = 0; i < OC_TRANSPORT_MAX; i++) {
if (oc_transports[i] == ot) {
return -1;
}
if (oc_transports[i] == NULL && first < 0) {
oc_transports[i] = ot;
first = i;
}
}
return first;
}
int8_t
oc_transport_lookup(const struct oc_transport *ot)
{
int i;
for (i = 0; i < OC_TRANSPORT_MAX; i++) {
if (oc_transports[i] == ot) {
return i;
}
}
return -1;
}
void
oc_transport_unregister(const struct oc_transport *ot)
{
int i;
i = oc_transport_lookup(ot);
if (i >= 0) {
oc_transports[i] = NULL;
}
}
void
oc_send_buffer(struct os_mbuf *m)
{
struct oc_endpoint *oe;
const struct oc_transport *ot;
oe = OC_MBUF_ENDPOINT(m);
ot = oc_transports[oe->ep.oe_type];
if (ot) {
ot->ot_tx_ucast(m);
} else {
OC_LOG(ERROR, "Unknown transport option %u\n", oe->ep.oe_type);
os_mbuf_free_chain(m);
}
}
/*
* Send on all the transports.
*/
void
oc_send_multicast_message(struct os_mbuf *m)
{
const struct oc_transport *ot;
const struct oc_transport *prev = NULL;
struct os_mbuf *n;
int i;
for (i = 0; i < OC_TRANSPORT_MAX; i++) {
if (!oc_transports[i]) {
continue;
}
ot = oc_transports[i];
if (prev) {
n = os_mbuf_dup(m);
prev->ot_tx_mcast(m);
if (!n) {
return;
}
m = n;
}
prev = ot;
}
if (prev) {
prev->ot_tx_mcast(m);
}
}
/**
* Retrieves the specified endpoint's transport layer security properties.
*/
oc_resource_properties_t
oc_get_trans_security(const struct oc_endpoint *oe)
{
const struct oc_transport *ot;
ot = oc_transports[oe->ep.oe_type];
if (ot) {
if (ot->ot_get_trans_security) {
return ot->ot_get_trans_security(oe);
} else {
return 0;
}
}
OC_LOG(ERROR, "Unknown transport option %u\n", oe->ep.oe_type);
return 0;
}
void
oc_connectivity_shutdown(void)
{
int i;
const struct oc_transport *ot;
for (i = 0; i < OC_TRANSPORT_MAX; i++) {
if (!oc_transports[i]) {
continue;
}
ot = oc_transports[i];
ot->ot_shutdown();
}
}
int
oc_connectivity_init(void)
{
int rc = -1;
int i;
const struct oc_transport *ot;
for (i = 0; i < OC_TRANSPORT_MAX; i++) {
if (!oc_transports[i]) {
continue;
}
ot = oc_transports[i];
if (ot->ot_init() == 0) {
rc = 0;
}
}
return rc;
}
void
oc_init(void)
{
SYSINIT_ASSERT_ACTIVE();
oc_ri_mem_init();
oc_evq_set(os_eventq_dflt_get());
}