From b68a79ebde37b60fc51a77b4eeddd7ad94e52ca9 Mon Sep 17 00:00:00 2001 From: Oliver Hartkopp Date: Fri, 14 May 2010 12:03:32 +0000 Subject: [PATCH] Added tiny ip server to send ISO 15765-2 PDUs via internetsockets to the CAN bus and vice versa. --- Makefile | 2 +- isotpserver.c | 397 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 398 insertions(+), 1 deletion(-) create mode 100644 isotpserver.c diff --git a/Makefile b/Makefile index cd5af9c..8e6c609 100644 --- a/Makefile +++ b/Makefile @@ -53,7 +53,7 @@ CFLAGS = -O2 -Wall -Wno-parentheses -I$(KERNELDIR)/include \ -DPF_CAN=29 \ -DAF_CAN=PF_CAN -PROGRAMS_ISOTP = isotpdump isotprecv isotpsend isotpsniffer isotptun +PROGRAMS_ISOTP = isotpdump isotprecv isotpsend isotpsniffer isotptun isotpserver PROGRAMS_CANGW = cangw PROGRAMS_SLCAN = slcan_attach slcand PROGRAMS = candump cansniffer cansend canplayer cangen canbusload\ diff --git a/isotpserver.c b/isotpserver.c new file mode 100644 index 0000000..5082d12 --- /dev/null +++ b/isotpserver.c @@ -0,0 +1,397 @@ +/* + * $Id$ + */ + +/* + * isotpserver.c + * + * Implements a socket server which understands ASCII HEX + * messages for simple TCP/IP <-> ISO 15765-2 bridging. + * + * General message format: <[data]+> + * + * e.g. for an eight bytes PDU + * + * <1122334455667788> + * + * Valid ISO 15625-2 PDUs have a length from 1-4095 bytes. + * + * Authors: + * Andre Naujoks (the socket server stuff) + * Oliver Hartkopp (the rest) + * + * Copyright (c) 2002-2010 Volkswagen Group Electronic Research + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Volkswagen nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * Alternatively, provided that this notice is retained in full, this + * software may be distributed under the terms of the GNU General + * Public License ("GPL") version 2, in which case the provisions of the + * GPL apply INSTEAD OF those given above. + * + * The provided data structures and external interfaces from this code + * are not restricted to be used by modules with a GPL compatible license. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * Send feedback to + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define NO_CAN_ID 0xFFFFFFFFU + +int b64hex(char *asc, unsigned char *bin, int len) +{ + int i; + + for (i = 0; i < len; i++) { + if (!sscanf(asc+(i*2), "%2hhx", bin+i)) + return 1; + } + return 0; +} + +void childdied(int i) +{ + wait(NULL); +} + +void print_usage(char *prg) +{ + fprintf(stderr, "\nUsage: %s -l -s -d [options] \n", prg); + fprintf(stderr, "Options: (* = mandatory)\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "ip adressing:\n"); + fprintf(stderr, " * -l (local port for the server)\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "isotp adressing:\n"); + fprintf(stderr, " * -s (source can_id. Use 8 digits for extended IDs)\n"); + fprintf(stderr, " * -d (destination can_id. Use 8 digits for extended IDs)\n"); + fprintf(stderr, " -x (extended addressing mode)\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "padding:\n"); + fprintf(stderr, " -p (set and enable tx padding byte)\n"); + fprintf(stderr, " -r (set and enable rx padding byte)\n"); + fprintf(stderr, " -P (check padding in SF/CF. (l)ength (c)ontent (a)ll)\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "rx path: (config, which is sent to the sender / data source)\n"); + fprintf(stderr, " -b (blocksize. 0 = off)\n"); + fprintf(stderr, " -m (STmin in ms/ns. See spec.)\n"); + fprintf(stderr, " -w (max. wait frame transmissions)\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "tx path: (config, which changes local tx settings)\n"); + fprintf(stderr, " -t