aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation/networking
diff options
context:
space:
mode:
authorOliver Hartkopp <socketcan@hartkopp.net>2013-10-19 06:18:56 -0400
committerMarc Kleine-Budde <mkl@pengutronix.de>2013-10-31 15:45:04 -0400
commit51b2f451b50faa63fa5b32f4b7309878be235095 (patch)
tree668cf6bf08a33ee8d19ac55eb5b3aa118a67c69a /Documentation/networking
parentba4865027c11d7ac8e5a33e0624dd415caab2027 (diff)
can: add broadcast manager documentation
This patch adds documentation about the broadcast manager. It's based on Brian Thorne's initial patch http://marc.info/?l=linux-can&m=138119382015496&w=2 and Daniele Venzano's work http://brownhat.org/docs/socketcan.html . Signed-off-by: Brian Thorne <hardbyte@gmail.com> Cc: Daniele Venzano <linux@brownhat.org> Cc: Andre Naujoks <nautsch2@gmail.com> Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'Documentation/networking')
-rw-r--r--Documentation/networking/can.txt217
1 files changed, 217 insertions, 0 deletions
diff --git a/Documentation/networking/can.txt b/Documentation/networking/can.txt
index 820f55344edc..4c072414eadb 100644
--- a/Documentation/networking/can.txt
+++ b/Documentation/networking/can.txt
@@ -25,6 +25,12 @@ This file contains
25 4.1.5 RAW socket option CAN_RAW_FD_FRAMES 25 4.1.5 RAW socket option CAN_RAW_FD_FRAMES
26 4.1.6 RAW socket returned message flags 26 4.1.6 RAW socket returned message flags
27 4.2 Broadcast Manager protocol sockets (SOCK_DGRAM) 27 4.2 Broadcast Manager protocol sockets (SOCK_DGRAM)
28 4.2.1 Broadcast Manager operations
29 4.2.2 Broadcast Manager message flags
30 4.2.3 Broadcast Manager transmission timers
31 4.2.4 Broadcast Manager message sequence transmission
32 4.2.5 Broadcast Manager receive filter timers
33 4.2.6 Broadcast Manager multiplex message receive filter
28 4.3 connected transport protocols (SOCK_SEQPACKET) 34 4.3 connected transport protocols (SOCK_SEQPACKET)
29 4.4 unconnected transport protocols (SOCK_DGRAM) 35 4.4 unconnected transport protocols (SOCK_DGRAM)
30 36
@@ -593,6 +599,217 @@ solution for a couple of reasons:
593 In order to receive such messages, CAN_RAW_RECV_OWN_MSGS must be set. 599 In order to receive such messages, CAN_RAW_RECV_OWN_MSGS must be set.
594 600
595 4.2 Broadcast Manager protocol sockets (SOCK_DGRAM) 601 4.2 Broadcast Manager protocol sockets (SOCK_DGRAM)
602
603 The Broadcast Manager protocol provides a command based configuration
604 interface to filter and send (e.g. cyclic) CAN messages in kernel space.
605
606 Receive filters can be used to down sample frequent messages; detect events
607 such as message contents changes, packet length changes, and do time-out
608 monitoring of received messages.
609
610 Periodic transmission tasks of CAN frames or a sequence of CAN frames can be
611 created and modified at runtime; both the message content and the two
612 possible transmit intervals can be altered.
613
614 A BCM socket is not intended for sending individual CAN frames using the
615 struct can_frame as known from the CAN_RAW socket. Instead a special BCM
616 configuration message is defined. The basic BCM configuration message used
617 to communicate with the broadcast manager and the available operations are
618 defined in the linux/can/bcm.h include. The BCM message consists of a
619 message header with a command ('opcode') followed by zero or more CAN frames.
620 The broadcast manager sends responses to user space in the same form:
621
622 struct bcm_msg_head {
623 __u32 opcode; /* command */
624 __u32 flags; /* special flags */
625 __u32 count; /* run 'count' times with ival1 */
626 struct timeval ival1, ival2; /* count and subsequent interval */
627 canid_t can_id; /* unique can_id for task */
628 __u32 nframes; /* number of can_frames following */
629 struct can_frame frames[0];
630 };
631
632 The aligned payload 'frames' uses the same basic CAN frame structure defined
633 at the beginning of section 4 and in the include/linux/can.h include. All
634 messages to the broadcast manager from user space have this structure.
635
636 Note a CAN_BCM socket must be connected instead of bound after socket
637 creation (example without error checking):
638
639 int s;
640 struct sockaddr_can addr;
641 struct ifreq ifr;
642
643 s = socket(PF_CAN, SOCK_DGRAM, CAN_BCM);
644
645 strcpy(ifr.ifr_name, "can0");
646 ioctl(s, SIOCGIFINDEX, &ifr);
647
648 addr.can_family = AF_CAN;
649 addr.can_ifindex = ifr.ifr_ifindex;
650
651 connect(s, (struct sockaddr *)&addr, sizeof(addr))
652
653 (..)
654
655 The broadcast manager socket is able to handle any number of in flight
656 transmissions or receive filters concurrently. The different RX/TX jobs are
657 distinguished by the unique can_id in each BCM message. However additional
658 CAN_BCM sockets are recommended to communicate on multiple CAN interfaces.
659 When the broadcast manager socket is bound to 'any' CAN interface (=> the
660 interface index is set to zero) the configured receive filters apply to any
661 CAN interface unless the sendto() syscall is used to overrule the 'any' CAN
662 interface index. When using recvfrom() instead of read() to retrieve BCM
663 socket messages the originating CAN interface is provided in can_ifindex.
664
665 4.2.1 Broadcast Manager operations
666
667 The opcode defines the operation for the broadcast manager to carry out,
668 or details the broadcast managers response to several events, including
669 user requests.
670
671 Transmit Operations (user space to broadcast manager):
672
673 TX_SETUP: Create (cyclic) transmission task.
674
675 TX_DELETE: Remove (cyclic) transmission task, requires only can_id.
676
677 TX_READ: Read properties of (cyclic) transmission task for can_id.
678
679 TX_SEND: Send one CAN frame.
680
681 Transmit Responses (broadcast manager to user space):
682
683 TX_STATUS: Reply to TX_READ request (transmission task configuration).
684
685 TX_EXPIRED: Notification when counter finishes sending at initial interval
686 'ival1'. Requires the TX_COUNTEVT flag to be set at TX_SETUP.
687
688 Receive Operations (user space to broadcast manager):
689
690 RX_SETUP: Create RX content filter subscription.
691
692 RX_DELETE: Remove RX content filter subscription, requires only can_id.
693
694 RX_READ: Read properties of RX content filter subscription for can_id.
695
696 Receive Responses (broadcast manager to user space):
697
698 RX_STATUS: Reply to RX_READ request (filter task configuration).
699
700 RX_TIMEOUT: Cyclic message is detected to be absent (timer ival1 expired).
701
702 RX_CHANGED: BCM message with updated CAN frame (detected content change).
703 Sent on first message received or on receipt of revised CAN messages.
704
705 4.2.2 Broadcast Manager message flags
706
707 When sending a message to the broadcast manager the 'flags' element may
708 contain the following flag definitions which influence the behaviour:
709
710 SETTIMER: Set the values of ival1, ival2 and count
711
712 STARTTIMER: Start the timer with the actual values of ival1, ival2
713 and count. Starting the timer leads simultaneously to emit a CAN frame.
714
715 TX_COUNTEVT: Create the message TX_EXPIRED when count expires
716
717 TX_ANNOUNCE: A change of data by the process is emitted immediately.
718
719 TX_CP_CAN_ID: Copies the can_id from the message header to each
720 subsequent frame in frames. This is intended as usage simplification. For
721 TX tasks the unique can_id from the message header may differ from the
722 can_id(s) stored for transmission in the subsequent struct can_frame(s).
723
724 RX_FILTER_ID: Filter by can_id alone, no frames required (nframes=0).
725
726 RX_CHECK_DLC: A change of the DLC leads to an RX_CHANGED.
727
728 RX_NO_AUTOTIMER: Prevent automatically starting the timeout monitor.
729
730 RX_ANNOUNCE_RESUME: If passed at RX_SETUP and a receive timeout occured, a
731 RX_CHANGED message will be generated when the (cyclic) receive restarts.
732
733 TX_RESET_MULTI_IDX: Reset the index for the multiple frame transmission.
734
735 RX_RTR_FRAME: Send reply for RTR-request (placed in op->frames[0]).
736
737 4.2.3 Broadcast Manager transmission timers
738
739 Periodic transmission configurations may use up to two interval timers.
740 In this case the BCM sends a number of messages ('count') at an interval
741 'ival1', then continuing to send at another given interval 'ival2'. When
742 only one timer is needed 'count' is set to zero and only 'ival2' is used.
743 When SET_TIMER and START_TIMER flag were set the timers are activated.
744 The timer values can be altered at runtime when only SET_TIMER is set.
745
746 4.2.4 Broadcast Manager message sequence transmission
747
748 Up to 256 CAN frames can be transmitted in a sequence in the case of a cyclic
749 TX task configuration. The number of CAN frames is provided in the 'nframes'
750 element of the BCM message head. The defined number of CAN frames are added
751 as array to the TX_SETUP BCM configuration message.
752
753 /* create a struct to set up a sequence of four CAN frames */
754 struct {
755 struct bcm_msg_head msg_head;
756 struct can_frame frame[4];
757 } mytxmsg;
758
759 (..)
760 mytxmsg.nframes = 4;
761 (..)
762
763 write(s, &mytxmsg, sizeof(mytxmsg));
764
765 With every transmission the index in the array of CAN frames is increased
766 and set to zero at index overflow.
767
768 4.2.5 Broadcast Manager receive filter timers
769
770 The timer values ival1 or ival2 may be set to non-zero values at RX_SETUP.
771 When the SET_TIMER flag is set the timers are enabled:
772
773 ival1: Send RX_TIMEOUT when a received message is not received again within
774 the given time. When START_TIMER is set at RX_SETUP the timeout detection
775 is activated directly - even without a former CAN frame reception.
776
777 ival2: Throttle the received message rate down to the value of ival2. This
778 is useful to reduce messages for the application when the signal inside the
779 CAN frame is stateless as state changes within the ival2 periode may get
780 lost.
781
782 4.2.6 Broadcast Manager multiplex message receive filter
783
784 To filter for content changes in multiplex message sequences an array of more
785 than one CAN frames can be passed in a RX_SETUP configuration message. The
786 data bytes of the first CAN frame contain the mask of relevant bits that
787 have to match in the subsequent CAN frames with the received CAN frame.
788 If one of the subsequent CAN frames is matching the bits in that frame data
789 mark the relevant content to be compared with the previous received content.
790 Up to 257 CAN frames (multiplex filter bit mask CAN frame plus 256 CAN
791 filters) can be added as array to the TX_SETUP BCM configuration message.
792
793 /* usually used to clear CAN frame data[] - beware of endian problems! */
794 #define U64_DATA(p) (*(unsigned long long*)(p)->data)
795
796 struct {
797 struct bcm_msg_head msg_head;
798 struct can_frame frame[5];
799 } msg;
800
801 msg.msg_head.opcode = RX_SETUP;
802 msg.msg_head.can_id = 0x42;
803 msg.msg_head.flags = 0;
804 msg.msg_head.nframes = 5;
805 U64_DATA(&msg.frame[0]) = 0xFF00000000000000ULL; /* MUX mask */
806 U64_DATA(&msg.frame[1]) = 0x01000000000000FFULL; /* data mask (MUX 0x01) */
807 U64_DATA(&msg.frame[2]) = 0x0200FFFF000000FFULL; /* data mask (MUX 0x02) */
808 U64_DATA(&msg.frame[3]) = 0x330000FFFFFF0003ULL; /* data mask (MUX 0x33) */
809 U64_DATA(&msg.frame[4]) = 0x4F07FC0FF0000000ULL; /* data mask (MUX 0x4F) */
810
811 write(s, &msg, sizeof(msg));
812
596 4.3 connected transport protocols (SOCK_SEQPACKET) 813 4.3 connected transport protocols (SOCK_SEQPACKET)
597 4.4 unconnected transport protocols (SOCK_DGRAM) 814 4.4 unconnected transport protocols (SOCK_DGRAM)
598 815