diff --git a/Readme.md b/Readme.md index 0331514..a1f4e85 100644 --- a/Readme.md +++ b/Readme.md @@ -66,12 +66,20 @@ will use fragementation, emitting 1+ CAN frames. # Enable j1939 CAN has no protocol id field. -Enabling protocols must be done manually +Actions need to be performed to enable can-j1939 for a network device + +### on socket connect + +Open a socket and bind to a network interface. + +This is the latest method, and preferred for mainline inclusion ### netlink ip link set can0 j1939 on +This method is obsoleted in favor of _on socket connect_. + ### procfs for legacy kernel (2.6.25) This API is dropped for kernels with netlink support! @@ -114,6 +122,11 @@ This API is dropped for kernels with netlink support! ## iproute2 +Older versions of can-j1939 used a modified iproute2 +for manipulating the kernel lists of current addresses. + +This is now obsolete! + ### Static addressing ip addr add j1939 0x80 dev can0 diff --git a/can-j1939-kickstart.md b/can-j1939-kickstart.md index b0b4485..1ec184a 100644 --- a/can-j1939-kickstart.md +++ b/can-j1939-kickstart.md @@ -18,14 +18,11 @@ Create a virtual can0 device and start the device Use [testj1939](testj1939.c) -When *can-j1939* is compiled as module, load it. +When *can-j1939* is compiled as module, opening a socket will load it, +__or__ you can load it manually modprobe can-j1939 -Enable the j1939 protocol stack on the CAN device - - ip link set can0 j1939 on - Most of the subsequent examples will use 2 sockets programs (in 2 terminals). One will use CAN_J1939 sockets using *testj1939*, and the other will use CAN_RAW sockets using cansend+candump. @@ -59,23 +56,12 @@ is not meant for us and *testj1939* does not receive it. ### Use source address +Binding a can-j1939 socket to a source address will register +allow you to send packets. + ./testj1939 can0:0x80 -will say - - ./testj1939: bind(): Cannot assign requested address - -Since J1939 maintains addressing, **0x80** has not yet been assigned -as an address on **can0** . This behaviour is very similar to IP -addressing: you cannot bind to an address that is not your own. - -Now tell the kernel that we *own* address 0x80. -It will be available from now on. - - ip addr add j1939 0x80 dev can0 - ./testj1939 can0:0x80 - -now succeeds. +Your system had, for a small moment, source address 0x80 assigned. ### receive with source address @@ -101,54 +87,30 @@ Open in terminal 1: And to these test in another terminal - ./testj1939 -s can0:0x80 + ./testj1939 -s can0:0x80,0x3ffff This produces **1BFFFF80#0123456789ABCDEF** on CAN. - ./testj1939 -s can0: - -will produce exactly the same because **0x80** is the only -address currently assigned to **can0:** and is used by default. - ### Multiple source addresses on 1 CAN device - ip addr add j1939 0x90 dev can0 - - ./testj1939 -s can0:0x90 + ./testj1939 -s can0:0x90,0x3ffff produces **1BFFFF90#0123456789ABCDEF** , - ./testj1939 -s can0: +### Use PDU1 PGN -still produces **1BFFFF80#0123456789ABCDEF** , since **0x80** -is the default _source address_. -Check - - ip addr show can0 - -emits - - X: can0: mtu 16 qdisc noqueue state UNKNOWN - link/can - can-j1939 0x80 scope link - can-j1939 0x90 scope link - -0x80 is the first address on can0. - -### Use specific PGN - - ./testj1939 -s can0:,0x12345 + ./testj1939 -s can0:0x80,0x12345 emits **1923FF80#0123456789ABCDEF** . Note that the real PGN is **0x12300**, and destination address is **0xff**. -### Emit destination specific packets +### Use destination address info The destination field may be set during sendto(). *testj1939* implements that like this - ./testj1939 -s can0:,0x12345 can0:0x40 + ./testj1939 -s can0:0x80,0x12345 can0:0x40 emits **19234080#0123456789ABCDEF** . @@ -167,13 +129,13 @@ __sendto( *peername* )__ , and only one is used. For broadcasted transmissions - ./testj1939 -s can0:,0x12300 :,0x32100 + ./testj1939 -s can0:0x80,0x12300 :,0x32100 emits **1B21FF80#0123456789ABCDEF** rather than 1923FF80#012345678ABCDEF Desitination specific transmissions - ./testj1939 -s can0:,0x12300 :0x40,0x32100 + ./testj1939 -s can0:0x80,0x12300 :0x40,0x32100 emits **1B214080#0123456789ABCDEF** . @@ -198,6 +160,14 @@ __50ms__ from each other. Destination specific *Transport Protocol* applies flow control and may emit CAN packets much faster. +First assign 0x90 to the local system. +This becomes important because the kernel must interact in the +transport protocol sessions before the complete packet is delivered. + + ./testj1939 can0:0x90 -r & + +Now test: + ./testj1939 -s20 can0:0x80 :0x90,0x12300 emits: