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