diff options
| author | Oliver Hartkopp <socketcan@hartkopp.net> | 2013-10-19 06:18:56 -0400 |
|---|---|---|
| committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2013-10-31 15:45:04 -0400 |
| commit | 51b2f451b50faa63fa5b32f4b7309878be235095 (patch) | |
| tree | 668cf6bf08a33ee8d19ac55eb5b3aa118a67c69a /Documentation/networking | |
| parent | ba4865027c11d7ac8e5a33e0624dd415caab2027 (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.txt | 217 |
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 | ||
