at_proto.c revision 1.14 1 1.14 dyoung /* $NetBSD: at_proto.c,v 1.14 2007/05/06 02:56:37 dyoung Exp $ */
2 1.1 christos
3 1.1 christos /*
4 1.1 christos * Copyright (c) 1990,1991 Regents of The University of Michigan.
5 1.1 christos * All Rights Reserved.
6 1.1 christos *
7 1.1 christos * Permission to use, copy, modify, and distribute this software and
8 1.1 christos * its documentation for any purpose and without fee is hereby granted,
9 1.1 christos * provided that the above copyright notice appears in all copies and
10 1.1 christos * that both that copyright notice and this permission notice appear
11 1.1 christos * in supporting documentation, and that the name of The University
12 1.1 christos * of Michigan not be used in advertising or publicity pertaining to
13 1.1 christos * distribution of the software without specific, written prior
14 1.1 christos * permission. This software is supplied as is without expressed or
15 1.1 christos * implied warranties of any kind.
16 1.1 christos *
17 1.1 christos * This product includes software developed by the University of
18 1.1 christos * California, Berkeley and its contributors.
19 1.1 christos *
20 1.1 christos * Research Systems Unix Group
21 1.1 christos * The University of Michigan
22 1.1 christos * c/o Wesley Craig
23 1.1 christos * 535 W. William Street
24 1.1 christos * Ann Arbor, Michigan
25 1.1 christos * +1-313-764-2278
26 1.1 christos * netatalk (at) umich.edu
27 1.1 christos */
28 1.3 lukem
29 1.3 lukem #include <sys/cdefs.h>
30 1.14 dyoung __KERNEL_RCSID(0, "$NetBSD: at_proto.c,v 1.14 2007/05/06 02:56:37 dyoung Exp $");
31 1.1 christos
32 1.1 christos #include <sys/param.h>
33 1.1 christos #include <sys/systm.h>
34 1.1 christos #include <sys/protosw.h>
35 1.1 christos #include <sys/domain.h>
36 1.1 christos #include <sys/socket.h>
37 1.1 christos
38 1.1 christos #include <sys/kernel.h>
39 1.1 christos #include <net/if.h>
40 1.1 christos #include <net/radix.h>
41 1.1 christos #include <net/if_ether.h>
42 1.1 christos #include <netinet/in.h>
43 1.1 christos #include <net/route.h>
44 1.1 christos
45 1.1 christos #include <netatalk/at.h>
46 1.1 christos #include <netatalk/ddp.h>
47 1.1 christos #include <netatalk/at_var.h>
48 1.1 christos #include <netatalk/ddp_var.h>
49 1.1 christos #include <netatalk/at_extern.h>
50 1.1 christos
51 1.6 matt DOMAIN_DEFINE(atalkdomain); /* forward declare and add to link set */
52 1.1 christos
53 1.5 matt const struct protosw atalksw[] = {
54 1.1 christos {
55 1.12 matt .pr_type = SOCK_DGRAM,
56 1.12 matt .pr_domain = &atalkdomain,
57 1.12 matt .pr_protocol = ATPROTO_DDP,
58 1.12 matt .pr_flags = PR_ATOMIC|PR_ADDR,
59 1.12 matt .pr_output = ddp_output,
60 1.12 matt .pr_usrreq = ddp_usrreq,
61 1.12 matt .pr_init = ddp_init,
62 1.1 christos },
63 1.1 christos };
64 1.1 christos
65 1.13 dyoung POOL_INIT(sockaddr_at_pool, sizeof(struct sockaddr_at), 0, 0, 0,
66 1.13 dyoung "sockaddr_at_pool", NULL, IPL_NET);
67 1.13 dyoung
68 1.12 matt struct domain atalkdomain = {
69 1.11 dyoung .dom_family = PF_APPLETALK,
70 1.11 dyoung .dom_name = "appletalk",
71 1.11 dyoung .dom_init = NULL,
72 1.11 dyoung .dom_externalize = NULL,
73 1.11 dyoung .dom_dispose = NULL,
74 1.11 dyoung .dom_protosw = atalksw,
75 1.13 dyoung .dom_protoswNPROTOSW = &atalksw[__arraycount(atalksw)],
76 1.11 dyoung .dom_rtattach = rn_inithead,
77 1.11 dyoung .dom_rtoffset = 32,
78 1.11 dyoung .dom_maxrtkey = sizeof(struct sockaddr_at),
79 1.11 dyoung .dom_ifattach = NULL,
80 1.11 dyoung .dom_ifdetach = NULL,
81 1.11 dyoung .dom_ifqueues = { &atintrq1, &atintrq2 },
82 1.11 dyoung .dom_link = { NULL },
83 1.11 dyoung .dom_mowner = MOWNER_INIT("",""),
84 1.13 dyoung .dom_sa_pool = &sockaddr_at_pool,
85 1.13 dyoung .dom_sa_len = sizeof(struct sockaddr_at),
86 1.14 dyoung .dom_sa_cmpofs = offsetof(struct sockaddr_at, sat_addr),
87 1.14 dyoung .dom_sa_cmplen = sizeof(struct at_addr),
88 1.14 dyoung .dom_rtcache = LIST_HEAD_INITIALIZER(atalkdomain.dom_rtcache)
89 1.1 christos };
90 1.13 dyoung
91 1.13 dyoung int
92 1.13 dyoung sockaddr_at_cmp(const struct sockaddr *sa1, const struct sockaddr *sa2)
93 1.13 dyoung {
94 1.13 dyoung int rc;
95 1.13 dyoung uint_fast8_t len;
96 1.13 dyoung const uint_fast8_t addrofs = offsetof(struct sockaddr_at, sat_addr),
97 1.13 dyoung addrend = addrofs + sizeof(struct at_addr);
98 1.13 dyoung const struct sockaddr_at *sat1, *sat2;
99 1.13 dyoung
100 1.13 dyoung sat1 = satocsat(sa1);
101 1.13 dyoung sat2 = satocsat(sa2);
102 1.13 dyoung
103 1.13 dyoung len = MIN(addrend, MIN(sat1->sat_len, sat2->sat_len));
104 1.13 dyoung
105 1.13 dyoung if (len > addrofs &&
106 1.13 dyoung (rc = memcmp(&sat1->sat_addr, &sat2->sat_addr, len - addrofs)) != 0)
107 1.13 dyoung return rc;
108 1.13 dyoung
109 1.13 dyoung return sat1->sat_len - sat2->sat_len;
110 1.13 dyoung }
111