]> rtime.felk.cvut.cz Git - socketcan-devel.git/blob - doc/rawsocket.tex
Add modifiers for sampling-point and sjw to can_if start/stop script.
[socketcan-devel.git] / doc / rawsocket.tex
1 % $Id$
2
3 \newpage
4 \section{RAW-Sockets}
5 \label{rawsocket}
6
7 RAW-Sockets erlauben, Nachrichten direkt auf einem CAN-Bus zu
8 senden und alle Nachrichten, die auf einem CAN-Bus übertragen
9 werden, zu lesen. Geöffnet wird ein RAW-Socket durch
10
11 \begin{code}
12 s = socket(PF_CAN, SOCK_RAW, 0);
13 \end{code}
14
15 Der geöffnete Socket muss zunächst mittels \man{bind}{2} an einen CAN-Bus
16 gebunden werden.  Dabei spielen die für Transportprotokolle benötigten
17 Adress-Elemente \verb|tx_id| und \verb|rx_id| in der Struktur
18 \verb|struct sockaddr_can| keine Rolle. Der 
19 folgende Code bindet den geöffneten Socket s an das CAN-Interface
20    \verb|can1|:
21
22 \begin{code}
23 struct sockaddr_can addr;
24 struct ifreq ifr;
25
26 addr.can_family = AF_CAN;
27 strcpy(ifr.ifr_name, "can1");
28 ioctl(s, SIOCGIFINDEX, &ifr);
29 addr.can_ifindex = ifr.ifr_ifindex;
30 bind(s, (struct sockaddr *)&addr, sizeof(addr));
31 \end{code}
32
33 Es können nun mit \man{read}{2} alle auf dem Bus empfangenen CAN-Frames
34 gelesen und mit \man{write}{2} beliebige CAN-Frames gesendet werden.\\
35
36 Die mit \man{read}{2} und \man{write}{2} übertragenen Daten haben die
37 Struktur \verb|struct can_frame|. Jeder zu sendende CAN-Frame muss 
38 mit \emph{einem} Aufruf von \man{write}{2} übergeben werden und
39 empfangene CAN-Frame müssen mit \emph{einem} Aufruf von \man{read}{2}
40 gelesen werden.\\
41
42 Zum gleichzeitigen Empfang von Nachrichten \emph{aller}
43 CAN-Netzwerk-Interfaces (z.B. mit 
44 \man{recvfrom}{2}) ist als Interface-Index Null (im Beispiel:
45 \verb+addr.can_ifindex = 0;+) einzutragen. Das Senden von CAN-Frames
46 über einen solchen RAW-Socket muss dann über \man{sendmsg}{2} erfolgen.\\
47
48 Der RAW-Socket bietet eine einfache Filterfunktion mit der Bereiche
49 von CAN-IDs aus dem Datenstrom ausgefiltert werden können. Dazu kann
50 noch vor dem Aufruf von \man{bind}{2} mit dem Systemaufruf
51 \man{setsockopt}{2} ein Array einfacher Filter gesetzt werden. In diesem
52 Beispiel sollen alle CAN-IDs von 0x200 - 0x2FF durchgelassen werden:
53
54 \begin{code}
55 struct can_filter rfilter;
56
57 rfilter.can_id   = 0x200; /* SFF frame */
58 rfilter.can_mask = 0xF00;
59
60 setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
61 \end{code}
62
63 Der Filter läßt sich mit \verb+rfilter.can_id |= CAN_INV_FILTER;+ auch
64 invertieren, wodurch in diesem Fall die CAN-IDs von 0x200 - 0x2FF
65 nicht durchgelassen werden würden.\\
66
67 \begin{code}
68 struct can_filter rfilter[4];
69
70 rfilter[0].can_id   = 0x80001234;   /* Exactly this EFF frame */
71 rfilter[0].can_mask = CAN_EFF_MASK; /* 0x1FFFFFFFU all bits valid */
72 rfilter[1].can_id   = 0x123;        /* Exactly this SFF frame */
73 rfilter[1].can_mask = CAN_SFF_MASK; /* 0x7FFU all bits valid */
74 rfilter[2].can_id   = 0x200 | CAN_INV_FILTER; /* all, but 0x200-0x2FF */
75 rfilter[2].can_mask = 0xF00;        /* (CAN_INV_FILTER set in can_id) */
76 rfilter[3].can_id   = 0;            /* don't care */
77 rfilter[3].can_mask = 0;            /* ALL frames will pass this filter */
78
79 setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
80 \end{code}
81
82 Für die Anwendung der Filterfunktion muss die Include-Datei \verb+raw.h+
83 eingebunden werden. Eine Veränderung des Filters zur Laufzeit ist über
84 weitere Aufrufe von \man{setsockopt}{2} möglich.
85
86 \newpage
87 \subsection{Testprogramme}
88 \begin{description}
89 \item[candump] ist ein Programm, das über den RAW-Socket CAN-Frames
90 von einem oder mehreren CAN-Device(s) einliest und in lesbarer Form -
91  auf Wunsch mit Zeitstempeln - ausgibt. Die beschriebene
92  Filterfunktion der RAW-Sockets (s.o.) ist über Komandozeilenparameter
93  einstellbar. Ebenso wie eine Ausgabe im bekannten ASC-Format.
94
95 Wird \verb+candump+ ohne Parameter aufgerufen, erscheint ein Hilfetext.
96
97 \begin{code}
98 hartko@pplinux1:~/llcf/src/test > ./candump 
99 Usage: candump [can-interfaces]
100 Options: -m <mask>   (default 0x00000000)
101          -v <value>  (default 0x00000000)
102          -i <0|1>    (inv_filter)
103          -t <type>   (timestamp: Absolute/Delta/Zero)
104          -c          (color mode)
105          -s <level>  (silent mode - 1: animation 2: nothing)
106          -b <can>    (bridge mode - send received frames to <can>)
107          -a          (create ASC compatible output)
108          -1          (increment interface numbering in ASC mode)
109          -A          (enable ASCII output)
110
111 When using more than one CAN interface the options
112 m/v/i have comma seperated values e.g. '-m 0,7FF,0'
113 \end{code}
114
115 {\large Beispiele für die Benutzung von {\tt candump}:}\\
116 \\
117 Einfaches Anzeigen von zwei CAN-Bussen. Timestamps beginnen bei Null.
118
119 \begin{code}
120 hartko@pplinux1:~/llcf/src/test > candump can0 can1 -t z
121 (0.000000) can0  3FC  [1] 05 
122 (0.001185) can0   64  [8] 20 14 3F 16 B8 0B 98 3A 
123 (0.002396) can0   66  [8] 39 00 A1 45 00 00 00 00 
124 (0.015395) can0   C9  [6] 13 01 00 00 10 27 
125 (0.028665) can1  110  [3] 87 00 00 
126 (0.049990) can0  3FC  [1] 05 
127 (0.051176) can0   64  [8] 20 14 3F 16 B8 0B 98 3A 
128 (0.052386) can0   66  [8] 39 00 A1 45 00 00 00 00 
129 (0.065397) can0   C9  [6] 13 01 00 00 10 27 
130 (0.099974) can0  3FC  [1] 05 
131 (0.101159) can0   64  [8] 20 14 3F 16 B8 0B 98 3A 
132 \end{code}
133
134 Einfaches Anzeigen von zwei CAN-Bussen. Timestamps beginnen bei
135 Null. Ausgabe im ASC-Format. Die Kanalnummern werden um 1 erhöht
136 (\verb+can0+ $\Rightarrow$ 1, \verb+can1+ $\Rightarrow$ 2).
137
138 \begin{code}
139 hartko@pplinux1:~/llcf/src/test > candump can0 can1 -t z -a -1
140 date Tue Oct 18 09:39:57 2005
141 base hex  timestamps absolute
142 no internal events logged
143    0.0000 1  3FC             Rx   d 1 05 
144    0.0011 1  64              Rx   d 8 20 14 3F 14 B8 0B 98 3A 
145    0.0023 1  66              Rx   d 8 49 00 A1 45 00 00 00 00 
146    0.0154 1  C9              Rx   d 6 13 01 00 00 10 27 
147    0.0286 2  110             Rx   d 3 87 00 00 
148    0.0500 1  3FC             Rx   d 1 05 
149    0.0512 1  64              Rx   d 8 20 14 3F 14 B8 0B 98 3A 
150    0.0524 1  66              Rx   d 8 49 00 A1 45 00 00 00 00 
151    0.0654 1  C9              Rx   d 6 13 01 00 00 10 27 
152    0.0999 1  3FC             Rx   d 1 05 
153    0.1011 1  64              Rx   d 8 20 14 3F 14 B8 0B 98 3A 
154 \end{code}
155
156 Filtern von Nachrichten auf \verb+can0+ mit Bit-Maske 0x7FC und
157 Vergleichswert 0x66. Zeitstempel mit Differenzzeit.
158
159 \begin{code}
160 hartko@pplinux1:~/llcf/src/test > candump can0 -m 0x7FC -v 0x66 -t d 
161 CAN ID filter[0] for can0 set to mask = 000007FC, value = 00000066 
162 (0.000000) can0   64  [8] 1B 14 3F 21 B8 0B 98 3A 
163 (0.001202) can0   66  [8] B9 DA A0 45 00 00 00 00 
164 (0.048833) can0   64  [8] 1B 14 3F 21 B8 0B 98 3A 
165 (0.001192) can0   66  [8] EB DA A0 45 00 00 00 00 
166 (0.048790) can0   64  [8] 1B 14 3F 21 B8 0B 98 3A 
167 \end{code}
168
169 Filtern von Nachrichten auf \verb+can0+ mit Bit-Maske 0x7FC und
170 Vergleichswert 0x66. Der CAN-Bus \verb+can1+ wird ohne Filterung angegeigt.
171
172 \begin{code}
173 hartko@pplinux1:~/llcf/src/test > candump can0 can1 -m 0x7FC,0 -v 0x66,0 -t d 
174 CAN ID filter[0] for can0 set to mask = 000007FC, value = 00000066 
175 (0.000000) can0   64  [8] 20 14 3F 14 B8 0B 98 3A 
176 (0.001202) can0   66  [8] 48 00 A1 45 00 00 00 00 
177 (0.048794) can0   64  [8] 20 14 3F 14 B8 0B 98 3A 
178 (0.001201) can0   66  [8] 48 00 A1 45 00 00 00 00 
179 (0.026214) can1  110  [3] 87 00 00 
180 (0.003006) can1  41B  [4] 1C 12 02 FF 
181 (0.019612) can0   64  [8] 20 14 3F 14 B8 0B 98 3A 
182 (0.001201) can0   66  [8] 48 00 A1 45 00 00 00 00 
183 (0.048770) can0   64  [8] 20 14 3F 14 B8 0B 98 3A 
184 \end{code}
185
186 Invertiertes Filtern von Nachrichten auf \verb+can0+ mit Bit-Maske 0x7FC und
187 Vergleichswert 0x66. Der CAN-Bus \verb+can1+ wird ohne Filterung
188 angegeigt. Der Timestamp wird absolut ausgegeben, d.h. in Sekunden
189 seit 01.01.1970. Analog \verb-'date +%s'- - siehe \man{date}{1}. 
190
191 \begin{code}
192 hartko@pplinux1:~/llcf/src/test > candump can0 can1 -m 0x7FC,0 -v 0x66,0 -i 1,0 -t a 
193 CAN ID filter[0] for can0 set to mask = 000007FC, value = 00000066 (inv_filter)
194 (1129625880.726372) can0   C9  [6] 13 01 00 00 10 27 
195 (1129625880.739543) can1  110  [3] 87 00 00 
196 (1129625880.760949) can0  3FC  [1] 05 
197 (1129625880.776377) can0   C9  [6] 13 01 00 00 10 27 
198 (1129625880.810983) can0  3FC  [1] 05 
199 (1129625880.811580) can1  41C  [4] 1D 12 02 FF 
200 (1129625880.826379) can0   C9  [6] 13 01 00 00 10 27 
201 (1129625880.839544) can1  110  [3] 87 00 00 
202 (1129625880.860955) can0  3FC  [1] 05 
203 (1129625880.876380) can0   C9  [6] 13 01 00 00 10 27 
204 (1129625880.910986) can0  3FC  [1] 05 
205 \end{code}
206
207 \item[tst-raw] ist ein Programm zum Testen des RAW-Sockets. Es nutzt
208 den \man{read}{2} Systemcall. 
209 \item[tst-raw-filter] ist ein Programm zum Testen der Filterfunktion
210 des RAW-Sockets. Es nutzt den \man{recvfrom}{2} Systemcall.
211 \item[tst-raw-sendto] ist ein Programm zum Senden eines CAN-Frame auf
212 einem nicht an ein besonders Interface gebundenen RAW-Socket mit
213 dem \man{sendto}{2} Systemcall.
214 \item[canecho] ist ein Programm, dass nach dem Empfang eines
215 CAN-Frames dieses mit einer um 1 erhöhten CAN-ID wieder aussendet. Es
216 war für die ersten Versuche mit einem realen CAN-Bus implementiert
217 worden. Seit dem \LL\ V0.6 ist jedoch die lokale Echofunktionalität
218 realisiert, so dass \verb+canecho+ nur noch dazu geeignet ist, einen
219 Volllast-Test auszuführen ...
220 \end{description}