History log of /src/sys/netatalk/ddp_input.c |
Revision | | Date | Author | Comments |
1.34 |
| 30-Mar-2023 |
riastradh | atalk(4): Don't abuse queue(9) internals.
|
1.33 |
| 03-Sep-2022 |
thorpej | branches: 1.33.4; Garbage-collect the remaining vestiges of netisr.
|
1.32 |
| 03-Sep-2022 |
thorpej | Convert NETATALK from a legacy netisr to pktqueue.
|
1.31 |
| 21-Mar-2018 |
roy | Sprinkle more soroverflow().
|
1.30 |
| 17-Feb-2018 |
rjs | branches: 1.30.2; Add NETATALKDEBUG to the option header and include that in the main source files.
|
1.29 |
| 08-Dec-2016 |
ozaki-r | branches: 1.29.8; Add rtcache_unref to release points of rtentry stemming from rtcache
In the MP-safe world, a rtentry stemming from a rtcache can be freed at any points. So we need to protect rtentries somehow say by reference couting or passive references. Regardless of the method, we need to call some release function of a rtentry after using it.
The change adds a new function rtcache_unref to release a rtentry. At this point, this function does nothing because for now we don't add a reference to a rtentry when we get one from a rtcache. We will add something useful in a further commit.
This change is a part of changes for MP-safe routing table. It is separated to avoid one big change that makes difficult to debug by bisecting.
|
1.28 |
| 03-Oct-2016 |
ozaki-r | Fix race condition on ifqueue used by traditional netisr
If a underlying network device driver supports MSI/MSI-X, RX interrupts can be delivered to arbitrary CPUs. This means that Layer 2 subroutines such as ether_input (softint) and subsequent Layer 3 subroutines (softint) which are called via traditional netisr can be dispatched on an arbitrary CPU. Layer 2 subroutines now run without any locks (expected) and so a Layer 2 subroutine and a Layer 3 subroutine can run in parallel.
There is a shared data between a Layer 2 routine and a Layer 3 routine, that is ifqueue and IF_ENQUEUE (from L2) and IF_DEQUEUE (from L3) on it are racy now.
To fix the race condition, use ifqueue#ifq_lock to protect ifqueue instead of splnet that is meaningless now.
The same race condition exists in route_intr. Fix it as well.
Reviewed by knakahara@
|
1.27 |
| 10-Jun-2016 |
ozaki-r | branches: 1.27.2; Avoid storing a pointer of an interface in a mbuf
Having a pointer of an interface in a mbuf isn't safe if we remove big kernel locks; an interface object (ifnet) can be destroyed anytime in any packet processing and accessing such object via a pointer is racy. Instead we have to get an object from the interface collection (ifindex2ifnet) via an interface index (if_index) that is stored to a mbuf instead of an pointer.
The change provides two APIs: m_{get,put}_rcvif_psref that use psref(9) for sleep-able critical sections and m_{get,put}_rcvif that use pserialize(9) for other critical sections. The change also adds another API called m_get_rcvif_NOMPSAFE, that is NOT MP-safe and for transition moratorium, i.e., it is intended to be used for places where are not planned to be MP-ified soon.
The change adds some overhead due to psref to performance sensitive paths, however the overhead is not serious, 2% down at worst.
Proposed on tech-kern and tech-net.
|
1.26 |
| 31-Aug-2011 |
plunky | branches: 1.26.12; 1.26.30; NULL does not need a cast
|
1.25 |
| 18-Apr-2009 |
tsutsui | Remove extra whitespace added by a stupid tool. XXX: more in src/sys/arch
|
1.24 |
| 18-Mar-2009 |
cegger | bcopy -> memcpy
|
1.23 |
| 18-Mar-2009 |
cegger | bzero -> memset
|
1.22 |
| 15-Mar-2009 |
cegger | ansify function definitions
|
1.21 |
| 14-Mar-2009 |
dsl | Change about 4500 of the K&R function definitions to ANSI ones. There are still about 1600 left, but they have ',' or /* ... */ in the actual variable definitions - which my awk script doesn't handle. There are also many that need () -> (void). (The script does handle misordered arguments.)
|
1.20 |
| 14-Mar-2009 |
dsl | Remove all the __P() from sys (excluding sys/dist) Diff checked with grep and MK1 eyeball. i386 and amd64 GENERIC and sys still build.
|
1.19 |
| 24-Apr-2008 |
ad | branches: 1.19.2; 1.19.10; 1.19.16; Merge the socket locking patch:
- Socket layer becomes MP safe. - Unix protocols become MP safe. - Allows protocol processing interrupts to safely block on locks. - Fixes a number of race conditions.
With much feedback from matt@ and plunky@.
|
1.18 |
| 23-Apr-2008 |
thorpej | Make DDP stats per-cpu. While here, bump the counters to 64-bit and make them available by sysctl.
|
1.17 |
| 21-Dec-2007 |
dyoung | branches: 1.17.6; 1.17.8; Get the rtentry from forwro in one less step.
|
1.16 |
| 20-Dec-2007 |
dyoung | Poison struct route->ro_rt uses in the kernel by changing the name to _ro_rt. Use rtcache_getrt() to access a route cache's struct rtentry *.
Introduce struct ifnet->if_dl that always points at the interface identifier/link-layer address. Make code that treated the first ifaddr on struct ifnet->if_addrlist as the interface address use if_dl, instead.
Remove stale debugging code from net/route.c. Move the rtflush() code into rtcache_clear() and delete rtflush(). Delete rtalloc(), because nothing uses it any more.
Make ND6_HINT an inline, lowercase subroutine, nd6_hint.
I've done my best to convert IP Filter, the ISO stack, and the AppleTalk stack to rtcache_getrt(). They compile, but I have not tested them. I have given the changes to PF, GRE, IPv4 and IPv6 stacks a lot of exercise.
|
1.15 |
| 02-May-2007 |
dyoung | branches: 1.15.8; 1.15.16; 1.15.20; Eliminate address family-specific route caches (struct route, struct route_in6, struct route_iso), replacing all caches with a struct route.
The principle benefit of this change is that all of the protocol families can benefit from route cache-invalidation, which is necessary for correct routing. Route-cache invalidation fixes an ancient PR, kern/3508, at long last; it fixes various other PRs, also.
Discussions with and ideas from Joerg Sonnenberger influenced this work tremendously. Of course, all design oversights and bugs are mine.
DETAILS
1 I added to each address family a pool of sockaddrs. I have introduced routines for allocating, copying, and duplicating, and freeing sockaddrs:
struct sockaddr *sockaddr_alloc(sa_family_t af, int flags); struct sockaddr *sockaddr_copy(struct sockaddr *dst, const struct sockaddr *src); struct sockaddr *sockaddr_dup(const struct sockaddr *src, int flags); void sockaddr_free(struct sockaddr *sa);
sockaddr_alloc() returns either a sockaddr from the pool belonging to the specified family, or NULL if the pool is exhausted. The returned sockaddr has the right size for that family; sa_family and sa_len fields are initialized to the family and sockaddr length---e.g., sa_family = AF_INET and sa_len = sizeof(struct sockaddr_in). sockaddr_free() puts the given sockaddr back into its family's pool.
sockaddr_dup() and sockaddr_copy() work analogously to strdup() and strcpy(), respectively. sockaddr_copy() KASSERTs that the family of the destination and source sockaddrs are alike.
The 'flags' argumet for sockaddr_alloc() and sockaddr_dup() is passed directly to pool_get(9).
2 I added routines for initializing sockaddrs in each address family, sockaddr_in_init(), sockaddr_in6_init(), sockaddr_iso_init(), etc. They are fairly self-explanatory.
3 structs route_in6 and route_iso are no more. All protocol families use struct route. I have changed the route cache, 'struct route', so that it does not contain storage space for a sockaddr. Instead, struct route points to a sockaddr coming from the pool the sockaddr belongs to. I added a new method to struct route, rtcache_setdst(), for setting the cache destination:
int rtcache_setdst(struct route *, const struct sockaddr *);
rtcache_setdst() returns 0 on success, or ENOMEM if no memory is available to create the sockaddr storage.
It is now possible for rtcache_getdst() to return NULL if, say, rtcache_setdst() failed. I check the return value for NULL everywhere in the kernel.
4 Each routing domain (struct domain) has a list of live route caches, dom_rtcache. rtflushall(sa_family_t af) looks up the domain indicated by 'af', walks the domain's list of route caches and invalidates each one.
|
1.14 |
| 04-Mar-2007 |
christos | branches: 1.14.2; 1.14.4; Kill caddr_t; there will be some MI fallout, but it will be fixed shortly.
|
1.13 |
| 17-Feb-2007 |
dyoung | KNF: de-__P, bzero -> memset, bcmp -> memcmp. Remove extraneous parentheses in return statements.
Cosmetic: don't open-code TAILQ_FOREACH().
Cosmetic: change types of variables to avoid oodles of casts: in in6_src.c, avoid casts by changing several route_in6 pointers to struct route pointers. Remove unnecessary casts to caddr_t elsewhere.
Pave the way for eliminating address family-specific route caches: soon, struct route will not embed a sockaddr, but it will hold a reference to an external sockaddr, instead. We will set the destination sockaddr using rtcache_setdst(). (I created a stub for it, but it isn't used anywhere, yet.) rtcache_free() will free the sockaddr. I have extracted from rtcache_free() a helper subroutine, rtcache_clear(). rtcache_clear() will "forget" a cached route, but it will not forget the destination by releasing the sockaddr. I use rtcache_clear() instead of rtcache_free() in rtcache_update(), because rtcache_update() is not supposed to forget the destination.
Constify:
1 Introduce const accessor for route->ro_dst, rtcache_getdst().
2 Constify the 'dst' argument to ifnet->if_output(). This led me to constify a lot of code called by output routines.
3 Constify the sockaddr argument to protosw->pr_ctlinput. This led me to constify a lot of code called by ctlinput routines.
4 Introduce const macros for converting from a generic sockaddr to family-specific sockaddrs, e.g., sockaddr_in: satocsin6, satocsin, et cetera.
|
1.12 |
| 15-Dec-2006 |
joerg | branches: 1.12.2; Introduce new helper functions to abstract the route caching. rtcache_init and rtcache_init_noclone lookup ro_dst and store the result in ro_rt, taking care of the reference counting and calling the domain specific route cache. rtcache_free checks if a route was cashed and frees the reference. rtcache_copy copies ro_dst of the given struct route, checking that enough space is available and incrementing the reference count of the cached rtentry if necessary. rtcache_check validates that the cached route is still up. If it isn't, it tries to look it up again. Afterwards ro_rt is either a valid again or NULL. rtcache_copy is used internally.
Adjust to callers of rtalloc/rtflush in the tree to check the sanity of ro_dst first (if necessary). If it doesn't fit the expectations, free the cache, otherwise check if the cached route is still valid. After that combination, a single check for ro_rt == NULL is enough to decide whether a new lookup needs to be done with a different ro_dst. Make the route checking in gre stricter by repeating the loop check after revalidation. Remove some unused RADIX_MPATH code in in6_src.c. The logic is slightly changed here to first validate the route and check RTF_GATEWAY afterwards. This is sementically equivalent though. etherip doesn't need sc_route_expire similiar to the gif changes from dyoung@ earlier.
Based on the earlier patch from dyoung@, reviewed and discussed with him.
|
1.11 |
| 11-Dec-2005 |
christos | branches: 1.11.20; 1.11.22; merge ktrace-lwp.
|
1.10 |
| 17-May-2005 |
christos | branches: 1.10.2; Yes, it was a cool trick >20 years ago to use "0123456789abcdef"[a] to implement, xtoa(), but I think defining the samestring 50 times is a bit too much. Defined HEXDIGITS and hexdigits in subr_prf.c and use it...
|
1.9 |
| 24-Jun-2004 |
jonathan | Rename MBUFTRACE helper function m_claim() to m_claimm(), for consistency with M_FREE() and m_freem(). Affected files:
sys/mbuf.h kern/uipc_socket2.c kern/uipc_mbuf.c net/if_ethersubr.c netatalk/ddp_input.c nfs/nfs_socket.c
|
1.8 |
| 26-Feb-2003 |
matt | branches: 1.8.2; 1.8.4; Update for MBUFTRACE.
|
1.7 |
| 15-Nov-2001 |
lukem | don't need <sys/types.h> when including <sys/param.h>
|
1.6 |
| 13-Nov-2001 |
lukem | add RCSIDs
|
1.5 |
| 13-Apr-2001 |
thorpej | branches: 1.5.2; Remove the use of splimp() from the NetBSD kernel. splnet() and only splnet() is allowed for the protection of data structures used by network devices.
|
1.4 |
| 27-Mar-1999 |
aidan | branches: 1.4.8; 1.4.20; Added per-addr input/output statistics. Currently just support netatalk and netinet, currently only tested under netinet.
Disabled by default, enabled by compiling the kernel with option IFA_STATS. Enabling this feature seems to make the ip_output function take 13% longer than before, which should be OK for people that need this feature.
|
1.3 |
| 10-Jun-1998 |
wrstuden | branches: 1.3.6; Remove two incorrect ntoh's which make a comparison of a constant w/ a value from a packet not work right (only one of them needs ntoh!).
Fixes a bug reported by David Brownlee, and which has been present in NetAtalk from the Sun 4 port (and thus FreeBSD and OpenBSD too).
|
1.2 |
| 02-Apr-1997 |
christos | branches: 1.2.8; move atintr prototype to the header file.
|
1.1 |
| 02-Apr-1997 |
christos | Appletalk networking stack. Code based on netatalk release beta-970220 from toccata.fugue.com. Ported to netbsd by Bill Studenmund. Changes: - KNF - remove endian.h - adapt to the new arp code. - fix small biff's with spl/splx.
|
1.2.8.1 |
| 14-Jul-1998 |
mellon | Pull up 1.3
|
1.3.6.1 |
| 11-Dec-1998 |
kenh | The beginnings of interface detach support. Still some bugs, but mostly works for me.
This work was originally by Bill Studenmund, and cleaned up by me.
|
1.4.20.3 |
| 08-Jan-2002 |
nathanw | Catch up to -current.
|
1.4.20.2 |
| 14-Nov-2001 |
nathanw | Catch up to -current.
|
1.4.20.1 |
| 21-Jun-2001 |
nathanw | Catch up to -current.
|
1.4.8.1 |
| 21-Apr-2001 |
bouyer | Sync with HEAD
|
1.5.2.1 |
| 10-Jan-2002 |
thorpej | Sync kqueue branch with -current.
|
1.8.4.1 |
| 14-Jul-2004 |
tron | Pull up revision 1.9 (requested by jonathan in ticket #648): Rename MBUFTRACE helper function m_claim() to m_claimm(), for consistency with M_FREE() and m_freem(). Affected files: sys/mbuf.h kern/uipc_socket2.c kern/uipc_mbuf.c net/if_ethersubr.c netatalk/ddp_input.c nfs/nfs_socket.c
|
1.8.2.4 |
| 10-Nov-2005 |
skrll | Sync with HEAD. Here we go again...
|
1.8.2.3 |
| 21-Sep-2004 |
skrll | Fix the sync with head I botched.
|
1.8.2.2 |
| 18-Sep-2004 |
skrll | Sync with HEAD.
|
1.8.2.1 |
| 03-Aug-2004 |
skrll | Sync with HEAD
|
1.10.2.4 |
| 21-Jan-2008 |
yamt | sync with head
|
1.10.2.3 |
| 03-Sep-2007 |
yamt | sync with head.
|
1.10.2.2 |
| 26-Feb-2007 |
yamt | sync with head.
|
1.10.2.1 |
| 30-Dec-2006 |
yamt | sync with head.
|
1.11.22.1 |
| 18-Dec-2006 |
yamt | sync with head.
|
1.11.20.1 |
| 12-Jan-2007 |
ad | Sync with head.
|
1.12.2.3 |
| 07-May-2007 |
yamt | sync with head.
|
1.12.2.2 |
| 12-Mar-2007 |
rmind | Sync with HEAD.
|
1.12.2.1 |
| 27-Feb-2007 |
yamt | - sync with head. - move sched_changepri back to kern_synch.c as it doesn't know PPQ anymore.
|
1.14.4.1 |
| 11-Jul-2007 |
mjf | Sync with head.
|
1.14.2.1 |
| 08-Jun-2007 |
ad | Sync with head.
|
1.15.20.1 |
| 02-Jan-2008 |
bouyer | Sync with HEAD
|
1.15.16.1 |
| 26-Dec-2007 |
ad | Sync with head.
|
1.15.8.1 |
| 09-Jan-2008 |
matt | sync with HEAD
|
1.17.8.1 |
| 18-May-2008 |
yamt | sync with head.
|
1.17.6.1 |
| 02-Jun-2008 |
mjf | Sync with HEAD.
|
1.19.16.1 |
| 13-May-2009 |
jym | Sync with HEAD.
Commit is split, to avoid a "too many arguments" protocol error.
|
1.19.10.1 |
| 28-Apr-2009 |
skrll | Sync with HEAD.
|
1.19.2.1 |
| 04-May-2009 |
yamt | sync with head.
|
1.26.30.3 |
| 05-Feb-2017 |
skrll | Sync with HEAD
|
1.26.30.2 |
| 05-Oct-2016 |
skrll | Sync with HEAD
|
1.26.30.1 |
| 09-Jul-2016 |
skrll | Sync with HEAD
|
1.26.12.1 |
| 03-Dec-2017 |
jdolecek | update from HEAD
|
1.27.2.2 |
| 07-Jan-2017 |
pgoyette | Sync with HEAD. (Note that most of these changes are simply $NetBSD$ tag issues.)
|
1.27.2.1 |
| 04-Nov-2016 |
pgoyette | Sync with HEAD
|
1.29.8.1 |
| 09-Apr-2018 |
bouyer | Pull up following revision(s) (requested by roy in ticket #724): tests/net/icmp/t_ping.c: revision 1.19 sys/netinet6/raw_ip6.c: revision 1.166 sys/netinet6/ip6_input.c: revision 1.195 sys/net/raw_usrreq.c: revision 1.59 sys/sys/socketvar.h: revision 1.151 sys/kern/uipc_socket2.c: revision 1.128 tests/lib/libc/sys/t_recvmmsg.c: revision 1.2 lib/libc/sys/recv.2: revision 1.38 sys/net/rtsock.c: revision 1.239 sys/netinet/udp_usrreq.c: revision 1.246 sys/netinet6/icmp6.c: revision 1.224 tests/net/icmp/t_ping.c: revision 1.20 sys/netipsec/keysock.c: revision 1.63 sys/netinet/raw_ip.c: revision 1.172 sys/kern/uipc_socket.c: revision 1.260 tests/net/icmp/t_ping.c: revision 1.22 sys/kern/uipc_socket.c: revision 1.261 tests/net/icmp/t_ping.c: revision 1.23 sys/netinet/ip_mroute.c: revision 1.155 sbin/route/route.c: revision 1.159 sys/netinet6/ip6_mroute.c: revision 1.123 sys/netatalk/ddp_input.c: revision 1.31 sys/netcan/can.c: revision 1.3 sys/kern/uipc_usrreq.c: revision 1.184 sys/netinet6/udp6_usrreq.c: revision 1.138 tests/net/icmp/t_ping.c: revision 1.18 socket: report receive buffer overflows Add soroverflow() which increments the overflow counter, sets so_error to ENOBUFS and wakes the receive socket up. Replace all code that manually increments this counter with soroverflow(). Add soroverflow() to raw_input(). This allows userland to detect route(4) overflows so it can re-sync with the current state. socket: clear error even when peeking The error has already been reported and it's pointless requiring another recv(2) call just to clear it. socket: remove now incorrect comment that so_error is only udp As it can be affected by route(4) sockets which are raw. rtsock: log dropped messages that we cannot report to userland Handle ENOBUFS when receiving messages. Don't send messages if the receiver has died. Sprinkle more soroverflow(). Handle ENOBUFS in recv Handle ENOBUFS in sendto Note value received. Harden another sendto for ENOBUFS. Handle the routing socket overflowing gracefully. Allow a valid sendto .... duh Handle errors better. Fix test for checking we sent all the data we asked to.
|
1.30.2.1 |
| 22-Mar-2018 |
pgoyette | Synch with HEAD, resolve conflicts
|
1.33.4.1 |
| 31-Jul-2023 |
martin | Pull up following revision(s) (requested by riastradh in ticket #278):
sys/netatalk/ddp_output.c: revision 1.22 sys/compat/common/if_43.c: revision 1.27 sys/netatalk/ddp_input.c: revision 1.34 sys/netatalk/at_control.c: revision 1.43
atalk(4): Don't abuse queue(9) internals.
atalk(4): Omit spurious satosat. The input is already a struct sockaddr_at pointer.
|