@@ -35,32 +35,27 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
3535#include <net/socket_can.h>
3636
3737#include "can_native_posix_priv.h"
38+ #include "socket_can_context.h"
3839
3940#define NET_BUF_TIMEOUT K_MSEC(100)
4041
41- struct canbus_np_context {
42- const struct device * can_dev ;
43- struct k_msgq * msgq ;
44- struct net_if * iface ;
45- const char * if_name ;
46-
47- int dev_fd ;
48- struct can_frame frame ;
49- };
50-
51- static int read_data (struct canbus_np_context * ctx , int fd )
42+ static int read_data (struct socket_can_context * ctx , int fd )
5243{
5344 struct net_pkt * pkt ;
5445 int count ;
5546
56- count = canbus_np_read_data (fd , (void * )(& ctx -> frame ),
57- sizeof (ctx -> frame ));
47+ struct can_frame frame ;
48+
49+ count = canbus_np_read_data (fd , (void * )(& frame ), sizeof (frame ));
50+
5851 if (count <= 0 ) {
5952 return 0 ;
6053 }
6154
6255 struct zcan_frame zframe ;
63- can_copy_frame_to_zframe (& ctx -> frame , & zframe );
56+
57+ can_copy_frame_to_zframe (& frame , & zframe );
58+
6459 pkt = net_pkt_rx_alloc_with_buffer (ctx -> iface , sizeof (zframe ), AF_CAN ,
6560 0 , NET_BUF_TIMEOUT );
6661 if (!pkt ) {
@@ -79,7 +74,7 @@ static int read_data(struct canbus_np_context *ctx, int fd)
7974 return 0 ;
8075}
8176
82- static void canbus_np_rx (struct canbus_np_context * ctx )
77+ static void canbus_np_rx (struct socket_can_context * ctx )
8378{
8479 LOG_DBG ("Starting ZCAN RX thread" );
8580
@@ -98,7 +93,7 @@ static int canbus_np_send(const struct device *dev,
9893 const struct zcan_frame * msg , k_timeout_t timeout ,
9994 can_tx_callback_t callback_isr , void * callback_arg )
10095{
101- struct canbus_np_context * ctx = dev -> data ;
96+ struct socket_can_context * ctx = dev -> data ;
10297 int ret = - ENODEV ;
10398
10499 ARG_UNUSED (timeout );
@@ -161,15 +156,15 @@ static const struct can_driver_api can_api_funcs = {
161156 .register_state_change_isr = canbus_np_register_state_change_isr
162157};
163158
164- #ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLE
159+ #ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLED
165160K_KERNEL_STACK_DEFINE (canbus_rx_stack1 ,
166161 CONFIG_ARCH_POSIX_RECOMMENDED_STACK_SIZE );
167162static struct k_thread rx_thread_data1 ;
168- static struct canbus_np_context canbus_context_data1 ;
163+ static struct socket_can_context canbus_context_data1 ;
169164
170165static int canbus_np1_init (const struct device * dev )
171166{
172- struct canbus_np_context * ctx = dev -> data ;
167+ struct socket_can_context * ctx = dev -> data ;
173168
174169 ctx -> if_name = CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_NAME ;
175170
@@ -181,7 +176,7 @@ static int canbus_np1_init(const struct device *dev)
181176 k_thread_create (& rx_thread_data1 , canbus_rx_stack1 ,
182177 K_THREAD_STACK_SIZEOF (canbus_rx_stack1 ),
183178 (k_thread_entry_t )canbus_np_rx , ctx , NULL , NULL ,
184- K_PRIO_COOP (14 ), 0 , K_NO_WAIT );
179+ K_PRIO_PREEMPT (14 ), 0 , K_NO_WAIT );
185180 }
186181
187182 return 0 ;
@@ -191,17 +186,17 @@ DEVICE_DT_INST_DEFINE(0, &canbus_np1_init, NULL,
191186 (void * )& canbus_context_data1 , NULL ,
192187 POST_KERNEL , CONFIG_KERNEL_INIT_PRIORITY_DEVICE ,
193188 & can_api_funcs );
194- #endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLE */
189+ #endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLED */
195190
196- #ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLE
191+ #ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLED
197192K_KERNEL_STACK_DEFINE (canbus_rx_stack2 ,
198193 CONFIG_ARCH_POSIX_RECOMMENDED_STACK_SIZE );
199194static struct k_thread rx_thread_data2 ;
200- static struct canbus_np_context canbus_context_data2 ;
195+ static struct socket_can_context canbus_context_data2 ;
201196
202197static int canbus_np2_init (const struct device * dev )
203198{
204- struct canbus_np_context * ctx = dev -> data ;
199+ struct socket_can_context * ctx = dev -> data ;
205200
206201 ctx -> if_name = CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_NAME ;
207202
@@ -213,7 +208,7 @@ static int canbus_np2_init(const struct device *dev)
213208 k_thread_create (& rx_thread_data2 , canbus_rx_stack2 ,
214209 K_THREAD_STACK_SIZEOF (canbus_rx_stack2 ),
215210 (k_thread_entry_t )canbus_np_rx , ctx , NULL , NULL ,
216- K_PRIO_COOP (14 ), 0 , K_NO_WAIT );
211+ K_PRIO_PREEMPT (14 ), 0 , K_NO_WAIT );
217212 }
218213
219214 return 0 ;
@@ -223,61 +218,20 @@ DEVICE_DT_INST_DEFINE(1, &canbus_np2_init, NULL,
223218 (void * )& canbus_context_data2 , NULL ,
224219 POST_KERNEL , CONFIG_KERNEL_INIT_PRIORITY_DEVICE ,
225220 & can_api_funcs );
226- #endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLE */
221+ #endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLED */
227222
228- #if defined(CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLE ) || \
229- defined(CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLE )
223+ #if defined(CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLED ) || \
224+ defined(CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLED )
230225
231226#if defined(CONFIG_NET_SOCKETS_CAN )
232227
233- #define SEND_TIMEOUT K_MSEC(100)
234- #define BUF_ALLOC_TIMEOUT K_MSEC(50)
228+ #include "socket_can_generic.h"
235229
236- static void socket_can_iface_init (struct net_if * iface )
237- {
238- const struct device * dev = net_if_get_device (iface );
239- struct canbus_np_context * socket_context = dev -> data ;
240-
241- socket_context -> iface = iface ;
242-
243- LOG_DBG ("Init CAN interface %p dev %p" , iface , dev );
244- }
245-
246- static void tx_irq_callback (uint32_t error_flags , void * arg )
247- {
248- if (error_flags ) {
249- LOG_DBG ("Callback! error-code: %d" , error_flags );
250- }
251- }
252-
253- /* This is called by net_if.c when packet is about to be sent */
254- static int socket_can_send (const struct device * dev , struct net_pkt * pkt )
255- {
256- struct canbus_np_context * socket_context = dev -> data ;
257- int ret ;
258-
259- if (net_pkt_family (pkt ) != AF_CAN ) {
260- return - EPFNOSUPPORT ;
261- }
262-
263- ret = can_send (socket_context -> can_dev ,
264- (struct zcan_frame * )pkt -> frags -> data , SEND_TIMEOUT ,
265- tx_irq_callback , NULL );
266- if (ret ) {
267- LOG_DBG ("Cannot send socket CAN msg (%d)" , ret );
268- }
269-
270- /* If something went wrong, then we need to return negative value to
271- * net_if.c:net_if_tx() so that the net_pkt will get released.
272- */
273- return - ret ;
274- }
275-
276- static int socket_can_setsockopt (const struct device * dev , void * obj , int level ,
230+ static int socket_can_np_setsockopt (const struct device * dev , void * obj , int level ,
277231 int optname , const void * optval ,
278232 socklen_t optlen )
279233{
280- struct canbus_np_context * socket_context = dev -> data ;
234+ struct socket_can_context * socket_context = dev -> data ;
281235 struct can_filter filter ;
282236
283237 if (level != SOL_CAN_RAW && optname != CAN_RAW_FILTER ) {
@@ -305,26 +259,24 @@ static int socket_can_setsockopt(const struct device *dev, void *obj, int level,
305259 & filter , sizeof (filter ));
306260}
307261
308- static void socket_can_close (const struct device * dev , int filter_id )
309- {
310- struct canbus_np_context * socket_context = dev -> data ;
311-
312- can_detach (socket_context -> can_dev , filter_id );
313- }
314-
315- static struct canbus_api socket_can_api = {
262+ static struct canbus_api socket_can_np_api = {
316263 .iface_api .init = socket_can_iface_init ,
317264 .send = socket_can_send ,
318265 .close = socket_can_close ,
319- .setsockopt = socket_can_setsockopt ,
266+ .setsockopt = socket_can_np_setsockopt ,
320267};
321268
322- #ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLE
323- // static struct socket_can_context socket_can_context_1;
269+ #ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLED
270+
324271static int socket_can_init_1 (const struct device * dev )
325272{
273+ /* To avoid warning, use socket_can_api defined in socket_can_generic.h.
274+ * For native posix, use socket_can_np_api instead.
275+ */
276+ (void )socket_can_api ;
277+
326278 const struct device * can_dev = DEVICE_DT_INST_GET (0 );
327- struct canbus_np_context * socket_context = dev -> data ;
279+ struct socket_can_context * socket_context = dev -> data ;
328280
329281 LOG_DBG ("Init socket CAN device %p (%s) for dev %p (%s)" , dev ,
330282 dev -> name , can_dev , can_dev -> name );
@@ -338,15 +290,21 @@ NET_DEVICE_INIT_INSTANCE(socket_can_native_posix_1,
338290 CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_SOCKETCAN_NAME , 0 ,
339291 socket_can_init_1 , NULL ,
340292 & canbus_context_data1 , NULL ,
341- CONFIG_KERNEL_INIT_PRIORITY_DEVICE , & socket_can_api ,
293+ CONFIG_KERNEL_INIT_PRIORITY_DEVICE , & socket_can_np_api ,
342294 CANBUS_RAW_L2 , NET_L2_GET_CTX_TYPE (CANBUS_RAW_L2 ), CAN_MTU );
343- #endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLE */
295+ #endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_1_ENABLED */
296+
297+ #ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLED
344298
345- #ifdef CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLE
346299static int socket_can_init_2 (const struct device * dev )
347300{
301+ /* To avoid warning, use socket_can_api defined in socket_can_generic.h.
302+ * For native posix, use socket_can_np_api instead.
303+ */
304+ (void )socket_can_api ;
305+
348306 const struct device * can_dev = DEVICE_DT_INST_GET (1 );
349- struct canbus_np_context * socket_context = dev -> data ;
307+ struct socket_can_context * socket_context = dev -> data ;
350308
351309 LOG_DBG ("Init socket CAN device %p (%s) for dev %p (%s)" , dev ,
352310 dev -> name , can_dev , can_dev -> name );
@@ -360,10 +318,10 @@ NET_DEVICE_INIT_INSTANCE(socket_can_native_posix_2,
360318 CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_SOCKETCAN_NAME , 1 ,
361319 socket_can_init_2 , NULL ,
362320 & canbus_context_data2 , NULL ,
363- CONFIG_KERNEL_INIT_PRIORITY_DEVICE , & socket_can_api ,
321+ CONFIG_KERNEL_INIT_PRIORITY_DEVICE , & socket_can_np_api ,
364322 CANBUS_RAW_L2 , NET_L2_GET_CTX_TYPE (CANBUS_RAW_L2 ), CAN_MTU );
365- #endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLE */
323+ #endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_2_ENABLED */
366324
367325#endif /* CONFIG_NET_SOCKETS_CAN */
368326
369- #endif /* CONFIG_CAN_NATIVE_POSIX_INTERFACE_1 */
327+ #endif /* CAN_NATIVE_POSIX_INTERFACE_1_ENABLED || CAN_NATIVE_POSIX_INTERFACE_2_ENABLED */
0 commit comments