/******************************************************************************
 * Copyright (c) 2000-2018 Ericsson Telecom AB
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
 *
 * Contributors:
 * Michael Josenhans
 ******************************************************************************/
//
//  File:               SocketCAN_PT.cc
//  Description:        SocketCAN_PT test port source
//
// Revision R2D
#include "SocketCAN_PT.hh"
#include "SocketCAN_PortType.hh"

#include <Addfunc.hh>
#include <Bitstring.hh>
#include <Charstring.hh>
#include <errno.h>
#include <Error.hh>
#include <Hexstring.hh>
#include <Integer.hh>
#include <linux/can/bcm.h>
#include <linux/can/raw.h>
#include <linux/if.h>
#include <Logger.hh>
#include <memory.h>
#include <Octetstring.hh>
#include <Optional.hh>
#include <Port.hh>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <Template.hh>
#include <unistd.h>
#include <algorithm>
#include <cerrno>
#include <cstdarg>
#include <cstddef>
#include <cstring>
#include <iostream>

struct bcm_msg_head;
struct can_frame;
struct canfd_frame;

#define DEFAULT_NUM_SOCK          10
#define BCM_FRAME_BUFFER_SIZE    256
#define BCM_FRAME_FLAGS_SIZE      32 // size of SocketCAN_bcm_frame in Bit
#define ISOTP_RECIEVE_BUFSIZE   5000

// workaround, as some of those below may not yet be defined in "linux/can/raw.h":
#define CAN_RAW_FILTER            1 /* set 0 .. n can_filter(s)          */
#define CAN_RAW_ERR_FILTER        2 /* set filter for error frames       */
#define CAN_RAW_LOOPBACK          3 /* local loopback (default:on)       */
#define CAN_RAW_RECV_OWN_MSGS     4 /* receive my own msgs (default:off) */
#define CAN_RAW_FD_FRAMES         5 /* allow CAN FD frames (default:off) */
#define CAN_RAW_JOIN_FILTERS      6 /* all filters must match to trigger */

// workaround, as not yet defined in all versions of "linux/Can.h":
#ifndef CAN_MAX_DLEN
#define CAN_MAX_DLEN 8
#endif

// workaround, as not defined in some older kernel versions
#ifndef	CAN_MTU
#define CAN_MTU		(sizeof(struct can_frame))
#endif  //CAN_MTU

// comment out the following define, if your kernel does not have CANFD support
#define CANFD_SUPPORT
#ifdef  CANFD_SUPPORT

// make sure CANFD_MTU is defined, as not defined in some older kernel versions.
#ifndef	CANFD_MTU
#define CANFD_MTU	(sizeof(struct canfd_frame))
#endif  //CANFD_MTU

// make sure CAN_FD_FRAME is defined, as not defined in some older kernel versions
// and thus canfd frames can not be used for data transfer between 
// kernel module and userspace
#ifndef CAN_FD_FRAME
#define CAN_FD_FRAME   0x0800
#endif  //CAN_FD_FRAME

#define CANFD_FRAME_STRUCT_DEFINED
#define RAW_CANFD_SUPPORT
#define BCM_CANFD_SUPPORT

#endif  //CANFD_SUPPORT
namespace SocketCAN__PortType {

SocketCAN__PT_PROVIDER::SocketCAN__PT_PROVIDER(const char *par_port_name) :
		PORT(par_port_name), num_of_sock(0), sock_list_length(0), target_fd(-1), can_interface_name(
				NULL), debugging(false), debugging_configured(false), config_finished(
				false) {
	sock_list = NULL;
	//&num_of_sock = 0;
	//sock_list_length = 0;
}

SocketCAN__PT_PROVIDER::~SocketCAN__PT_PROVIDER() {
	Free(sock_list);
	reset_configuration();
}

void SocketCAN__PT_PROVIDER::set_parameter(const char * parameter_name,
		const char * parameter_value) {
	log("entering SocketCAN__PT_PROVIDER::set_parameter(%s, %s)",
			parameter_name, parameter_value);

	if (config_finished) {
		reset_configuration();
		config_finished = false;
	}

	if (strcmp(parameter_name, "SocketCAN_can_interface_name") == 0) {
		InitStrPar(can_interface_name, parameter_name, parameter_value);
	} else if (strcmp(parameter_name, "SocketCAN_debugging") == 0) {
		if (strcmp(parameter_value, "YES") == 0) {
			debugging = true;
			debugging_configured = true;
			log("Reading testport parameter debugging: ", debugging);
		} else if (strcmp(parameter_value, "NO") == 0) {
			debugging = false;
			debugging_configured = true;
			log("Reading testport parameter debugging: ", debugging);
		}
	} else {
		TTCN_error(
				"SocketCAN parameter configuration error: Configuration file does not correctly configure parameter 'SocketCAN_debugging' however parameter name '%s' as parameter value: '%s'!!\nExpecting: \n*.*.SocketCAN_debugging := \"YES\"\n or \n*.*.SocketCAN_debugging := \"NO\"",
				parameter_name, parameter_value);
	}

	log("leaving SocketCAN__PT_PROVIDER::set_parameter(%s, %s)", parameter_name,
			parameter_value);
}

/*void SocketCAN__PT_PROVIDER::Handle_Fd_Event(int fd, boolean is_readable,
 boolean is_writable, boolean is_error) {}*/

void SocketCAN__PT_PROVIDER::Handle_Fd_Event_Error(int /*fd*/) {

}

void SocketCAN__PT_PROVIDER::Handle_Fd_Event_Writable(int /*fd*/) {

}

void SocketCAN__PT_PROVIDER::Handle_Fd_Event_Readable(int sock) {
	log("entering SocketCAN__PT_PROVIDER::Handle_Fd_Event_Readable()");
	int res;

	for (int a = 0; a < sock_list_length; a++) {
		if ((sock == sock_list[a].fd)
				and (sock_list[a].status != SOCKET_NOT_ALLOCATED)) {
			switch (sock_list[a].protocol_family) {
			case SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_PROTOCOL_CAN_ISOTP: {
				SocketCAN__Types::SocketCAN__receive__isotp__pdu parameters;

				unsigned char msg[ISOTP_RECIEVE_BUFSIZE];

				int nbytes = 0;
				struct sockaddr_can addr;
				socklen_t addr_len = sizeof(addr);
				//ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
				// struct sockaddr *src_addr, socklen_t *addrlen);
				nbytes = recvfrom(sock, msg, ISOTP_RECIEVE_BUFSIZE, 0,
						(struct sockaddr*) &addr, &addr_len);

				//nbytes = read(sock, msg, ISOTP_RECIEVE_BUFSIZE);
				if (nbytes > 0 && nbytes < ISOTP_RECIEVE_BUFSIZE) {
					struct ifreq ifr;
					ifr.ifr_ifindex = addr.can_ifindex;
					parameters.ifr().if__index() = ifr.ifr_ifindex;
					parameters.ifr().if__name() = ifr.ifr_name;
					parameters.id() = a;
					parameters.pdu() = OCTETSTRING(nbytes, msg);
					incoming_message(parameters);
				}
			}
				break;
			case SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_PROTOCOL_CAN_RAW: {
				SocketCAN__Types::SocketCAN__receive__CAN__or__CAN__FD__frame parameters;

				struct sockaddr_can addr;
				socklen_t addr_len = sizeof(addr);
				//ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
				// struct sockaddr *src_addr, socklen_t *addrlen);
#ifdef	CANFD_FRAME_STRUCT_DEFINED   // struct canfd_frame is supported
				struct canfd_frame frame; // always assume a CANFD_Frame shall be received
				ssize_t nbytes = recvfrom(sock, &frame, CANFD_MTU, 0,
						(struct sockaddr*) &addr, &addr_len);
#else   //CANFD_FRAME_STRUCT_DEFINED
				struct can_frame frame; // CANFD_Frame is not supported by this kernel version
				ssize_t nbytes = recvfrom(sock, &frame, CAN_MTU, 0,
						(struct sockaddr*) &addr, &addr_len);
#endif  //CANFD_FRAME_STRUCT_DEFINED

				if (nbytes <= 0) {
					//there is an empty message, or error in receive
					//remove the socket
					TTCN_error(
							"Closing socket %d with interface index %d due to an empty message or error in reception\n",
							sock, addr.can_ifindex);
					std::cout << "close_fd" << sock << std::endl;
					sock_list[a].status = SOCKET_NOT_ALLOCATED;
					sock_list[a].protocol_family =
							SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_NO_PROTOCOL;
					num_of_sock--;
					Handler_Remove_Fd_Read(sock);
					close(sock);
				} else

				if ((nbytes == CAN_MTU)
#ifdef	CANFD_FRAME_STRUCT_DEFINED
						or (nbytes == CANFD_MTU)
#endif  //CANFD_FRAME_STRUCT_DEFINED
						) {
					// A CAN Frame has been received. However use the struct canfd_frame to access it.
					// As it is a CAN frame, the flags field contains invalid data and the can_dlc field
					// is here called len as in CAN FD.
					struct ifreq ifr;
					ifr.ifr_ifindex = addr.can_ifindex;
					/* get interface name of the received CAN frame */
					res = ioctl(sock, SIOCGIFNAME, &ifr);
					if (res != 0) {
						TTCN_error(
								"SocketCAN frame reception: Ioctl failed while retrieving the interface name from the socket: %d with interface index %d\n",
								sock, ifr.ifr_ifindex);

						parameters.ifr().if__index() = ifr.ifr_ifindex;
						parameters.ifr().if__name() =
								"SocketCAN : device name unknown, ioctl failed";
					} else {
#ifdef	CANFD_FRAME_STRUCT_DEFINED
						if (nbytes == CANFD_MTU) {
							log(
									"SocketCAN: Received a CANFD frame from interface %s",
									ifr.ifr_name, nbytes, frame.len);
						} else {
							log(
									"SocketCAN: Received a CAN frame from interface %s",
									ifr.ifr_name, nbytes, frame.len);
						}
#else   //CANFD_FRAME_STRUCT_DEFINED
						log("SocketCAN: Received a CAN frame from interface %s",
								ifr.ifr_name, nbytes, frame.can_dlc);
#endif  //CANFD_FRAME_STRUCT_DEFINED
						parameters.ifr().if__index() = ifr.ifr_ifindex;
						parameters.ifr().if__name() = ifr.ifr_name;
					}

					struct timeval tv;
					res = ioctl(sock, SIOCGSTAMP, &tv);
					if (res != 0) {
						TTCN_error(
								"SocketCAN frame reception: Ioctl failed while retrieving the timestamp from the socket: %d with interface name %s\n",
								sock, ifr.ifr_name);

					} else {
						parameters.timestamp().tv__sec() = tv.tv_sec;
						parameters.timestamp().tv__usec() = tv.tv_usec;
					}
					parameters.ifr().if__index() = ifr.ifr_ifindex;
					parameters.ifr().if__name() = ifr.ifr_name;
					parameters.id() = a;

					INTEGER can_id;
					can_id.set_long_long_val(frame.can_id);
#ifdef CANFD_FRAME_STRUCT_DEFINED
					const INTEGER len = frame.len;
#else  //CANFD_FRAME_STRUCT_DEFINED
					const INTEGER len = frame.can_dlc;
#endif //CANFD_FRAME_STRUCT_DEFINED
					// frame type specific part:
					if (nbytes == CAN_MTU) {
						// CAN frame received:
						Can::CAN__frame& frameref =
								parameters.frame().can__frame();
						log(
								"Received a CAN frame from interface %s of %d bytes and with payload length %d",
								ifr.ifr_name, nbytes, (int) len);
						parameters.ifr().if__index() = ifr.ifr_ifindex;
						parameters.ifr().if__name() = ifr.ifr_name;
						parameters.id() = a;
						frameref.can__id() = int2oct(can_id, 4);
						frameref.can__pdu() = OCTETSTRING(len, frame.data);
					} else {
						// CAN FD frame received:
						Can::CANFD__frame& frameref =
								parameters.frame().canfd__frame();
						log(
								"Received a CAN FD frame from interface %s of %d bytes and with payload length %d",
								ifr.ifr_name, nbytes, (int) len);
						frameref.can__id() = int2oct(can_id, 4);
#ifdef CANFD_FRAME_STRUCT_DEFINED
						if (nbytes == CANFD_MTU) {
							frameref.can__flags() = BITSTRING(
									int2bit(frame.flags, 8));
						}
#endif //CANFD_FRAME_STRUCT_DEFINED
						frameref.can__pdu() = OCTETSTRING(len, frame.data);
					}
					incoming_message(parameters);
				}
			}
				break;
			case SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_PROTOCOL_CAN_BCM: {
				SocketCAN__Types::SocketCAN__receive__BCM__message parameters;
				struct sockaddr_can addr;
				struct {
					struct bcm_msg_head msg_head;
#ifdef CANFD_FRAME_STRUCT_DEFINED
					struct canfd_frame frame[BCM_FRAME_BUFFER_SIZE];
#else  //CANFD_FRAME_STRUCT_DEFINED
					struct can_frame frame[BCM_FRAME_BUFFER_SIZE];
#endif //CANFD_FRAME_STRUCT_DEFINED
				} bcm_msg;
				struct ifreq ifr;

				socklen_t addr_len = sizeof(addr);
				ssize_t nbytes = recvfrom(sock, &bcm_msg,
						sizeof(struct can_frame), 0, (struct sockaddr*) &addr,
						&addr_len);
				if (nbytes < 0) {
					//there is an empty message, or error in receive
					//remove the socket
					TTCN_error(
							"Closing socket %d with interface index %d due to an empty BCM message or error in reception\n",
							sock, addr.can_ifindex);
					std::cout << "close_fd" << sock << std::endl;
					sock_list[a].status = SOCKET_NOT_ALLOCATED;
					sock_list[a].protocol_family =
							SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_NO_PROTOCOL;
					num_of_sock--;
					Handler_Remove_Fd_Read(sock);
					close(sock);
				} else {
					ifr.ifr_ifindex = addr.can_ifindex;
					// get interface name of the received CAN frame

					// currently handling of can_ifindex == 0 (= any interface) is unclear.
//					res = ioctl(sock, SIOCGIFNAME, &ifr);
//					if (res == -1) {
//						TTCN_error(
//								"Ioctl failed while receiving a BCM message frame on socket: %d with interface index %d with errno: %d\n",
//								sock, ifr.ifr_ifindex, errno);
//					}
					const INTEGER msg_head_flags = bcm_msg.msg_head.flags;
					log(
							"Received a BCM message from interface index %d of bytes %d",
							ifr.ifr_ifindex, nbytes);
					parameters.id() = bcm_msg.msg_head.can_id;
					parameters.ifr().if__index() = ifr.ifr_ifindex;
					parameters.ifr().if__name() = ifr.ifr_name;

					uint32_t nframes = bcm_msg.msg_head.nframes;
					INTEGER opcode;
					opcode.set_long_long_val(bcm_msg.msg_head.opcode);
					parameters.frame().opcode() = int2oct(opcode, 4);
					parameters.frame().flags() = BITSTRING(
							int2bit(INTEGER(msg_head_flags),
							BCM_FRAME_FLAGS_SIZE));
					parameters.frame().count() = bcm_msg.msg_head.count;
					parameters.frame().ival1().tv__sec() =
							bcm_msg.msg_head.ival1.tv_sec;
					parameters.frame().ival1().tv__usec() =
							bcm_msg.msg_head.ival1.tv_usec;
					parameters.frame().ival2().tv__sec() =
							bcm_msg.msg_head.ival2.tv_sec;
					parameters.frame().ival2().tv__usec() =
							bcm_msg.msg_head.ival2.tv_usec;
					INTEGER bcm_head_can_id;
					bcm_head_can_id.set_long_long_val(bcm_msg.msg_head.can_id);
					parameters.frame().can__id() = int2oct(bcm_head_can_id, 4);
#ifdef BCM_CANFD_SUPPORT
					long flags = bcm_msg.msg_head.flags;
					if ((flags & CAN_FD_FRAME ) == CAN_FD_FRAME ) {
						// Handle CAN FD frames

						parameters.frame().frames().can__frame().set_size(nframes);
						for (uint32_t i = 0; i < nframes; i++) {
							INTEGER len;
							len = bcm_msg.frame[i].len;
							if (len > CANFD_MAX_DLEN) {
								TTCN_error("Writing data: CAN FD pdu size too large\n");
							};
							INTEGER can_id;
							can_id.set_long_long_val(bcm_msg.frame[i].can_id);
							parameters.frame().frames().canfd__frame()[i].can__id() = int2oct(can_id, 4);
							//Here the bitstring shall be stored into a
							parameters.frame().frames().canfd__frame()[i].can__flags() =
							BITSTRING(32,
									(const unsigned char*) &(bcm_msg.frame[i].flags));
							parameters.frame().frames().canfd__frame()[i].can__pdu() =
							OCTETSTRING(len,
									(const unsigned char*) &(bcm_msg.frame[i].data));
						}
						incoming_message(parameters);
					}
					else
#endif //BCM_CANFD_SUPPORT
					{
						parameters.frame().frames().can__frame().set_size(
								nframes);
						for (uint32_t i = 0; i < nframes; i++) {
							INTEGER len;
#ifdef	CANFD_FRAME_STRUCT_DEFINED   // struct canfd_frame is supported
							len = bcm_msg.frame[i].len;
#else   //CANFD_FRAME_STRUCT_DEFINED   // struct canfd_frame is supported
							len = bcm_msg.frame[i].can_dlc;
#endif	//CANFD_FRAME_STRUCT_DEFINED   // struct canfd_frame is supported
							// Handle legacy CAN frames
							if (len > CAN_MAX_DLEN) {
								TTCN_error(
										"Writing data: CAN pdu size too large\n");
								len = CAN_MAX_DLEN;
							};
							INTEGER can_id;
							can_id.set_long_long_val(bcm_msg.frame[i].can_id);
							parameters.frame().frames().can__frame()[i].can__id() =
									int2oct(can_id, 4);
							parameters.frame().frames().can__frame()[i].can__pdu() =
									OCTETSTRING(len,
											(const unsigned char*) &(bcm_msg.frame[i].data));

						}
						incoming_message(parameters);
					}
				}
			}
				break;
			default: {
				TTCN_error(
						"SocketCAN Handle_Fd_Event_Readable (%d): unhandled protocol configured",
						sock);
			}
				break;
			}
		}
	}
	log("leaving SocketCAN__PT_PROVIDER::Handle_Fd_Event_Readable()");
}

void SocketCAN__PT_PROVIDER::user_map(const char */*system_port */) {
	log("entering SocketCAN__PT_PROVIDER::user_map()");

	config_finished = true;

	if (debugging_configured == false) {
		// The debugging mode has not been defined in TTCN configuration file.
		TTCN_error(
				"Missing mandatory parameter: SocketCAN_debuhhing for can_interface_name %s \n",
				can_interface_name);
	}

	if (sock_list != NULL)
		TTCN_error("SocketCAN Test Port (%s): Internal error: "
				"sock_list is not NULL when mapping.", port_name);
	sock_list = (sock_data*) Malloc(DEFAULT_NUM_SOCK * sizeof(*sock_list));
	num_of_sock = 0;
	sock_list_length = DEFAULT_NUM_SOCK;
	for (int a = 0; a < sock_list_length; a++) {
		sock_list[a].fd = 0;
		sock_list[a].status = SOCKET_NOT_ALLOCATED;
		sock_list[a].protocol_family =
				SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_NO_PROTOCOL;
	}

	log("leaving SocketCAN__PT_PROVIDER::user_map()");
}

void SocketCAN__PT_PROVIDER::user_unmap(const char * /*system_port*/) {
	log("entering SocketCAN__PT_PROVIDER::user_unmap()");

	closeDownSocket();

	log("leaving SocketCAN__PT_PROVIDER::user_unmap()");
}

void SocketCAN__PT_PROVIDER::user_start() {

}

void SocketCAN__PT_PROVIDER::user_stop() {

}

void SocketCAN__PT_PROVIDER::outgoing_send(
		const SocketCAN__Types::SocketCAN__socket& send_par) {
	log("entering SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__socket)");
	int cn;
	SocketCAN__Types::SocketCAN__socket__result result;

	if (num_of_sock < sock_list_length) {
		cn = 0;
		while (sock_list[cn].status == SOCKET_OPEN) {
			cn++;
		}
	} else {
		sock_list = (sock_data*) Realloc(sock_list,
				2 * sock_list_length * sizeof(*sock_list));
		for (int a = sock_list_length; a < sock_list_length * 2; a++) {
			sock_list[a].status = SOCKET_NOT_ALLOCATED;
		}
		cn = sock_list_length;
		sock_list_length *= 2;
	}

	//extern int socket (int __domain, int __type, int __protocol) __THROW;
	target_fd = socket(send_par.domain(), send_par.ptype(),
			send_par.protocol());
	if (target_fd <= 0) {
		TTCN_error("Cannot open socket \n");
		result.result().result__code() =
				SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
		result.result().err() = errno;
		result.result().err__text() = "Cannot open socket";
	} else {
		log("SocketCAN opened socket %d \n", target_fd);
		sock_list[cn].fd = target_fd;
		sock_list[cn].status = SOCKET_OPEN;

		num_of_sock++;

		//Handler_Add_Fd_Read(target_fd);

		result.id() = cn;
		result.result().result__code() =
				SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
		result.result().err() = OMIT_VALUE;
		result.result().err__text() = OMIT_VALUE;
	}

	incoming_message(result);
	log("leaving SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__socket)");
}

void SocketCAN__PT_PROVIDER::outgoing_send(
		const SocketCAN__Types::SocketCAN__ioctl& send_par) {
	log("entering SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__ioctl)");

	struct ifreq ifr;

	int sock;
	int cn = send_par.id();
	int res;
	SocketCAN__Types::SocketCAN__ioctl__result result;

	if ((cn < sock_list_length) and (sock_list[cn].status == SOCKET_OPEN)) {
		sock = sock_list[cn].fd;
		if (send_par.ifu().is_present()) {
			const OPTIONAL<SocketCAN__Types::SocketCAN__ioctl__ifu>& ifu =
					send_par.ifu();
			switch (ifu().get_selection()) {
			case SocketCAN__Types::SocketCAN__ioctl__ifu::ALT_if__name:
				strcpy(ifr.ifr_name, ifu().if__name());
				res = ioctl(sock, SIOCGIFINDEX, &ifr);
				if (res != 0) {
					TTCN_error(
							"Ioctl failed on socket: %d with interface name %s\n",
							sock, (const char *) ifu().if__name());
					result.ifr().if__name() = ifu().if__name();
					result.result().result__code() =
							SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
					result.result().err() = errno;
					result.result().err__text() = "Ioctl failed";

				} else {
					log("SocketCAN ioctl successful on socket %d \n", sock);
					result.ifr().if__name() = ifu().if__name();
					result.ifr().if__index() = ifr.ifr_ifindex;
					result.result().result__code() =
							SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
					result.result().err() = OMIT_VALUE;
					result.result().err__text() = OMIT_VALUE;
				}

				break;
			case SocketCAN__Types::SocketCAN__ioctl__ifu::ALT_if__index:
				res = ioctl(sock, SIOCGIFNAME, &ifr);
				if (res != 0) {
					TTCN_error(
							"Ioctl failed on socket: %d with interface index %llu \n",
							sock, ifu().if__index().get_long_long_val());
					result.ifr().if__index() = ifr.ifr_ifindex;
					result.result().result__code() =
							SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
					result.result().err() = errno;
					result.result().err__text() = "Ioctl failed";
				} else {
					log("SocketCAN ioctl successful on socket %d \n", sock);
					result.ifr().if__name() = ifr.ifr_name;
					result.result().result__code() =
							SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
					result.result().err() = OMIT_VALUE;
					result.result().err__text() = OMIT_VALUE;
				}
				break;
			default:
				TTCN_error("Ioctl failed due to unknown union selection");
				break;
			}
		} else {
			// optional ifu filed is not present, set take interface name from applicable TTCN configuration file
			if (can_interface_name == NULL) {
				TTCN_error(
						"Missing mandatory parameter: \"SocketCAN_can_interface_name\" has not been defined in function call to Send Data nor in test configuration file! ");
			} else {
				strcpy(ifr.ifr_name, can_interface_name);
				res = ioctl(sock, SIOCGIFINDEX, &ifr);
				if (res != 0) {
					TTCN_error(
							"Ioctl failed on socket: %d with interface name %s \n",
							sock, can_interface_name);
					result.ifr().if__index() = ifr.ifr_ifindex;
					result.result().result__code() =
							SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
					result.result().err() = errno;
					result.result().err__text() = "Ioctl failed";
				} else {
					log("SocketCAN ioctl successful on socket %d \n", sock);
					result.ifr().if__name() = ifr.ifr_name;
					result.ifr().if__index() = ifr.ifr_ifindex;
					result.result().result__code() =
							SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
					result.result().err() = OMIT_VALUE;
					result.result().err__text() = OMIT_VALUE;
				}
				if (strlen(can_interface_name) <= IFNAMSIZ) {
					std::strcpy(ifr.ifr_name, can_interface_name);

				} else {
					TTCN_error(
							"Ioctl failed due to interface name too long.\n");
					result.result().result__code() =
							SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
					result.result().err() = OMIT_VALUE;
					result.result().err__text() =
							"Ioctl failed due to interface name too long";
				}
			}
		}
	} else {
		TTCN_error("Ioctl failed due to unknown socket reference: %d \n", cn);
		result.ifr().if__name() = ifr.ifr_name;
		result.result().result__code() =
				SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
		result.result().err() = OMIT_VALUE;
		result.result().err__text() =
				"Ioctl failed due to unknown socket reference";
	}
	incoming_message(result);
	log("SocketCAN__PT::outgoing_send(SocketCAN__ioctl)");
}
void SocketCAN__PT_PROVIDER::outgoing_send(
		const SocketCAN__Types::SocketCAN__connect& send_par) {
//Client connects to BCM
	log("entering SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__connect)");

	int sock;
	struct sockaddr_can addr = { };
	int cn = send_par.id();
	int res;
	SocketCAN__Types::SocketCAN__connect__result result;

	if ((cn < sock_list_length) and (sock_list[cn].status == SOCKET_OPEN)) {
		if (sock_list[cn].protocol_family
				== SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_NO_PROTOCOL) {
			sock = sock_list[cn].fd;

			addr.can_family = AF_CAN;

			SocketCAN__Types::SocketCAN__connectu connectu =
					send_par.connectu();
			switch (connectu.get_selection()) {
			case SocketCAN__Types::SocketCAN__connectu::ALT_bcm:
				addr.can_ifindex = connectu.bcm().if__index();
				sock_list[cn].protocol_family =
						SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_PROTOCOL_CAN_BCM;
				break;
			default:
				TTCN_error(
						"connectu union selection does not exist on socket %d: \n",
						sock);
				break;
			}
			log("Connecting socket: %d with index: %d", sock, addr.can_ifindex);
			//extern int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
			res = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
			if (res != 0) {
				TTCN_error("Connecting to socket %d failed: \n", sock);
				log("Connecting to socket %d failed", sock);
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
				result.result().err() = errno;
				result.result().err__text() = "Connecting to socket failed";
			} else {
				log("Connecting socket %d was successful", sock);
				sock_list[cn].protocol_family =
						SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_PROTOCOL_CAN_BCM;
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
				result.result().err() = OMIT_VALUE;
				result.result().err__text() = OMIT_VALUE;
				sock_list[cn].remote_Addr.can_family = AF_CAN;
				Handler_Add_Fd_Read(target_fd);
			}
		} else {
			TTCN_error("Socket reference already connected or bound: %d \n",
					cn);
			result.result().result__code() =
					SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
			result.result().err() = OMIT_VALUE;
			result.result().err__text() =
					"Socket reference already connected or bound";
		}
	} else {
		TTCN_error("Unknown socket reference: %d \n", cn);
		result.result().result__code() =
				SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
		result.result().err() = OMIT_VALUE;
		result.result().err__text() = "Unknown socket reference";
	}
	incoming_message(result);
	log("leaving SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__connect)");
}

void SocketCAN__PT_PROVIDER::outgoing_send(
		const SocketCAN__Types::SocketCAN__bind& send_par) {
//Client binds
	log("entering SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__bind)");

	int sock;
	struct sockaddr_can addr = { };
	int cn = send_par.id();
	int res;
	SocketCAN__Types::SocketCAN__bind__result result;

	if ((cn < sock_list_length) and (sock_list[cn].status == SOCKET_OPEN)) {
		if (sock_list[cn].protocol_family
				== SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_NO_PROTOCOL) {
			int if_index;
			SocketCAN__PortType::SocketCAN__PT_PROVIDER::socket_protocol_family_enum protocol_family;
			sock = sock_list[cn].fd;

			addr.can_family = AF_CAN;

			SocketCAN__Types::SocketCAN__bindu bindu = send_par.bindu();

			switch (bindu.get_selection()) {
			case SocketCAN__Types::SocketCAN__bindu::ALT_raw: {
				const int canfd_on = 1;
				setsockopt(sock, SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &canfd_on,
						sizeof(canfd_on));
				if_index = bindu.raw().if__index();
				protocol_family =
						SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_PROTOCOL_CAN_RAW;
			}
				break;
			case SocketCAN__Types::SocketCAN__bindu::ALT_isotp:
				if_index = bindu.isotp().if__index();
				addr.can_addr.tp.rx_id = oct2int(bindu.isotp().rx__can__id());
				addr.can_addr.tp.tx_id = oct2int(bindu.isotp().tx__can__id());
				protocol_family =
						SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_PROTOCOL_CAN_ISOTP;
				break;
			default:
				TTCN_error(
						"bindu union selection does not exist on socket %d: \n",
						sock);
				break;
			}
			addr.can_ifindex = if_index;
			log("Binding socket: %d with index: %d", sock, if_index);
			res = bind(sock, (struct sockaddr *) &addr, sizeof(addr));
			if (res != 0) {
				log("Binding to socket %d failed", sock);
				TTCN_error("Binding to socket %d failed:\n", sock);
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
				result.result().err() = errno;
			} else {
				log("Binding socket %d was successful", sock);
				sock_list[cn].protocol_family = protocol_family;
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
				result.result().err() = OMIT_VALUE;
				result.result().err__text() = OMIT_VALUE;
				sock_list[cn].remote_Addr.can_family = AF_CAN;
				Handler_Add_Fd_Read(target_fd);
			}
		} else {
			TTCN_error("Socket reference already connected or bound: %d \n",
					cn);
			result.result().result__code() =
					SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
			result.result().err() = errno;
			result.result().err__text() =
					"Socket reference already connected or bound";
		}
	} else {
		TTCN_error("Unknown socket reference: %d \n", cn);
		result.result().result__code() =
				SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
		result.result().err() = OMIT_VALUE;
		result.result().err__text() = "Unknown socket reference";
	}
	incoming_message(result);
	log("leaving SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__bind)");
}

void SocketCAN__PT_PROVIDER::outgoing_send(
		const SocketCAN__Types::SocketCAN__send__data& send_par) {
	log(
			"entering SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__send__data)");

	SocketCAN__Types::SocketCAN__send__data__result result;
	int res = 0;
	int sock;
	int cn = send_par.id();

	if ((cn < sock_list_length)) {
		struct sockaddr_can addr;
		struct ifreq ifr;
		int nrOfBytesSent, nrOfBytestoSend;
		sock = sock_list[cn].fd;

		if (send_par.ifu().is_present()) {
			const OPTIONAL<SocketCAN__Types::SocketCAN__send__data__ifu>& ifu =
					send_par.ifu();
			switch (ifu().get_selection()) {
			case SocketCAN__Types::SocketCAN__send__data__ifu::ALT_if__index:
				addr.can_ifindex = ifu().if__index();
				addr.can_family = AF_CAN;
				break;
			case SocketCAN__Types::SocketCAN__send__data__ifu::ALT_if__name:
				strcpy(ifr.ifr_name, ifu().if__name());
				res = ioctl(sock, SIOCGIFINDEX, &ifr);
				if (res != 0) {
					TTCN_error(
							"SocketCAN: Send CAN frame: Ioctl failed while retrieving the interface : %d with interface index %s\n",
							sock, ifr.ifr_name);
					result.result().result__code() =
							SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
					result.result().err() = errno;
					result.result().err__text() =
							"SocketCAN: Send CAN frame: Ioctl failed while retrieving the interface";
				}
				addr.can_ifindex = ifr.ifr_ifindex;
				addr.can_family = AF_CAN;
				break;
			case SocketCAN__Types::SocketCAN__send__data__ifu::ALT_if__any:
				addr.can_ifindex = 0;
				addr.can_family = AF_CAN;
				break;
			default:
				TTCN_error(
						"SocketCAN: Send CAN frame: Unknown union selection");
				res = -1;
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
				result.result().err() = OMIT_VALUE;
				result.result().err__text() =
						"SocketCAN: Send CAN frame: Unknown union selection";
			}
		} else {
			// optional ifu filed is not present, thus send to any interface:
			addr.can_ifindex = 0;
			addr.can_family = AF_CAN;
		}

		if (res == 0) { // check if previous interface inquiry step failed
			switch (send_par.frame().get_selection()) {
			case SocketCAN__Types::SocketCAN__CAN__or__CAN__FD__frame::ALT_can__frame: {
				struct can_frame frame;

				log("SocketCAN: Sending CAN frame)");
				logOctet(" to can id: ",
						send_par.frame().can__frame().can__id());
				logOctet("containing data: ",
						send_par.frame().can__frame().can__pdu());

				size_t can_dlc =
						send_par.frame().can__frame().can__pdu().lengthof();
				frame.can_id = oct2int(send_par.frame().can__frame().can__id());
				memcpy(frame.data, send_par.frame().can__frame().can__pdu(),
						can_dlc);
				frame.can_dlc = can_dlc;

				nrOfBytestoSend = sizeof(frame);
				if (send_par.ifu().is_present()) {
					nrOfBytesSent = sendto(sock, &frame, nrOfBytestoSend, 0,
							(struct sockaddr*) &addr, sizeof(addr));
					if (nrOfBytesSent < 0) {
						log(
								"SocketCAN: Sent CAN frame with sendto of size %d failed",
								nrOfBytesSent);
						TTCN_error(
								"SocketCAN send with sendto() error while trying to send %d bytes",
								nrOfBytestoSend);
						result.result().result__code() =
								SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
						result.result().err() = errno;
						result.result().err__text() =
								"SocketCAN send with sendto() error";
					} else {
						log(
								"SocketCAN send data with sendto() successful on socket %d \n",
								sock);
						result.result().result__code() =
								SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
						result.result().err() = OMIT_VALUE;
						result.result().err__text() = OMIT_VALUE;
					}
				} else {
					nrOfBytesSent = send(sock, &frame, nrOfBytestoSend, 0);
					log("Sent CAN frame with send of size %d", nrOfBytesSent);
					if (nrOfBytesSent < 0) {
						log("Sent CAN frame with send of size %d failed",
								nrOfBytesSent);
						TTCN_error(
								"SocketCAN send with send() error while trying to send CAN frame of %d bytes",
								nrOfBytestoSend);
						result.result().result__code() =
								SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
						result.result().err() = errno;
						result.result().err__text() =
								"SocketCAN send with send() error";
					} else {
						log(
								"SocketCAN send data with send() successful on socket %d \n",
								sock);
						result.result().result__code() =
								SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
						result.result().err() = OMIT_VALUE;
						result.result().err__text() = OMIT_VALUE;
					}
				}
			}
				break;
#ifdef RAW_CANFD_SUPPORT
			case SocketCAN__Types::SocketCAN__CAN__or__CAN__FD__frame::ALT_canfd__frame: {
				{
					// Enabling FD support had been successful!
					log(
							"SocketCAN: Enabling FD support had been successful on socket %d",
							sock);

					struct canfd_frame fd_frame;

					log("SocketCAN: Sending CAN FD frame)");
					logOctet(" to can id: ",
							send_par.frame().canfd__frame().can__id());
					logBitstring("with flags: ",
							send_par.frame().canfd__frame().can__flags());
					logOctet("containing data: ",
							send_par.frame().canfd__frame().can__pdu());

					size_t len =
							send_par.frame().canfd__frame().can__pdu().lengthof();
					fd_frame.can_id = oct2int(
							send_par.frame().canfd__frame().can__id());
					fd_frame.flags = bit2int(
							send_par.frame().canfd__frame().can__flags());
					memcpy(fd_frame.data,
							send_par.frame().canfd__frame().can__pdu(), len);
					fd_frame.len = len;
					fd_frame.__res0 = 0x00;
					fd_frame.__res1 = 0x00;

					nrOfBytestoSend = sizeof(fd_frame);
					if (send_par.ifu().is_present()) {

						nrOfBytesSent = sendto(sock, &fd_frame, nrOfBytestoSend,
								0, (struct sockaddr*) &addr, sizeof(addr));
						if (nrOfBytesSent < 0) {
							TTCN_error(
									"SocketCAN FD send with sendto() error while trying to send %d bytes with error code: %d",
									nrOfBytestoSend, nrOfBytesSent);
							result.result().result__code() =
									SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
							result.result().err() = errno;
							result.result().err__text() =
									"SocketCAN FD send with sendto() error";
						} else {
							log(
									"SocketCAN: Sent CAN FD frame with sendto() of size %d",
									nrOfBytesSent);
							result.result().result__code() =
									SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
							result.result().err() = OMIT_VALUE;
							result.result().err__text() = OMIT_VALUE;
						}
					} else {
						nrOfBytesSent = send(sock, &fd_frame, nrOfBytestoSend,
								0);
						if (nrOfBytesSent < 0) {
							TTCN_error(
									"SocketCAN FD send with send() error while trying to send %d bytes",
									nrOfBytestoSend);
							result.result().result__code() =
									SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
							result.result().err() = errno;
							result.result().err__text() =
									"SocketCAN FD send with send() error";
						} else {
							log(
									"SocketCAN: Sent CAN FD frame with send() of size %d",
									nrOfBytesSent);
							result.result().result__code() =
									SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
							result.result().err() = OMIT_VALUE;
							result.result().err__text() = OMIT_VALUE;
						}
					}
				}
			}
				break;
#else  // RAW_CANFD_SUPPORT
				case SocketCAN__Types::SocketCAN__CAN__or__CAN__FD__frame::ALT_canfd__frame: {
					TTCN_error(
							"SocketCAN: CAN FD is not supported by your current kernel error");
					result.result().result__code() =
					SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
					result.result().err() = OMIT_VALUE;
					result.result().err__text() =
					"SocketCAN: CAN FD is not supported by your current kernel error";
				}
				break;
#endif // RAW_CANFD_SUPPORT

			default:
				TTCN_error("SocketCAN send unknown frame type error");
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
				result.result().err() = OMIT_VALUE;
				result.result().err__text() =
						"SocketCAN send unknown frame type error";
				break;
			}
			log("SocketCAN: Nr of bytes sent = %d", nrOfBytesSent);
			if ((nrOfBytesSent > 0) and (nrOfBytesSent != nrOfBytestoSend)
					and (nrOfBytestoSend != 0)) {
				TTCN_error(
						"Send system call failed: %d bytes were sent instead of %d",
						nrOfBytesSent, nrOfBytestoSend);
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
				result.result().err() = OMIT_VALUE;
				result.result().err__text() =
						"SocketCAN write failed as wrong number of bytes have been written";
			}
		}
	} else {
		TTCN_error("SocketCAN: Unknown socket reference: %d \n", cn);
		result.result().result__code() =
				SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
		result.result().err() = OMIT_VALUE;
		result.result().err__text() = "Unknown socket reference";
	}
	incoming_message(result);
	log("leaving SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__send__data)");
}

void SocketCAN__PT_PROVIDER::outgoing_send(
		const SocketCAN__Types::SocketCAN__write__data& send_par) {
	log(
			"entering SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__write__data)");

	SocketCAN__Types::SocketCAN__write__data__result result;
	int sock;
	int cn = send_par.id();

	if ((cn < sock_list_length)
			and (sock_list[cn].protocol_family
					== SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_PROTOCOL_CAN_BCM)
			and (sock_list[cn].status == SOCKET_OPEN)) {
		sock = sock_list[cn].fd;

		switch (send_par.bcm__tx__msg().frames().get_selection()) {
		case Bcm::SocketCAN__bcm__frame_frames::ALT_can__frame: {
			int nrOfBytesSent = 0;
			int nrOfBytestoSend = 0;
			struct {
				struct bcm_msg_head msg_head;
				struct can_frame frame[BCM_FRAME_BUFFER_SIZE];
			} bcm_msg = { };

			const Bcm::SocketCAN__bcm__frame& bcm__tx__msg =
					send_par.bcm__tx__msg();

			int nframes = bcm__tx__msg.frames().can__frame().lengthof();

			if (nframes > BCM_FRAME_BUFFER_SIZE) {
				TTCN_error(
						"SocketCAN: Writing data: number of CAN frames too large: %d \n",
						nframes);
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
				result.result().err() = errno;
				result.result().err__text() =
						"SocketCAN sending CAN data with write() failed, as more than BCM_FRAME_BUFFER_SIZE number of CAN frames to be sent";
				TTCN_error(
						"SocketCAN sending CAN data with write() failed, as more than BCM_FRAME_BUFFER_SIZE number of CAN frames to be sent");
			} else {
				const Bcm::SocketCAN__bcm__frame& bcm__tx__msg =
						send_par.bcm__tx__msg();

				bcm_msg.msg_head.opcode = oct2int(bcm__tx__msg.opcode());
				bcm_msg.msg_head.flags = bit2int(
						send_par.bcm__tx__msg().flags());
				bcm_msg.msg_head.count = bcm__tx__msg.count();
				bcm_msg.msg_head.ival1.tv_sec = bcm__tx__msg.ival1().tv__sec();
				bcm_msg.msg_head.ival1.tv_usec =
						bcm__tx__msg.ival1().tv__usec();
				bcm_msg.msg_head.ival2.tv_sec = bcm__tx__msg.ival2().tv__sec();
				bcm_msg.msg_head.ival2.tv_usec =
						bcm__tx__msg.ival2().tv__usec();
				bcm_msg.msg_head.can_id = oct2int(bcm__tx__msg.can__id());
				bcm_msg.msg_head.nframes = nframes;

				log("SocketCAN: Sending BCM Message)");
				logOctet(" opcode: ", bcm__tx__msg.opcode());
				logBitstring(" flags: ", bcm__tx__msg.flags());
				logInteger(" count: ", bcm__tx__msg.count());
				logInteger(" ival1: ", bcm__tx__msg.ival1().tv__sec());
				logInteger(" ival1: ", bcm__tx__msg.ival1().tv__usec());
				logInteger(" ival2: ", bcm__tx__msg.ival2().tv__sec());
				logInteger(" ival2: ", bcm__tx__msg.ival2().tv__usec());
				logOctet(" can_id: ", bcm__tx__msg.can__id());
				logInteger(" nframes: ", nframes);

				for (int i = 0; i < nframes; i++) {
					const Bcm::SocketCAN__bcm__frame_frames_can__frame& frame =
							bcm__tx__msg.frames().can__frame();

					bcm_msg.frame[i].can_id = oct2int(frame[i].can__id());
					unsigned int can_dlc;
					can_dlc = frame[i].can__pdu().lengthof();
					if (can_dlc > CAN_MAX_DLEN) {
						TTCN_error(
								"SocketCAN writing data: CAN pdu size too large\n");
						can_dlc = CAN_MAX_DLEN;
					};
					log(" containing CAN frame:)");
					logOctet("   can id: ", frame[i].can__id());
					logInteger("   can dlc: ", can_dlc);

					bcm_msg.frame[i].can_dlc = can_dlc;
					for (unsigned int j = 0; j < can_dlc; j++) {
						bcm_msg.frame[i].data[j] = oct2int(
								frame[i].can__pdu()[j]);
						logOctet("   data: ", frame[i].can__pdu()[j]);
					}
				}
				// assuming that the struct within the structure are aligned cm_msg without passing
				// BCM_write does not calculate unused fields from nframes to BCM_FRAME_BUFFER_SIZE
				nrOfBytestoSend = sizeof(struct bcm_msg_head)
						+ nframes * sizeof(struct can_frame);

				nrOfBytesSent = write(sock, &bcm_msg, (int) nrOfBytestoSend);

				if ((nrOfBytesSent) < 0) {
					int myerrno = errno;
					result.result().result__code() =
							SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
					result.result().err() = myerrno;
					result.result().err__text() =
							"SocketCAN sending CAN data with write() failed";
					logInteger("bcm_msg.msg_head.can_id: ",
							(bcm_msg.msg_head.can_id));
					logInteger("bcm_msg.msg_head.count: ",
							bcm_msg.msg_head.count);
					logInteger("bcm_msg.msg_head.flags: ",
							bcm_msg.msg_head.flags);
					logInteger("bcm_msg.msg_head.ival1.tv_sec: ",
							bcm_msg.msg_head.ival1.tv_sec);
					logInteger("bcm_msg.msg_head.ival1.tv_usec: ",
							bcm_msg.msg_head.ival1.tv_usec);
					logInteger("bcm_msg.msg_head.ival2.tv_sec: ",
							bcm_msg.msg_head.ival2.tv_sec);
					logInteger("bcm_msg.msg_head.ival2.tv_usec: ",
							bcm_msg.msg_head.ival2.tv_usec);
					logInteger("bcm_msg.msg_head.nframes: ",
							bcm_msg.msg_head.nframes);
					logInteger("bcm_msg.msg_head.opcode: ",
							bcm_msg.msg_head.opcode);

					TTCN_error(
							//"SocketCAN sending CAN data with write() failed");
							"SocketCAN sending CAN data with write() failed. nrOfBytestoSend: %d, sizeof(struct bcm_msg_head): %d, nframes: %d, sizeof(struct can_frame): %d, nrOfBytesSent: %d, errno: %d\n",
							nrOfBytestoSend,
							((int) sizeof(struct bcm_msg_head)),
							((int) nframes), ((int) sizeof(struct can_frame)),
							(int) nrOfBytesSent, (int) myerrno);
				} else {
					result.result().result__code() =
							SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
					result.result().err() = nrOfBytesSent;
					result.result().err__text() = OMIT_VALUE;
				}
				log("Nr of bytes sent = %d", nrOfBytesSent);

				if (nrOfBytesSent != nrOfBytestoSend) {
					TTCN_error(
							"SocketCAN frame  write failed: %d bytes were sent instead of %d",
							nrOfBytesSent, nrOfBytestoSend);
					result.result().result__code() =
							SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
					result.result().err() = OMIT_VALUE;
					result.result().err__text() =
							"SocketCAN write failed as wrong number of bytes have been written";
				}
			}
		}
			break;
#ifdef BCM_CANFD_SUPPORT
			case Bcm::SocketCAN__bcm__frame_frames::ALT_canfd__frame: {
				int nrOfBytesSent = 0;
				int nrOfBytestoSend = 0;
				struct {
					struct bcm_msg_head msg_head;
					struct canfd_frame frame[BCM_FRAME_BUFFER_SIZE];
				}bcm_msg;

				const Bcm::SocketCAN__bcm__frame& bcm__tx__msg =
				send_par.bcm__tx__msg();

				unsigned int nframes =
				bcm__tx__msg.frames().canfd__frame().lengthof();

				if (nframes > BCM_FRAME_BUFFER_SIZE) {
					TTCN_error(
							"SocketCAN writing data: number of CAN FD frames too large: %d \n",
							nframes);
					result.result().result__code() =
					SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
					result.result().err() = errno;
					result.result().err__text() =
					"SocketCAN sending CAN FD data with write() failed, as more than BCM_FRAME_BUFFER_SIZE number of CAN FD frames to be sent";
					TTCN_error(
							"SocketCAN sending CAN FD data with write() failed, as more than BCM_FRAME_BUFFER_SIZE number of CAN FD frames to be sent");
				} else {
					const Bcm::SocketCAN__bcm__frame& bcm__tx__msg =
					send_par.bcm__tx__msg();

					bcm_msg.msg_head.opcode = oct2int(bcm__tx__msg.opcode());
					bcm_msg.msg_head.flags = bit2int(
							send_par.bcm__tx__msg().flags()) | CAN_FD_FRAME;
					// set CAN_FD_FRAME-flag to indicate canfd frames are following
					bcm_msg.msg_head.count = bcm__tx__msg.count();
					bcm_msg.msg_head.ival1.tv_sec = bcm__tx__msg.ival1().tv__sec();
					bcm_msg.msg_head.ival1.tv_usec =
					bcm__tx__msg.ival1().tv__usec();
					bcm_msg.msg_head.ival2.tv_sec = bcm__tx__msg.ival2().tv__sec();
					bcm_msg.msg_head.ival2.tv_usec =
					bcm__tx__msg.ival2().tv__usec();
					bcm_msg.msg_head.nframes = nframes;

					log("SocketCAN: Sending BCM Message)");
					logOctet(" opcode: ", bcm__tx__msg.opcode());
					logBitstring(" flags: ", bcm__tx__msg.flags());
					logInteger(" count: ", bcm__tx__msg.count());
					logInteger(" ival1: ", bcm__tx__msg.ival1().tv__sec());
					logInteger(" ival1: ", bcm__tx__msg.ival1().tv__usec());
					logInteger(" ival2: ", bcm__tx__msg.ival2().tv__sec());
					logInteger(" ival2: ", bcm__tx__msg.ival2().tv__usec());
					logOctet(" can_id: ", send_par.bcm__tx__msg().can__id());
					logInteger(" nframes: ", nframes);

					for (unsigned int i = 0; i < nframes; i++) {
						const Bcm::SocketCAN__bcm__frame_frames_canfd__frame& frame =
						bcm__tx__msg.frames().canfd__frame();

						bcm_msg.frame[i].can_id = oct2int(frame[i].can__id());
						bcm_msg.frame[i].flags = bit2int(frame[i].can__flags());
						unsigned int len = frame[i].can__pdu().lengthof();
						if (len > CANFD_MAX_DLEN) {
							TTCN_error("Writing data: CAN FD pdu size too large\n");
							len = CANFD_MAX_DLEN;
						};
						log(" containing CAN FD frame:)");
						logOctet("   can id: ", frame[i].can__id());
						logInteger("   can len: ", len);

						bcm_msg.frame[i].len = len;
						for (unsigned int j = 0; j < len; j++) {
							bcm_msg.frame[i].data[j] = oct2int(
									frame[i].can__pdu()[j]);
							logOctet("   data: ", frame[i].can__pdu()[j]);
						}
					}
					// assuming that the structs within the structure are aligned cm_msg without passing
					// BCM_write does not calculate unused fields from nframes to BCM_FRAME_BUFFER_SIZE
					nrOfBytestoSend = sizeof(struct bcm_msg_head)
					+ nframes * sizeof(struct canfd_frame);
					nrOfBytesSent = write(sock, &bcm_msg, nrOfBytestoSend);

					if (nrOfBytesSent < 0) {
						result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
						result.result().err() = errno;
						result.result().err__text() =
						"SocketCAN sending CAN FD data with write() failed";
						TTCN_error(
								"SocketCAN sending CAN FD data with write() failed");
					} else {
						result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
						result.result().err() = OMIT_VALUE;
						result.result().err__text() = OMIT_VALUE;
					}
				}

				log("Nr of bytes sent = %d", nrOfBytesSent);

				if (nrOfBytesSent != nrOfBytestoSend) {
					TTCN_error(
							"SocketCAN CAN fd frame write failed: %d bytes were sent instead of %d",
							nrOfBytesSent, nrOfBytestoSend);
					result.result().result__code() =
					SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
					result.result().err() = OMIT_VALUE;
					result.result().err__text() =
					"SocketCAN write failed as wrong number of bytes have been written";
				}
			}
			break;
#endif //BCM_CANFD_SUPPORT

		default:
			TTCN_error("SocketCAN write unknown frame type error");
			result.result().result__code() =
					SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
			result.result().err() = OMIT_VALUE;
			result.result().err__text() =
					"SocketCAN write unknown frame type error";
			break;
		}
	} else {
		TTCN_error(
				"SocketCAN  write data failed due to unknown socket reference: %d \n",
				cn);
		result.result().result__code() =
				SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
		result.result().err() = OMIT_VALUE;
		result.result().err__text() =
				"SocketCAN  write data failed due to unknown socket reference";
	}
	incoming_message(result);
	log(
			"leaving SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__write__data)");
}

void SocketCAN__PT_PROVIDER::outgoing_send(
		const SocketCAN__Types::SocketCAN__write__isotp& send_par) {
	log(
			"entering SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__write__isotp)");

	SocketCAN__Types::SocketCAN__write__isotp__result result;
	int sock;
	int cn = send_par.id();

	if ((cn < sock_list_length)
			and (sock_list[cn].protocol_family
					== SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_PROTOCOL_CAN_ISOTP)
			and (sock_list[cn].status == SOCKET_OPEN)) {
		sock = sock_list[cn].fd;

		int nrOfBytesSent = 0;
		int nrOfBytestoSend = send_par.pdu().lengthof();

		logOctet("Writing ISOTP data on socket: ", send_par.pdu());
		nrOfBytesSent = write(sock, send_par.pdu(), nrOfBytestoSend);
		log(
				"Written to ISOTP %d bytes data of the expected %d bytes on socket %d: ",
				nrOfBytesSent, nrOfBytestoSend, sock);
		if (nrOfBytesSent != nrOfBytestoSend) {
			TTCN_warning(
					"SocketCAN write isotp has written %d bytes, which are fewer than expected %d bytes to socket: %d \n",
					nrOfBytesSent, nrOfBytestoSend, sock);
		}
		if (nrOfBytesSent < 0) {
			TTCN_error("SocketCAN write isotp failed with error code %d:\n",
					errno);
			result.result().result__code() =
					SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
			result.result().err() = errno;
			result.result().err__text() = "SocketCAN write isotp failed";
		} else {
			log("SocketCAN: write isotp successful on socket %d", sock);
			result.result().result__code() =
					SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
			result.result().err() = OMIT_VALUE;
			result.result().err__text() = OMIT_VALUE;
		}
	} else {
		TTCN_error(
				"SocketCAN write isotp failed due to unknown socket reference: %d with protocol family %d and status %d\n",
				cn, sock_list[cn].protocol_family, sock_list[cn].status);
		result.result().result__code() =
				SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
		result.result().err() = OMIT_VALUE;
		result.result().err__text() =
				"SocketCAN write isotp failed due to unknown socket reference";
	}
	incoming_message(result);
	log(
			"leaving SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__write__isotp)");
}

void SocketCAN__PT_PROVIDER::outgoing_send(
		const SocketCAN__Types::SocketCAN__setsockopt& send_par) {
	log(
			"entering SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__setsockopt)");

	int sock;
	int cn = send_par.id();
	int res;
	SocketCAN__Types::SocketCAN__setsockopt__result result;

	if ((cn < sock_list_length) and (sock_list[cn].status == SOCKET_OPEN)) {
		sock = sock_list[cn].fd;

		SocketCAN__Types::SocketCAN__setsockopt__commandu::union_selection_type command_selection =
				send_par.command().get_selection();

		switch (command_selection) {
		case SocketCAN__Types::SocketCAN__setsockopt__commandu::ALT_rfilter: {

			std::size_t rfilter_size = (sizeof(send_par.command().rfilter())
					/ sizeof(send_par.command().rfilter()[0]));

			struct can_filter rfilter[rfilter_size];

			if (rfilter_size == 0) {
				// deactivate filters
				res = setsockopt(sock, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);
			} else {
				for (std::size_t i = 0; i < rfilter_size; i++) {
					rfilter[i].can_id = oct2int(
							send_par.command().rfilter()[i].can__id());
					rfilter[i].can_mask = oct2int(
							send_par.command().rfilter()[i].can__mask());
				};
				res = setsockopt(sock, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter,
						sizeof(rfilter));
			}
			if (res < 0) {
				TTCN_error(
						"SocketCAN  setsockopt rfilter failed with error code %d:\n",
						errno);
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
				result.result().err() = errno;
				result.result().err__text() =
						"SocketCAN  setsockopt rfilter failed";

			} else {
				log("SocketCAN: setsockopt rfilter successful on socket %d",
						sock);
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
				result.result().err() = OMIT_VALUE;
				result.result().err__text() = OMIT_VALUE;
			}
		}
			break;

		case SocketCAN__Types::SocketCAN__setsockopt__commandu::ALT_err__mask: {
			can_err_mask_t err_mask = bit2int(send_par.command().err__mask());
			res = setsockopt(sock, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, &err_mask,
					sizeof(err_mask));
			if (res < 0) {
				int myerrno = errno;
				TTCN_error(
						"SocketCAN  setsockopt can__err__mask failed with error code %d:\n",
						myerrno);
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
				result.result().err() = myerrno;
				result.result().err__text() =
						"SocketCAN  setsockopt can__err__mask failed";
			} else {
				log(
						"SocketCAN: setsockopt can__err__mask successful on socket %d",
						sock);
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
				result.result().err() = OMIT_VALUE;
				result.result().err__text() = OMIT_VALUE;
			}
		}
			break;

		case SocketCAN__Types::SocketCAN__setsockopt__commandu::ALT_loopback: {

			int loopback = send_par.command().loopback();
			res = setsockopt(sock, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &loopback,
					sizeof(loopback));
			if (res < 0) {
				int myerrno = errno;
				TTCN_error(
						"SocketCAN  setsockopt loopbackfailed with error code %d:\n",
						myerrno);
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
				result.result().err() = myerrno;
				result.result().err__text() =
						"SocketCAN  setsockopt loopback failed";
			} else {
				log("SocketCAN: setsockopt loopback successful on socket %d",
						sock);
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
				result.result().err() = OMIT_VALUE;
				result.result().err__text() = OMIT_VALUE;
			}
		}
			break;

		case SocketCAN__Types::SocketCAN__setsockopt__commandu::ALT_recv__own__msgs: {

			int recv_own_msgs = send_par.command().recv__own__msgs();
			res = setsockopt(sock, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS,
					&recv_own_msgs, sizeof(recv_own_msgs));
			if (res < 0) {
				TTCN_error(
						"SocketCAN  setsockopt recv__own__msg failed with error code %d:\n",
						errno);
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
				result.result().err() = errno;
				result.result().err__text() =
						"SocketCAN  setsockopt recv__own__msg failed";
			} else {
				log(
						"SocketCAN: setsockopt recv__own__msg successful on socket %d",
						sock);
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
				result.result().err() = OMIT_VALUE;
				result.result().err__text() = OMIT_VALUE;
			}
		}
			break;

		case SocketCAN__Types::SocketCAN__setsockopt__commandu::ALT_fd__frames: {

			int fd_frames = send_par.command().fd__frames();

			res = setsockopt(sock, SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &fd_frames,
					sizeof(fd_frames));
			if (res < 0) {
				TTCN_error(
						"SocketCAN  setsockopt fd__frames failed with error code %d:\n",
						errno);
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
				result.result().err() = errno;
				result.result().err__text() =
						"SocketCAN  setsockopt fd__frames failed";
			} else {
				log("SocketCAN: setsockopt fd__frames successful on socket %d",
						sock);
				result.result().result__code() =
						SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
				result.result().err() = OMIT_VALUE;
				result.result().err__text() = OMIT_VALUE;
			}
		}
			break;
		case SocketCAN__Types::SocketCAN__setsockopt__commandu::ALT_join__filters: {
			{
				int join_filters = send_par.command().join__filters();

				res = setsockopt(sock, SOL_CAN_RAW, CAN_RAW_JOIN_FILTERS,
						&join_filters, sizeof(join_filters));
				if (res < 0) {
					TTCN_error(
							"SocketCAN  setsockopt join__filters failed with error code %d:\n",
							errno);
					result.result().result__code() =
							SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
					result.result().err() = errno;
					result.result().err__text() =
							"SocketCAN  setsockopt join__filters failed";
				} else {
					log(
							"SocketCAN: setsockopt join__filterssuccessful on socket %d",
							sock);
					result.result().result__code() =
							SocketCAN__Types::SocketCAN__Result__code::SocketCAN__SUCCESS;
					result.result().err() = OMIT_VALUE;
					result.result().err__text() = OMIT_VALUE;
				}
			}
		}
			break;
		default: {
			TTCN_error(
					"SocketCAN: Unknown SocketCAN_setsockopt commandu union selection: %d \n",
					cn);
			result.result().result__code() =
					SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
			result.result().err() = OMIT_VALUE;
			result.result().err__text() =
					"SocketCAN: Unknown SocketCAN_setsockopt commandu union selection";
			break;
		}
		}
	} else {
		TTCN_error("SocketCAN: Unknown socket reference: %d \n", cn);
		result.result().result__code() =
				SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
		result.result().err() = errno;
		result.result().err__text() = "SocketCAN: Unknown socket reference";
	}
	incoming_message(result);
	log("leaving SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__setsockopt)");
}

void SocketCAN__PT_PROVIDER::outgoing_send(
		const SocketCAN__Types::SocketCAN__close& send_par) {
	log("entering SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__close)");
	int sock = sock_list[send_par.id()].fd;

	sock_list[send_par.id()].status = SOCKET_NOT_ALLOCATED;
	sock_list[send_par.id()].fd = 0;
	sock_list[send_par.id()].protocol_family =
			SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_NO_PROTOCOL;
	num_of_sock--;
	Handler_Remove_Fd_Read(sock);

	close(sock);

	log("leaving SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__close)");
}

void SocketCAN__PT_PROVIDER::reset_configuration() {
	free(can_interface_name);
	can_interface_name = NULL;
	debugging = false;
	debugging_configured = false;
}

void SocketCAN__PT_PROVIDER::InitStrPar(char *&par, const char* name,
		const char* val) {
	if (name)
		log("%s: Reading testport parameter: "
				"%s = %s", port_name, name, val);

	if (par)
		free(par);
	par = (char*) malloc(strlen(val) + 1);
	if (par == NULL)
		TTCN_error("Not enough memory.");
	strcpy(par, val);
}

void SocketCAN__PT_PROVIDER::log(const char *fmt, ...) {
	if (debugging == true) {
		TTCN_Logger::begin_event (TTCN_DEBUG);
		TTCN_Logger::log_event("SocketCAN test port (%s): ", get_name());
		va_list args;
		va_start(args, fmt);
		TTCN_Logger::log_event_va_list(fmt, args);
		va_end(args);
		TTCN_Logger::end_event();
	}
}

void SocketCAN__PT_PROVIDER::logOctet(const char *prompt,
		const OCTETSTRING& msg) {
	if (debugging == true) { //if debug
		TTCN_Logger::begin_event (TTCN_DEBUG);
		TTCN_Logger::log_event_str(prompt);
		TTCN_Logger::log_event("Size: %d,\nMsg: ", msg.lengthof());

		for (int i = 0; i < msg.lengthof(); i++) {
			TTCN_Logger::log_event(" %02x", ((const unsigned char*) msg)[i]);
		}
		TTCN_Logger::log_event("\n");
		TTCN_Logger::end_event();
	}
}

void SocketCAN__PT_PROVIDER::logHex(const char *prompt, const HEXSTRING& msg) {
	if (debugging == true) { //if debug
		TTCN_Logger::begin_event (TTCN_DEBUG);
		TTCN_Logger::log_event_str(prompt);
		TTCN_Logger::log_event("Size: %d,\nMsg: ", msg.lengthof());

		for (int i = 0; i < msg.lengthof(); i++) {
			TTCN_Logger::log_event(" %02x", ((const unsigned char*) msg)[i]);
		}
		TTCN_Logger::log_event("\n");
		TTCN_Logger::end_event();
	}
}

void SocketCAN__PT_PROVIDER::logInteger(const char *prompt, const int number) {
	if (debugging) { //if debug
		TTCN_Logger::begin_event (TTCN_DEBUG);
		TTCN_Logger::log_event_str(prompt);
		TTCN_Logger::log_event("Value: %d,\n: ", number);
		TTCN_Logger::log_event("\n");
		TTCN_Logger::end_event();
	}
}

void SocketCAN__PT_PROVIDER::logBitstring(const char *prompt,
		const BITSTRING& msg) {
	if (debugging == true) { //if debug
		TTCN_Logger::begin_event (TTCN_DEBUG);
		TTCN_Logger::log_event_str(prompt);
		int len = msg.lengthof();
		TTCN_Logger::log_event("Size: %d,\nMsg: 0b", len);
		for (int i = 0; i < msg.lengthof(); i++) {
			TTCN_Logger::log_event("%d", (int) bit2int(msg[i]));
		}
		TTCN_Logger::log_event("\n");
		TTCN_Logger::end_event();
	}
}

void SocketCAN__PT_PROVIDER::setUpSocket() {
	log("entering SocketCAN__PT_PROVIDER::setUpSocket()");
	log("leaving SocketCAN__PT_PROVIDER::setUpSocket()");
}

void SocketCAN__PT_PROVIDER::closeDownSocket() {
	log("entering SocketCAN__PT_PROVIDER::closeDownSocket()");

	for (int a = 0; a < sock_list_length; a++) {
		if (sock_list[a].status == SOCKET_OPEN) {
			sock_list[a].status = SOCKET_NOT_ALLOCATED;
			sock_list[a].protocol_family =
					SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_NO_PROTOCOL;
			close(sock_list[a].fd);
			Handler_Remove_Fd_Read(sock_list[a].fd);
		}
	}

	Free(sock_list);
	sock_list = NULL;

	log("leaving SocketCAN__PT_PROVIDER::closeDownSocket()");
}

}
/* end of namespace */

