Imported Upstream version 1.0.0
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / ip_adapter / arduino / caipclient_eth.cpp
1 /******************************************************************
2 *
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
4 *
5 *
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *      http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 ******************************************************************/
20 #include "caipinterface.h"
21
22 #include <Arduino.h>
23 #include <Ethernet.h>
24 #include <socket.h>
25 #include <w5100.h>
26 #include <EthernetUdp.h>
27 #include <IPAddress.h>
28
29 #include "logger.h"
30 #include "cacommon.h"
31 #include "caadapterinterface.h"
32 #include "caipadapter.h"
33 #include "caipadapterutils_eth.h"
34 #include "caadapterutils.h"
35 #include "oic_malloc.h"
36 #include "oic_string.h"
37
38 #define TAG "IPC"
39
40 static int g_sockID = 0;
41
42 /**
43  * @var g_unicastPort
44  * @brief Unicast Port
45  */
46 static uint16_t g_unicastPort = 0;
47
48 #define IPv4_MULTICAST     "224.0.1.187"
49
50 void CAIPSetUnicastSocket(int socketID)
51 {
52     OIC_LOG(DEBUG, TAG, "IN");
53     if (0 < socketID)
54     {
55         g_sockID = socketID;
56     }
57     else
58     {
59         OIC_LOG(ERROR, TAG, "sock err");
60     }
61
62     OIC_LOG(DEBUG, TAG, "OUT");
63     return;
64 }
65
66 void CAIPSetUnicastPort(uint16_t port)
67 {
68     OIC_LOG(DEBUG, TAG, "IN");
69     g_unicastPort = port;
70     OIC_LOG(DEBUG, TAG, "OUT");
71     return;
72 }
73
74 void CAIPSendData(CAEndpoint_t *endpoint, const void *buf,
75                   uint32_t bufLen, bool isMulticast)
76 {
77     if (!isMulticast && 0 == g_unicastPort)
78     {
79         OIC_LOG(ERROR, TAG, "port 0");
80         return;
81     }
82
83     VERIFY_NON_NULL_VOID(endpoint, TAG, "endpoint");
84
85     int socketID = 0;
86     uint16_t port = endpoint->port;
87     if (isMulticast)
88     {
89         port = CA_COAP;
90         OICStrcpy(endpoint->addr, sizeof(endpoint->addr), IPv4_MULTICAST);
91         if (CAArduinoInitMulticastUdpSocket(endpoint->addr, port,
92                                             g_unicastPort, &socketID) != CA_STATUS_OK)
93         {
94             OIC_LOG(ERROR, TAG, "init mcast err");
95             return;
96         }
97         OIC_LOG_V(DEBUG, TAG, "MPORT:%u", port);
98         OIC_LOG_V(DEBUG, TAG, "LPORT:%u", g_unicastPort);
99         OIC_LOG_V(DEBUG, TAG, "SOCKET ID:%d", socketID);
100     }
101     else
102     {
103         if (0 == g_sockID)
104         {
105             if (CAArduinoInitUdpSocket(&port, &socketID) != CA_STATUS_OK)
106             {
107                 OIC_LOG(ERROR, TAG, "init ucast err");
108                 return;
109             }
110         }
111         else
112         {
113             socketID = g_sockID;
114         }
115     }
116
117     uint32_t ret;
118     uint8_t ipAddr[4] = { 0 };
119     uint16_t parsedPort = 0;
120     if (CAParseIPv4AddressInternal(endpoint->addr, ipAddr, sizeof(ipAddr),
121                                    &parsedPort) != CA_STATUS_OK)
122     {
123         OIC_LOG(ERROR, TAG, "parse fail");
124         return;
125     }
126
127     if (bufLen > 65535) // Max value for uint16_t
128     {
129         // This will never happen as max buffer size we are dealing with is COAP_MAX_PDU_SIZE
130         OIC_LOG(ERROR, TAG, "Size exceeded");
131         return;
132     }
133
134     ret = sendto(socketID, (const uint8_t *)buf, (uint16_t)bufLen, ipAddr, port);
135     if (ret <= 0)
136     {
137         OIC_LOG_V(ERROR, TAG, "SendData failed: %d", ret);
138     }
139     if (g_sockID != socketID)
140     {
141         close(socketID);
142     }
143
144     OIC_LOG(DEBUG, TAG, "OUT");
145 }
146