| 550 | } |
| 551 | |
| 552 | EipStatus SendUdpData(struct sockaddr_in *address, |
| 553 | int socket_handle, |
| 554 | EipUint8 *data, |
| 555 | EipUint16 data_length) { |
| 556 | |
| 557 | |
| 558 | |
| 559 | OPENER_TRACE_INFO("UDP port to be sent to: %x\n", ntohs(address->sin_port) ); |
| 560 | UDPHeader header = { |
| 561 | .source_port = 2222, |
| 562 | .destination_port = ntohs(address->sin_port), |
| 563 | .packet_length = kUpdHeaderLength + data_length, |
| 564 | .checksum = 0 |
| 565 | }; |
| 566 | |
| 567 | char complete_message[PC_OPENER_ETHERNET_BUFFER_SIZE]; |
| 568 | memcpy(complete_message + kUpdHeaderLength, data, data_length); |
| 569 | UDPHeaderGenerate(&header, (char *)complete_message); |
| 570 | UDPHeaderSetChecksum(&header, |
| 571 | htons(UDPHeaderCalculateChecksum(complete_message, |
| 572 | 8 + data_length, |
| 573 | interface_configuration_ |
| 574 | .ip_address, |
| 575 | address->sin_addr.s_addr) ) ); |
| 576 | UDPHeaderGenerate(&header, (char *)complete_message); |
| 577 | |
| 578 | int sent_length = sendto( socket_handle, |
| 579 | (char *) complete_message, |
| 580 | data_length + kUpdHeaderLength, |
| 581 | 0, |
| 582 | (struct sockaddr *) address, |
| 583 | sizeof(*address) ); |
| 584 | |
| 585 | if (sent_length < 0) { |
| 586 | int error_code = GetSocketErrorNumber(); |
| 587 | char *error_message = GetErrorMessage(error_code); |
| 588 | OPENER_TRACE_ERR( |
| 589 | "networkhandler: error with sendto in sendUDPData: %d - %s\n", |
| 590 | error_code, |
| 591 | error_message); |
| 592 | FreeErrorMessage(error_message); |
| 593 | return kEipStatusError; |
| 594 | } |
| 595 | |
| 596 | if (sent_length != data_length + kUpdHeaderLength) { |
| 597 | OPENER_TRACE_WARN( |
| 598 | "data length sent_length mismatch; probably not all data was sent in SendUdpData, sent %d of %d\n", |
| 599 | sent_length, |
| 600 | data_length); |
| 601 | return kEipStatusError; |
| 602 | } |
| 603 | |
| 604 | return kEipStatusOk; |
| 605 | } |
| 606 | |
| 607 | EipStatus HandleDataOnTcpSocket(int socket) { |
| 608 | OPENER_TRACE_INFO("Entering HandleDataOnTcpSocket for socket: %d\n", socket); |
no test coverage detected