| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: can.c,v 1.8 2019/08/19 03:24:38 ozaki-r Exp $ */ | | 1 | /* $NetBSD: can.c,v 1.9 2020/01/29 05:20:26 thorpej Exp $ */ |
2 | | | 2 | |
3 | /*- | | 3 | /*- |
4 | * Copyright (c) 2003, 2017 The NetBSD Foundation, Inc. | | 4 | * Copyright (c) 2003, 2017 The NetBSD Foundation, Inc. |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * This code is derived from software contributed to The NetBSD Foundation | | 7 | * This code is derived from software contributed to The NetBSD Foundation |
8 | * by Robert Swindells and Manuel Bouyer | | 8 | * by Robert Swindells and Manuel Bouyer |
9 | * | | 9 | * |
10 | * Redistribution and use in source and binary forms, with or without | | 10 | * Redistribution and use in source and binary forms, with or without |
11 | * modification, are permitted provided that the following conditions | | 11 | * modification, are permitted provided that the following conditions |
12 | * are met: | | 12 | * are met: |
13 | * 1. Redistributions of source code must retain the above copyright | | 13 | * 1. Redistributions of source code must retain the above copyright |
14 | * notice, this list of conditions and the following disclaimer. | | 14 | * notice, this list of conditions and the following disclaimer. |
| @@ -20,27 +20,27 @@ | | | @@ -20,27 +20,27 @@ |
20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | | 20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | | 21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | | 22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | | 23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | | 24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | | 25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | | 26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | | 27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | | 28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
29 | * POSSIBILITY OF SUCH DAMAGE. | | 29 | * POSSIBILITY OF SUCH DAMAGE. |
30 | */ | | 30 | */ |
31 | | | 31 | |
32 | #include <sys/cdefs.h> | | 32 | #include <sys/cdefs.h> |
33 | __KERNEL_RCSID(0, "$NetBSD: can.c,v 1.8 2019/08/19 03:24:38 ozaki-r Exp $"); | | 33 | __KERNEL_RCSID(0, "$NetBSD: can.c,v 1.9 2020/01/29 05:20:26 thorpej Exp $"); |
34 | | | 34 | |
35 | #include <sys/param.h> | | 35 | #include <sys/param.h> |
36 | #include <sys/systm.h> | | 36 | #include <sys/systm.h> |
37 | #include <sys/mbuf.h> | | 37 | #include <sys/mbuf.h> |
38 | #include <sys/ioctl.h> | | 38 | #include <sys/ioctl.h> |
39 | #include <sys/domain.h> | | 39 | #include <sys/domain.h> |
40 | #include <sys/protosw.h> | | 40 | #include <sys/protosw.h> |
41 | #include <sys/errno.h> | | 41 | #include <sys/errno.h> |
42 | #include <sys/socket.h> | | 42 | #include <sys/socket.h> |
43 | #include <sys/socketvar.h> | | 43 | #include <sys/socketvar.h> |
44 | #include <sys/proc.h> | | 44 | #include <sys/proc.h> |
45 | #include <sys/kauth.h> | | 45 | #include <sys/kauth.h> |
46 | | | 46 | |
| @@ -239,27 +239,27 @@ can_output(struct mbuf *m, struct canpcb | | | @@ -239,27 +239,27 @@ can_output(struct mbuf *m, struct canpcb |
239 | return EINVAL; | | 239 | return EINVAL; |
240 | } | | 240 | } |
241 | ifp = canp->canp_ifp; | | 241 | ifp = canp->canp_ifp; |
242 | if (ifp == 0) { | | 242 | if (ifp == 0) { |
243 | return EDESTADDRREQ; | | 243 | return EDESTADDRREQ; |
244 | } | | 244 | } |
245 | csc = ifp->if_softc; | | 245 | csc = ifp->if_softc; |
246 | if (csc && (csc->csc_linkmodes & CAN_LINKMODE_LISTENONLY)) { | | 246 | if (csc && (csc->csc_linkmodes & CAN_LINKMODE_LISTENONLY)) { |
247 | return ENETUNREACH; | | 247 | return ENETUNREACH; |
248 | } | | 248 | } |
249 | | | 249 | |
250 | sotag = m_tag_get(PACKET_TAG_SO, sizeof(struct socket *), PR_NOWAIT); | | 250 | sotag = m_tag_get(PACKET_TAG_SO, sizeof(struct socket *), PR_NOWAIT); |
251 | if (sotag == NULL) { | | 251 | if (sotag == NULL) { |
252 | ifp->if_oerrors++; | | 252 | if_statinc(ifp, if_oerrors); |
253 | return ENOMEM; | | 253 | return ENOMEM; |
254 | } | | 254 | } |
255 | mutex_enter(&canp->canp_mtx); | | 255 | mutex_enter(&canp->canp_mtx); |
256 | canp_ref(canp); | | 256 | canp_ref(canp); |
257 | mutex_exit(&canp->canp_mtx); | | 257 | mutex_exit(&canp->canp_mtx); |
258 | *(struct canpcb **)(sotag + 1) = canp; | | 258 | *(struct canpcb **)(sotag + 1) = canp; |
259 | m_tag_prepend(m, sotag); | | 259 | m_tag_prepend(m, sotag); |
260 | | | 260 | |
261 | if (m->m_len <= ifp->if_mtu) { | | 261 | if (m->m_len <= ifp->if_mtu) { |
262 | can_output_cnt++; | | 262 | can_output_cnt++; |
263 | return ifq_enqueue(ifp, m); | | 263 | return ifq_enqueue(ifp, m); |
264 | } else | | 264 | } else |
265 | return EMSGSIZE; | | 265 | return EMSGSIZE; |
| @@ -297,28 +297,27 @@ can_input(struct ifnet *ifp, struct mbuf | | | @@ -297,28 +297,27 @@ can_input(struct ifnet *ifp, struct mbuf |
297 | return; | | 297 | return; |
298 | } | | 298 | } |
299 | | | 299 | |
300 | inq = &canintrq; | | 300 | inq = &canintrq; |
301 | | | 301 | |
302 | IFQ_LOCK(inq); | | 302 | IFQ_LOCK(inq); |
303 | if (IF_QFULL(inq)) { | | 303 | if (IF_QFULL(inq)) { |
304 | IF_DROP(inq); | | 304 | IF_DROP(inq); |
305 | IFQ_UNLOCK(inq); | | 305 | IFQ_UNLOCK(inq); |
306 | m_freem(m); | | 306 | m_freem(m); |
307 | } else { | | 307 | } else { |
308 | IF_ENQUEUE(inq, m); | | 308 | IF_ENQUEUE(inq, m); |
309 | IFQ_UNLOCK(inq); | | 309 | IFQ_UNLOCK(inq); |
310 | ifp->if_ipackets++; | | 310 | if_statadd2(ifp, if_ipackets, 1, if_ibytes, m->m_pkthdr.len); |
311 | ifp->if_ibytes += m->m_pkthdr.len; | | | |
312 | schednetisr(NETISR_CAN); | | 311 | schednetisr(NETISR_CAN); |
313 | } | | 312 | } |
314 | } | | 313 | } |
315 | | | 314 | |
316 | void | | 315 | void |
317 | canintr(void) | | 316 | canintr(void) |
318 | { | | 317 | { |
319 | int rcv_ifindex; | | 318 | int rcv_ifindex; |
320 | struct mbuf *m; | | 319 | struct mbuf *m; |
321 | | | 320 | |
322 | struct sockaddr_can from; | | 321 | struct sockaddr_can from; |
323 | struct canpcb *canp; | | 322 | struct canpcb *canp; |
324 | struct m_tag *sotag; | | 323 | struct m_tag *sotag; |