/******************************************************************************
 * Copyright (c) 2000-2019 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
// comment out the following define, if your kernel does not have j1939 support
#define CANJ1939_SUPPORT
#ifdef  CANJ1939_SUPPORT
#include <linux/can/j1939.h>
#endif  //CANJ1939_SUPPORT

#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 <linux/sockios.h>
#include <Logger.hh>
#include <memory.h>
#include <Octetstring.hh>
#include <Hexstring.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>
#include <openssl/bn.h>

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
#define J1939_RECIEVE_BUFSIZE  117440505 //(2²⁴-1)*7= 117440505 Bytes

//// 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_J1939: {
#ifdef  CANJ1939_SUPPORT
				SocketCAN__Types::SocketCAN__receive__j1939__message parameters;

				unsigned char *msg = new unsigned char[J1939_RECIEVE_BUFSIZE];
				long 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, J1939_RECIEVE_BUFSIZE, 0,
						(struct sockaddr*) &addr, &addr_len);

				BIGNUM* bn = BN_new();
				BN_add_word(bn, (BN_ULONG)(addr.can_addr.j1939.name / ULONG_MAX));
				BN_add_word(bn, (BN_ULONG)(addr.can_addr.j1939.name % ULONG_MAX));
				int_val_t ival(bn);
				INTEGER tmp;
				tmp.set_val(ival);


				//nbytes = read(sock, msg, J1939_RECIEVE_BUFSIZE);
				if (nbytes > 0 && nbytes < J1939_RECIEVE_BUFSIZE) {
					log("SocketCAN: Received j1939 message addr %x, name %llx, pgn %x",
							addr.can_addr.j1939.addr,
							addr.can_addr.j1939.name,
							addr.can_addr.j1939.pgn);
					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);
					parameters.pgn() = int2oct(addr.can_addr.j1939.pgn, 3);
					parameters.name() = int2oct(tmp, 8);
					parameters.destAddr() = int2oct(addr.can_addr.j1939.addr,
							1);

					incoming_message(parameters);
				}
				delete[] msg;
#else // CANJ1939_SUPPORT
				TTCN_error("SocketCAN: CAN J1939 is not compiled for your current kernel error");
#endif // CANJ1939_SUPPORT
			}
				break;

			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;
					sock_list[a].j1939_bound = false;
					sock_list[a].j1939_connected = false;
					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;
					sock_list[a].j1939_bound = false;
					sock_list[a].j1939_connected = false;
					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::Handle_Timeout(double time_since_last_call) {}*/

void SocketCAN__PT_PROVIDER::user_map(const char* /*system_port*/,
		Map_Params& /*params*/) {
	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_debugging 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;
		sock_list[a].j1939_bound = false;
		sock_list[a].j1939_connected = false;
	}

	log("leaving SocketCAN__PT_PROVIDER::user_map()");
}

void SocketCAN__PT_PROVIDER::user_unmap(const char* /*system_port*/,
		Map_Params& /*params*/) {
	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 field 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)");

	bool j1939_connected = false;
	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_list[cn].protocol_family
						== SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_PROTOCOL_CAN_J1939)
						&& (sock_list[cn].j1939_connected == false))) {
			sock = sock_list[cn].fd;

			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();
				addr.can_family = AF_CAN;
				sock_list[cn].protocol_family =
						SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_PROTOCOL_CAN_BCM;
				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);
				}
				break;
			case SocketCAN__Types::SocketCAN__connectu::ALT_j1939:
#ifdef  CANJ1939_SUPPORT
				addr.can_ifindex = connectu.j1939().if__index();
				sock_list[cn].protocol_family =
						SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_PROTOCOL_CAN_J1939;

				addr.can_family = AF_CAN;
				addr.can_addr.j1939.addr = J1939_NO_ADDR;
				addr.can_addr.j1939.name = J1939_NO_NAME;
				addr.can_addr.j1939.pgn = J1939_NO_PGN;

				if (connectu.j1939().j1939__destination().addr().is_present()) {
					const OPTIONAL<J1939::J1939__ADDR> &addr_ =
							connectu.j1939().j1939__destination().addr();
					addr.can_addr.j1939.addr = oct2int(addr_);
				}
				if (connectu.j1939().j1939__destination().name().is_present()) {
					const OPTIONAL<J1939::J1939__NAME> &name =
							connectu.j1939().j1939__destination().name();
					//addr.can_addr.j1939.name = oct2int(name);
					addr.can_addr.j1939.name = (__u64) oct2int(name).get_long_long_val();
				}
				if (connectu.j1939().j1939__destination().pgn().is_present()) {
					const OPTIONAL<J1939::J1939__PGN>& pgn =
					connectu.j1939().j1939__destination().pgn();
					addr.can_addr.j1939.pgn = oct2int(pgn);
				}
				log("SocketCAN: Sending J1939 message)");

				log("Connecting socket: %d with index: %d to addr %x, name %llx, pgn %x",
						sock, addr.can_ifindex, addr.can_addr.j1939.addr,
						addr.can_addr.j1939.name, addr.can_addr.j1939.pgn);
				//extern int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
				j1939_connected = true;
				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_J1939;
					sock_list[cn].j1939_connected = j1939_connected;
					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 // CANJ1939_SUPPORT
				TTCN_error("SocketCAN: CAN J1939 is compiled for your current kernel error");
#endif // CANJ1939_SUPPORT
				break;
				default:
				TTCN_error(
						"connectu union selection does not exist on socket %d: \n",
						sock);
				break;
			}

		} 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 =	{};

	addr.can_family = AF_CAN;
	addr.can_addr.j1939.addr = J1939_NO_ADDR;
	addr.can_addr.j1939.name = J1939_NO_NAME;
	addr.can_addr.j1939.pgn = J1939_NO_PGN;

	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)
				|| ((sock_list[cn].protocol_family
						== SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_PROTOCOL_CAN_J1939)
						&& (sock_list[cn].j1939_bound == false))) {

			SocketCAN__PortType::SocketCAN__PT_PROVIDER::socket_protocol_family_enum protocol_family;
			bool j1939_bound = false;

			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));
				addr.can_ifindex = bindu.raw().if__index();
				protocol_family =
						SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_PROTOCOL_CAN_RAW;
			}
				break;
			case SocketCAN__Types::SocketCAN__bindu::ALT_isotp:
				addr.can_ifindex = 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;
			case SocketCAN__Types::SocketCAN__bindu::ALT_j1939:
#ifdef  CANJ1939_SUPPORT
				addr.can_ifindex = bindu.j1939().if__index();
				if (bindu.j1939().j1939__source().addr().is_present()) {
					const OPTIONAL<J1939::J1939__ADDR> &addr_ =
							bindu.j1939().j1939__source().addr();
					addr.can_addr.j1939.addr = oct2int(addr_);
				}
				if (bindu.j1939().j1939__source().name().is_present()) {
					const OPTIONAL<J1939::J1939__NAME> &name =
							bindu.j1939().j1939__source().name();
					addr.can_addr.j1939.name = (__u64) oct2int(name).get_long_long_val();
				}
				if (bindu.j1939().j1939__source().pgn().is_present()) {
					const OPTIONAL<J1939::J1939__PGN>& pgn =
					bindu.j1939().j1939__source().pgn();
					addr.can_addr.j1939.pgn = oct2int(pgn);
				}

				log("SocketCAN: Binding socket J1939 to addr %x, name %llx, pgn %x",
						addr.can_addr.j1939.addr, addr.can_addr.j1939.name, addr.can_addr.j1939.pgn);

				j1939_bound=true;
				protocol_family =
				SocketCAN__PortType::SocketCAN__PT_PROVIDER::SOCKET_PROTOCOL_CAN_J1939;
#else // CANJ1939_SUPPORT
				TTCN_error("SocketCAN: CAN J1939 is not supported by your current kernel error");
#endif // CANJ1939_SUPPORT
				break;
				default:
				TTCN_error(
						"bindu union selection does not exist on socket %d: \n",
						sock);
				break;
			}
			log("Binding socket: %d with index: %d", sock, addr.can_ifindex);
			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;
				sock_list[cn].j1939_bound = j1939_bound;
				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__j1939__send__data &send_par) {
#ifdef  CANJ1939_SUPPORT
	log(
			"entering SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data)");

	SocketCAN__Types::SocketCAN__j1939__send__data__result result;
	int sock;
	int cn = send_par.id();

	if ((cn < sock_list_length)) {
		long nrOfBytesSent, nrOfBytestoSend, nrOfBytesRemaining;
		sock = sock_list[cn].fd;

		log("SocketCAN: Sending J1939 message)");
		//logOctet("containing data: ", send_par.pdu());

		nrOfBytestoSend = send_par.pdu().lengthof();
		nrOfBytesRemaining = nrOfBytestoSend;
		do {
			nrOfBytesSent = send(sock, (const void*)((const unsigned char*)send_par.pdu()+nrOfBytestoSend-nrOfBytesRemaining), nrOfBytesRemaining, 0);
			nrOfBytesRemaining = nrOfBytesRemaining - nrOfBytesSent;
		} while ((nrOfBytesSent >= 0) and (nrOfBytesRemaining != 0));

		log("Sent J1939 message with send of size %d", nrOfBytesSent);
		if (nrOfBytesSent < 0) {
			log("Sent J1939 message with pdu of size %d failed", nrOfBytesSent);
			TTCN_error(
					"SocketCAN j1939 send with send() error while trying to send J1939 message of %ld 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 J1939 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;
		}

		log("SocketCAN: Nr of bytes sent = %ld", nrOfBytesSent);
	} 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__j1939__send__data)");
#else // CANJ1939_SUPPORT
	TTCN_error("SocketCAN: CAN J1939 is not supported by your current kernel error");
#endif // CANJ1939_SUPPORT
}

void SocketCAN__PT_PROVIDER::outgoing_send(
		const SocketCAN__Types::SocketCAN__j1939__send__data__to &send_par) {
#ifdef  CANJ1939_SUPPORT
	log(
			"entering SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data__to)");

	SocketCAN__Types::SocketCAN__j1939__send__data__to__result result;
	int sock;
	int cn = send_par.id();

	if ((cn < sock_list_length)) {
		struct sockaddr_can destaddr;
		long nrOfBytesSent, nrOfBytestoSend, nrOfBytesRemaining;
		sock = sock_list[cn].fd;

		destaddr.can_ifindex = send_par.if__index();
		destaddr.can_family = AF_CAN;
		destaddr.can_addr.j1939.addr = J1939_NO_ADDR;
		destaddr.can_addr.j1939.name = J1939_NO_NAME;
		destaddr.can_addr.j1939.pgn = J1939_NO_PGN;

		if (send_par.j1939__destination().addr().is_present()) {
			const OPTIONAL<J1939::J1939__ADDR> &addr =
					send_par.j1939__destination().addr();
			destaddr.can_addr.j1939.addr = oct2int(addr);
		}
		if (send_par.j1939__destination().name().is_present()) {
			const OPTIONAL<J1939::J1939__NAME> &name =
					send_par.j1939__destination().name();
			//destaddr.can_addr.j1939.name = oct2int(name);
			destaddr.can_addr.j1939.name = (__u64) oct2int(name).get_long_long_val();
		}
		if (send_par.j1939__destination().pgn().is_present()) {
			const OPTIONAL<J1939::J1939__PGN> &pgn =
					send_par.j1939__destination().pgn();
			destaddr.can_addr.j1939.pgn = oct2int(pgn);
		}

		log("SocketCAN: Sending J1939 message to addr %x, name %llx, pgn %x",
				destaddr.can_addr.j1939.addr, destaddr.can_addr.j1939.name,
				destaddr.can_addr.j1939.pgn);
		//logOctet("containing data: ", send_par.pdu());

		nrOfBytestoSend = send_par.pdu().lengthof();
		nrOfBytesRemaining = nrOfBytestoSend;
		do {
			log("SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data__to):Sending of remaining of bytes %ld", nrOfBytesRemaining);
			nrOfBytesSent = sendto(sock, (const void*)((const unsigned char*)send_par.pdu()+nrOfBytestoSend-nrOfBytesRemaining),
					nrOfBytesRemaining, 0, (struct sockaddr*) &destaddr, sizeof(destaddr));
			nrOfBytesRemaining = nrOfBytesRemaining - nrOfBytesSent;
			log("SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data__to):Sent bytes %d, remaining of bytes %ld", nrOfBytesSent, nrOfBytesRemaining);
		} while ((nrOfBytesSent >= 0) and (nrOfBytesRemaining != 0));

		log(
				"Sent J1939 message with send of size %d to addr %x, name %llx, pgn %x",
				nrOfBytesSent, destaddr.can_addr.j1939.addr,
				destaddr.can_addr.j1939.name, destaddr.can_addr.j1939.pgn);
		if (nrOfBytesSent < 0) {
			log(
					"Sent J1939 message with pdu of size %d  to addr %x, name %llx, pgn %x failed",
					nrOfBytesSent, destaddr.can_addr.j1939.addr,
					destaddr.can_addr.j1939.name, destaddr.can_addr.j1939.pgn);
			result.result().result__code() =
					SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
			result.result().err() = errno;
			result.result().err__text() = "SocketCAN send with send() error";
			TTCN_error(
					"SocketCAN j1939 sendto() error while trying to send J1939 message of %ld bytes  to addr %x, name %llx, pgn %x",
					nrOfBytestoSend, destaddr.can_addr.j1939.addr,
					destaddr.can_addr.j1939.name, destaddr.can_addr.j1939.pgn);
		} else {
			log(
					"SocketCAN send J1939 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;
		}

		log("SocketCAN: Nr of bytes sent = %ld", nrOfBytesSent);
	} else {
		result.result().result__code() =
				SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR;
		result.result().err() = OMIT_VALUE;
		result.result().err__text() = "Unknown socket reference";
		TTCN_error("SocketCAN: Unknown socket reference: %d \n", cn);
	}
	log("Creating incoming message for SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data__to)");
	incoming_message(result);
	log("leaving SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data__to)");
#else // CANJ1939_SUPPORT
	TTCN_error("SocketCAN: CAN J1939 is not supported by your current kernel error");
#endif // CANJ1939_SUPPORT
}

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 loopback 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 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;
		case SocketCAN__Types::SocketCAN__setsockopt__commandu::ALT_j1939__filter: {
#ifdef  CANJ1939_SUPPORT
			std::size_t j1939_filters_size =
					(sizeof(send_par.command().j1939__filter())
							/ sizeof(send_par.command().j1939__filter()[0]));

			struct j1939_filter j1939_filters[j1939_filters_size];

			if (j1939_filters_size == 0) {
				// deactivate filters
				res = setsockopt(sock, SOL_CAN_J1939, SO_J1939_FILTER, NULL, 0);

			} else {
				for (std::size_t i = 0; i < j1939_filters_size; i++) {

					j1939_filters[i].name = J1939_NO_NAME;
					j1939_filters[i].name_mask = J1939_NO_NAME;
					j1939_filters[i].pgn = J1939_NO_PGN;
					j1939_filters[i].pgn_mask = J1939_NO_PGN;
					j1939_filters[i].addr = J1939_NO_ADDR;
					j1939_filters[i].addr_mask = J1939_NO_ADDR;

					if (send_par.command().j1939__filter()[i].name__filter().is_present()) {
						const OPTIONAL<SocketCAN__Types::J1939__NAME__filter> &name_filter =
								send_par.command().j1939__filter()[i].name__filter();
						j1939_filters[i].name = oct2int(name_filter().name());
						j1939_filters[i].name_mask = oct2int(
								name_filter().name__mask());
					}
					if (send_par.command().j1939__filter()[i].pgn__filter().is_present()) {
						const OPTIONAL<SocketCAN__Types::J1939__PGN__filter> &pgn_filter =
								send_par.command().j1939__filter()[i].pgn__filter();
						j1939_filters[i].pgn = oct2int(pgn_filter().pgn());
						j1939_filters[i].pgn_mask = oct2int(
								pgn_filter().pgn__mask());
					}
					if (send_par.command().j1939__filter()[i].addr__filter().is_present()) {
						const OPTIONAL<SocketCAN__Types::J1939__ADDR__filter> &addr_filter =
								send_par.command().j1939__filter()[i].addr__filter();
						j1939_filters[i].addr = oct2int(addr_filter().addr());
						j1939_filters[i].addr_mask = oct2int(
								addr_filter().addr__mask());
					}

					log(
							"Setting filter J1939: addr %x, addr_mask, name %llx, name_mask %llx, pgn %x, pgn_mask %x",
							j1939_filters[i].name, j1939_filters[i].name_mask,
							j1939_filters[i].pgn, j1939_filters[i].pgn_mask,
							j1939_filters[i].addr, j1939_filters[i].addr_mask);

				};
				res = setsockopt(sock, SOL_CAN_J1939, SO_J1939_FILTER,
						&j1939_filters, sizeof(j1939_filters));
			}
			if (res < 0) {
				TTCN_error(
						"SocketCAN  setsockopt j1939_filter 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 j1939_filter failed";

			} else {
				log(
						"SocketCAN: setsockopt j1939_filter 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 // CANJ1939_SUPPORT
			TTCN_error("SocketCAN: CAN J1939 is not supported by your current kernel error");
#endif // CANJ1939_SUPPORT
		}
			break;

		case SocketCAN__Types::SocketCAN__setsockopt__commandu::ALT_j1939__promisc: {
#ifdef  CANJ1939_SUPPORT
			int j1939_promisc = send_par.command().j1939__promisc();
			res = setsockopt(sock, SOL_CAN_J1939, SO_J1939_PROMISC,
					&j1939_promisc, sizeof(j1939_promisc));

			if (res < 0) {
				int myerrno = errno;
				TTCN_error(
						"SocketCAN  setsockopt j1939_promisc 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 j1939_promisc failed";
			} else {
				log(
						"SocketCAN: setsockopt j1939_promisc 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 // CANJ1939_SUPPORT
			TTCN_error("SocketCAN: CAN J1939 is not supported by your current kernel error");
#endif // CANJ1939_SUPPORT
		}
			break;

		case SocketCAN__Types::SocketCAN__setsockopt__commandu::ALT_j1939__prio: {
#ifdef  CANJ1939_SUPPORT
			int j1939_prio = send_par.command().j1939__prio();
			res = setsockopt(sock, SOL_CAN_J1939, SO_J1939_SEND_PRIO,
					&j1939_prio, sizeof(j1939_prio));
			if (res < 0) {
				int myerrno = errno;
				TTCN_error(
						"SocketCAN  setsockopt j1939_prio 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 j1939_prio failed";
			} else {
				log("SocketCAN: setsockopt j1939_prio 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 // CANJ1939_SUPPORT
			TTCN_error("SocketCAN: CAN J1939 is not supported by your current kernel error");
#endif // CANJ1939_SUPPORT
		}
			break;

		case SocketCAN__Types::SocketCAN__setsockopt__commandu::ALT_j1939__broadcast: {
#ifdef  CANJ1939_SUPPORT
			int j1939_broadcast = send_par.command().j1939__broadcast();
			res = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &j1939_broadcast,
					sizeof(j1939_broadcast));
			if (res < 0) {
				int myerrno = errno;
				TTCN_error(
						"SocketCAN  setsockopt j1939_broadcast 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 j1939_broadcast failed";
			} else {
				log(
						"SocketCAN: setsockopt j1939_broadcast 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 // CANJ1939_SUPPORT
			TTCN_error("SocketCAN: CAN J1939 is not supported by your current kernel error");
#endif // CANJ1939_SUPPORT
		}
			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;
	sock_list[send_par.id()].j1939_bound = false;
	sock_list[send_par.id()].j1939_connected = false;
	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;
			sock_list[a].j1939_bound = false;
			sock_list[a].j1939_connected = false;

			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 */

