1130407Sdfr/*-
2130407Sdfr * Copyright (c) 2004 Doug Rabson
3130407Sdfr * All rights reserved.
4130407Sdfr *
5130407Sdfr * Redistribution and use in source and binary forms, with or without
6130407Sdfr * modification, are permitted provided that the following conditions
7130407Sdfr * are met:
8130407Sdfr * 1. Redistributions of source code must retain the above copyright
9130407Sdfr *    notice, this list of conditions and the following disclaimer.
10130407Sdfr * 2. Redistributions in binary form must reproduce the above copyright
11130407Sdfr *    notice, this list of conditions and the following disclaimer in the
12130407Sdfr *    documentation and/or other materials provided with the distribution.
13130407Sdfr *
14130407Sdfr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15130407Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16130407Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17130407Sdfr * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18130407Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19130407Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20130407Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21130407Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22130407Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23130407Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24130407Sdfr * SUCH DAMAGE.
25130407Sdfr *
26130407Sdfr *	$FreeBSD$
27130407Sdfr */
28130407Sdfr
29130407Sdfr#ifndef _NET_FIREWIRE_H_
30130407Sdfr#define _NET_FIREWIRE_H_
31130407Sdfr
32130407Sdfr#define FW_ENCAP_UNFRAG		0
33130407Sdfr#define FW_ENCAP_FIRST		1
34130407Sdfr#define FW_ENCAP_LAST		2
35130407Sdfr#define FW_ENCAP_NEXT		3
36130407Sdfr
37130407Sdfrunion fw_encap {
38130407Sdfr		uint32_t ul[2];
39130407Sdfr		struct {
40130407Sdfr#if BYTE_ORDER == BIG_ENDIAN
41130407Sdfr			uint32_t lf		:2;
42130407Sdfr			uint32_t reserved	:14;
43130407Sdfr			uint32_t ether_type	:16;
44130407Sdfr#else
45130407Sdfr			uint32_t ether_type	:16;
46130407Sdfr			uint32_t reserved	:14;
47130407Sdfr			uint32_t lf		:2;
48130407Sdfr#endif
49130407Sdfr		} unfrag;
50130407Sdfr		struct {
51130407Sdfr#if BYTE_ORDER == BIG_ENDIAN
52130407Sdfr			uint32_t lf		:2;
53130407Sdfr			uint32_t reserved1	:2;
54130456Sdfr			uint32_t datagram_size	:12;
55130407Sdfr			uint32_t ether_type	:16;
56130407Sdfr			uint32_t dgl		:16;
57130407Sdfr			uint32_t reserved2	:16;
58130407Sdfr#else
59130407Sdfr			uint32_t ether_type	:16;
60130407Sdfr			uint32_t datagram_size	:12;
61130407Sdfr			uint32_t reserved1	:2;
62130407Sdfr			uint32_t lf		:2;
63130407Sdfr			uint32_t reserved2	:16;
64130407Sdfr			uint32_t dgl		:16;
65130407Sdfr#endif
66130407Sdfr		} firstfrag;
67130407Sdfr		struct {
68130407Sdfr#if BYTE_ORDER == BIG_ENDIAN
69130407Sdfr			uint32_t lf		:2;
70130407Sdfr			uint32_t reserved1	:2;
71130456Sdfr			uint32_t datagram_size	:12;
72130407Sdfr			uint32_t reserved2	:4;
73130407Sdfr			uint32_t fragment_offset :12;
74130407Sdfr			uint32_t dgl		:16;
75130407Sdfr			uint32_t reserved3	:16;
76130407Sdfr#else
77130407Sdfr			uint32_t fragment_offset :12;
78130407Sdfr			uint32_t reserved2	:4;
79130407Sdfr			uint32_t datagram_size	:12;
80130407Sdfr			uint32_t reserved1	:2;
81130407Sdfr			uint32_t lf		:2;
82130407Sdfr			uint32_t reserved3	:16;
83130407Sdfr			uint32_t dgl		:16;
84130407Sdfr#endif
85130407Sdfr		} nextfrag;
86130407Sdfr};
87130407Sdfr
88130407Sdfr#define MTAG_FIREWIRE			1394
89130407Sdfr#define MTAG_FIREWIRE_HWADDR		0
90130407Sdfr#define MTAG_FIREWIRE_SENDER_EUID	1
91130407Sdfr
92130407Sdfrstruct fw_hwaddr {
93130407Sdfr	uint32_t		sender_unique_ID_hi;
94130407Sdfr	uint32_t		sender_unique_ID_lo;
95130407Sdfr	uint8_t			sender_max_rec;
96130407Sdfr	uint8_t			sspd;
97130407Sdfr	uint16_t		sender_unicast_FIFO_hi;
98130407Sdfr	uint32_t		sender_unicast_FIFO_lo;
99130407Sdfr};
100130407Sdfr
101130407Sdfr/*
102130407Sdfr * BPF wants to see one of these.
103130407Sdfr */
104130407Sdfrstruct fw_bpfhdr {
105130407Sdfr	uint8_t			firewire_dhost[8];
106130407Sdfr	uint8_t			firewire_shost[8];
107130407Sdfr	uint16_t		firewire_type;
108130407Sdfr};
109130407Sdfr
110130407Sdfr#ifdef _KERNEL
111130407Sdfr
112130407Sdfr/*
113130407Sdfr * A structure to track the reassembly of a link-level fragmented
114130407Sdfr * datagram.
115130407Sdfr */
116130407Sdfrstruct fw_reass {
117130407Sdfr	STAILQ_ENTRY(fw_reass)	fr_link;
118130407Sdfr	uint32_t		fr_id;		/* host+dgl */
119130407Sdfr	struct mbuf		*fr_frags;	/* chain of frags */
120130407Sdfr};
121130407SdfrSTAILQ_HEAD(fw_reass_list, fw_reass);
122130407Sdfr
123130407Sdfrstruct fw_com {
124147256Sbrooks	struct ifnet		*fc_ifp;
125130407Sdfr	struct fw_hwaddr	fc_hwaddr;
126130407Sdfr	struct firewire_comm	*fc_fc;
127130407Sdfr	uint8_t			fc_broadcast_channel;
128130407Sdfr	uint8_t			fc_speed;	/* our speed */
129130407Sdfr	uint16_t		fc_node;	/* our nodeid */
130130407Sdfr	struct fw_reass_list	fc_frags;	/* partial datagrams */
131130407Sdfr};
132147256Sbrooks#define	IFP2FWC(ifp)	((struct fw_com *)(ifp)->if_l2com)
133130407Sdfr
134130407Sdfrextern	void	firewire_input(struct ifnet *ifp, struct mbuf *m, uint16_t src);
135130407Sdfrextern	void	firewire_ifattach(struct ifnet *, struct fw_hwaddr *);
136130407Sdfrextern	void	firewire_ifdetach(struct ifnet *);
137130407Sdfrextern	void	firewire_busreset(struct ifnet *);
138194581Srdivackyextern	int	firewire_ioctl(struct ifnet *, u_long, caddr_t);
139130407Sdfr
140130407Sdfr#endif /* !_KERNEL */
141130407Sdfr
142130407Sdfr#endif /* !_NET_FIREWIRE_H_ */
143