xref: /netbsd-src/external/mpl/dhcp/dist/common/fddi.c (revision f407d9293b6650aa8c33d6a995f797bb6aaefd90)
1 /*	$NetBSD: fddi.c,v 1.3 2022/04/03 01:10:58 christos Exp $	*/
2 
3 /* fddi.c
4 
5    Packet assembly code, originally contributed by Archie Cobbs. */
6 
7 /*
8  * Copyright (C) 2004-2022 Internet Systems Consortium, Inc. ("ISC")
9  * Copyright (c) 1996-2003 by Internet Software Consortium
10  *
11  * This Source Code Form is subject to the terms of the Mozilla Public
12  * License, v. 2.0. If a copy of the MPL was not distributed with this
13  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
16  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
17  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
18  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22  *
23  *   Internet Systems Consortium, Inc.
24  *   PO Box 360
25  *   Newmarket, NH 03857 USA
26  *   <info@isc.org>
27  *   https://www.isc.org/
28  *
29  */
30 
31 #include <sys/cdefs.h>
32 __RCSID("$NetBSD: fddi.c,v 1.3 2022/04/03 01:10:58 christos Exp $");
33 
34 #include "dhcpd.h"
35 
36 #if defined (DEC_FDDI)
37 #include <netinet/if_fddi.h>
38 #include <net/if_llc.h>
39 
40 #if defined (PACKET_ASSEMBLY) || defined (PACKET_DECODING)
41 #include "includes/netinet/if_ether.h"
42 #endif /* PACKET_ASSEMBLY || PACKET_DECODING */
43 
44 #if defined (PACKET_ASSEMBLY)
45 /* Assemble an hardware header... */
46 
assemble_fddi_header(interface,buf,bufix,to)47 void assemble_fddi_header (interface, buf, bufix, to)
48 	struct interface_info *interface;
49 	unsigned char *buf;
50 	unsigned *bufix;
51 	struct hardware *to;
52 {
53 	struct fddi_header   fh;
54 	struct llc     lh;
55 
56 	if (to && to -> hlen == 7)
57 		memcpy (fh.fddi_dhost, &to -> hbuf [1],
58 			sizeof (fh.fddi_dhost));
59 	memcpy (fh.fddi_shost,
60 		&interface -> hw_address.hbuf [1], sizeof (fh.fddi_shost));
61 	fh.fddi_fc = FDDIFC_LLC_ASYNC;
62 	memcpy (&buf [*bufix], &fh, sizeof fh);
63 	*bufix += sizeof fh;
64 
65 	lh.llc_dsap = LLC_SNAP_LSAP;
66 	lh.llc_ssap = LLC_SNAP_LSAP;
67 	lh.llc_un.type_snap.control = LLC_UI;
68 	lh.llc_un.type_snap.ether_type = htons (ETHERTYPE_IP);
69 	memcpy (&buf [*bufix], &lh, LLC_SNAP_LEN);
70 	*bufix += LLC_SNAP_LEN;
71 }
72 #endif /* PACKET_ASSEMBLY */
73 
74 #ifdef PACKET_DECODING
75 /* Decode a hardware header... */
76 
decode_fddi_header(interface,buf,bufix,from)77 ssize_t decode_fddi_header (interface, buf, bufix, from)
78      struct interface_info *interface;
79      unsigned char *buf;
80      unsigned bufix;
81      struct hardware *from;
82 {
83 	struct fddi_header   fh;
84 	struct llc     lh;
85 
86 	from -> hbuf [0] = HTYPE_FDDI;
87 	memcpy (&from -> hbuf [1], fh.fddi_shost, sizeof fh.fddi_shost);
88 	return FDDI_HEADER_SIZE + LLC_SNAP_LEN;
89 }
90 #endif /* PACKET_DECODING */
91 #endif /* DEC_FDDI */
92