| 150 | } |
| 151 | |
| 152 | int HandleReceivedExplictTcpData(int socket, |
| 153 | EipUint8 *buffer, |
| 154 | size_t length, |
| 155 | int *remaining_bytes, |
| 156 | struct sockaddr *originator_address, |
| 157 | ENIPMessage *const outgoing_message) { |
| 158 | OPENER_TRACE_INFO("Handles data for TCP socket: %d\n", socket); |
| 159 | EipStatus return_value = kEipStatusOk; |
| 160 | EncapsulationData encapsulation_data = { 0 }; |
| 161 | /* eat the encapsulation header*/ |
| 162 | /* the structure contains a pointer to the encapsulated data*/ |
| 163 | /* returns how many bytes are left after the encapsulated data*/ |
| 164 | *remaining_bytes = CreateEncapsulationStructure(buffer, length, |
| 165 | &encapsulation_data); |
| 166 | |
| 167 | if (kEncapsulationHeaderOptionsFlag == encapsulation_data.options) /*TODO generate appropriate error response*/ |
| 168 | { |
| 169 | if (*remaining_bytes >= 0) /* check if the message is corrupt: header size + claimed payload size > than what we actually received*/ |
| 170 | { |
| 171 | /* full package or more received */ |
| 172 | encapsulation_data.status = kEncapsulationProtocolSuccess; |
| 173 | return_value = kEipStatusOkSend; |
| 174 | /* most of these functions need a reply to be send */ |
| 175 | switch (encapsulation_data.command_code) { |
| 176 | case (kEncapsulationCommandNoOperation): |
| 177 | OPENER_TRACE_INFO("NOP\n"); |
| 178 | /* NOP needs no reply and does nothing */ |
| 179 | return_value = kEipStatusOk; |
| 180 | break; |
| 181 | |
| 182 | case (kEncapsulationCommandListServices): |
| 183 | OPENER_TRACE_INFO("List services\n"); |
| 184 | HandleReceivedListServicesCommand(&encapsulation_data, |
| 185 | outgoing_message); |
| 186 | break; |
| 187 | |
| 188 | case (kEncapsulationCommandListIdentity): |
| 189 | OPENER_TRACE_INFO("List identity\n"); |
| 190 | HandleReceivedListIdentityCommandTcp(&encapsulation_data, |
| 191 | outgoing_message); |
| 192 | break; |
| 193 | |
| 194 | case (kEncapsulationCommandListInterfaces): |
| 195 | OPENER_TRACE_INFO("List interfaces\n"); |
| 196 | HandleReceivedListInterfacesCommand(&encapsulation_data, |
| 197 | outgoing_message); |
| 198 | break; |
| 199 | |
| 200 | case (kEncapsulationCommandRegisterSession): |
| 201 | OPENER_TRACE_INFO("Register session\n"); |
| 202 | HandleReceivedRegisterSessionCommand(socket, |
| 203 | &encapsulation_data, |
| 204 | outgoing_message); |
| 205 | break; |
| 206 | |
| 207 | case (kEncapsulationCommandUnregisterSession): |
| 208 | OPENER_TRACE_INFO("unregister session\n"); |
| 209 | return_value = HandleReceivedUnregisterSessionCommand( |
no test coverage detected