1 /* $NetBSD: at_proto.c,v 1.15 2007/08/30 02:17:36 dyoung Exp $ */
4 * Copyright (c) 1990,1991 Regents of The University of Michigan.
7 * Permission to use, copy, modify, and distribute this software and
8 * its documentation for any purpose and without fee is hereby granted,
9 * provided that the above copyright notice appears in all copies and
10 * that both that copyright notice and this permission notice appear
11 * in supporting documentation, and that the name of The University
12 * of Michigan not be used in advertising or publicity pertaining to
13 * distribution of the software without specific, written prior
14 * permission. This software is supplied as is without expressed or
15 * implied warranties of any kind.
17 * This product includes software developed by the University of
18 * California, Berkeley and its contributors.
20 * Research Systems Unix Group
21 * The University of Michigan
23 * 535 W. William Street
29 #include <sys/cdefs.h>
30 __KERNEL_RCSID(0, "$NetBSD: at_proto.c,v 1.15 2007/08/30 02:17:36 dyoung Exp $");
32 #include <sys/param.h>
33 #include <sys/systm.h>
34 #include <sys/protosw.h>
35 #include <sys/domain.h>
36 #include <sys/socket.h>
38 #include <sys/kernel.h>
40 #include <net/radix.h>
41 #include <net/if_ether.h>
42 #include <netinet/in.h>
43 #include <net/route.h>
45 #include <netatalk/at.h>
46 #include <netatalk/ddp.h>
47 #include <netatalk/at_var.h>
48 #include <netatalk/ddp_var.h>
49 #include <netatalk/at_extern.h>
51 DOMAIN_DEFINE(atalkdomain
); /* forward declare and add to link set */
53 PR_WRAP_USRREQ(ddp_usrreq
)
54 #define ddp_usrreq ddp_usrreq_wrapper
56 const struct protosw atalksw
[] = {
58 .pr_type
= SOCK_DGRAM
,
59 .pr_domain
= &atalkdomain
,
60 .pr_protocol
= ATPROTO_DDP
,
61 .pr_flags
= PR_ATOMIC
|PR_ADDR
,
62 .pr_output
= ddp_output
,
63 .pr_usrreq
= ddp_usrreq
,
68 struct domain atalkdomain
= {
69 .dom_family
= PF_APPLETALK
,
70 .dom_name
= "appletalk",
72 .dom_externalize
= NULL
,
74 .dom_protosw
= atalksw
,
75 .dom_protoswNPROTOSW
= &atalksw
[__arraycount(atalksw
)],
76 .dom_rtattach
= rn_inithead
,
78 .dom_maxrtkey
= sizeof(struct sockaddr_at
),
81 .dom_ifqueues
= { &atintrq1
, &atintrq2
},
83 .dom_mowner
= MOWNER_INIT("",""),
84 .dom_sa_cmpofs
= offsetof(struct sockaddr_at
, sat_addr
),
85 .dom_sa_cmplen
= sizeof(struct at_addr
),
86 .dom_rtcache
= LIST_HEAD_INITIALIZER(atalkdomain
.dom_rtcache
)
90 sockaddr_at_cmp(const struct sockaddr
*sa1
, const struct sockaddr
*sa2
)
94 const uint_fast8_t addrofs
= offsetof(struct sockaddr_at
, sat_addr
),
95 addrend
= addrofs
+ sizeof(struct at_addr
);
96 const struct sockaddr_at
*sat1
, *sat2
;
101 len
= MIN(addrend
, MIN(sat1
->sat_len
, sat2
->sat_len
));
104 (rc
= memcmp(&sat1
->sat_addr
, &sat2
->sat_addr
, len
- addrofs
)) != 0)
107 return sat1
->sat_len
- sat2
->sat_len
;