Commit 8dc57da2 authored by David S. Miller's avatar David S. Miller

Merge branch 'ipv6-firewire'

YOSHIFUJI Hideaki says:

====================
This is take 4 of supporting IPv6 over Firewire (IEEE 1394) based on
RFC3146.

Take 3->4:
- Fix receiving 1394 ARP, which comes without arp$tha.
- Remove rfc3146 unit directory on module exit.
- other minor clean-ups - minimize diffs.

====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents b8092861 cb6bf355
...@@ -47,9 +47,9 @@ config FIREWIRE_NET ...@@ -47,9 +47,9 @@ config FIREWIRE_NET
tristate "IP networking over 1394" tristate "IP networking over 1394"
depends on FIREWIRE && INET depends on FIREWIRE && INET
help help
This enables IPv4 over IEEE 1394, providing IP connectivity with This enables IPv4/IPv6 over IEEE 1394, providing IP connectivity
other implementations of RFC 2734 as found on several operating with other implementations of RFC 2734/3146 as found on several
systems. Multicast support is currently limited. operating systems. Multicast support is currently limited.
To compile this driver as a module, say M here: The module will be To compile this driver as a module, say M here: The module will be
called firewire-net. called firewire-net.
......
This diff is collapsed.
...@@ -33,7 +33,15 @@ static inline struct arphdr *arp_hdr(const struct sk_buff *skb) ...@@ -33,7 +33,15 @@ static inline struct arphdr *arp_hdr(const struct sk_buff *skb)
static inline int arp_hdr_len(struct net_device *dev) static inline int arp_hdr_len(struct net_device *dev)
{ {
/* ARP header, plus 2 device addresses, plus 2 IP addresses. */ switch (dev->type) {
return sizeof(struct arphdr) + (dev->addr_len + sizeof(u32)) * 2; #if IS_ENABLED(CONFIG_FIREWIRE_NET)
case ARPHRD_IEEE1394:
/* ARP header, device address and 2 IP addresses */
return sizeof(struct arphdr) + dev->addr_len + sizeof(u32) * 2;
#endif
default:
/* ARP header, plus 2 device addresses, plus 2 IP addresses. */
return sizeof(struct arphdr) + (dev->addr_len + sizeof(u32)) * 2;
}
} }
#endif /* _LINUX_IF_ARP_H */ #endif /* _LINUX_IF_ARP_H */
#ifndef _NET_FIREWIRE_H
#define _NET_FIREWIRE_H
/* Pseudo L2 address */
#define FWNET_ALEN 16
union fwnet_hwaddr {
u8 u[FWNET_ALEN];
/* "Hardware address" defined in RFC2734/RF3146 */
struct {
__be64 uniq_id; /* EUI-64 */
u8 max_rec; /* max packet size */
u8 sspd; /* max speed */
__be16 fifo_hi; /* hi 16bits of FIFO addr */
__be32 fifo_lo; /* lo 32bits of FIFO addr */
} __packed uc;
};
/* Pseudo L2 Header */
#define FWNET_HLEN 18
struct fwnet_header {
u8 h_dest[FWNET_ALEN]; /* destination address */
__be16 h_proto; /* packet type ID field */
} __packed;
#endif
...@@ -654,11 +654,19 @@ struct sk_buff *arp_create(int type, int ptype, __be32 dest_ip, ...@@ -654,11 +654,19 @@ struct sk_buff *arp_create(int type, int ptype, __be32 dest_ip,
arp_ptr += dev->addr_len; arp_ptr += dev->addr_len;
memcpy(arp_ptr, &src_ip, 4); memcpy(arp_ptr, &src_ip, 4);
arp_ptr += 4; arp_ptr += 4;
if (target_hw != NULL)
memcpy(arp_ptr, target_hw, dev->addr_len); switch (dev->type) {
else #if IS_ENABLED(CONFIG_FIREWIRE_NET)
memset(arp_ptr, 0, dev->addr_len); case ARPHRD_IEEE1394:
arp_ptr += dev->addr_len; break;
#endif
default:
if (target_hw != NULL)
memcpy(arp_ptr, target_hw, dev->addr_len);
else
memset(arp_ptr, 0, dev->addr_len);
arp_ptr += dev->addr_len;
}
memcpy(arp_ptr, &dest_ip, 4); memcpy(arp_ptr, &dest_ip, 4);
return skb; return skb;
...@@ -781,7 +789,14 @@ static int arp_process(struct sk_buff *skb) ...@@ -781,7 +789,14 @@ static int arp_process(struct sk_buff *skb)
arp_ptr += dev->addr_len; arp_ptr += dev->addr_len;
memcpy(&sip, arp_ptr, 4); memcpy(&sip, arp_ptr, 4);
arp_ptr += 4; arp_ptr += 4;
arp_ptr += dev->addr_len; switch (dev_type) {
#if IS_ENABLED(CONFIG_FIREWIRE_NET)
case ARPHRD_IEEE1394:
break;
#endif
default:
arp_ptr += dev->addr_len;
}
memcpy(&tip, arp_ptr, 4); memcpy(&tip, arp_ptr, 4);
/* /*
* Check for bad requests for 127.x.x.x and requests for multicast * Check for bad requests for 127.x.x.x and requests for multicast
......
...@@ -70,6 +70,7 @@ ...@@ -70,6 +70,7 @@
#include <net/snmp.h> #include <net/snmp.h>
#include <net/af_ieee802154.h> #include <net/af_ieee802154.h>
#include <net/firewire.h>
#include <net/ipv6.h> #include <net/ipv6.h>
#include <net/protocol.h> #include <net/protocol.h>
#include <net/ndisc.h> #include <net/ndisc.h>
...@@ -1738,6 +1739,20 @@ static int addrconf_ifid_eui64(u8 *eui, struct net_device *dev) ...@@ -1738,6 +1739,20 @@ static int addrconf_ifid_eui64(u8 *eui, struct net_device *dev)
return 0; return 0;
} }
static int addrconf_ifid_ieee1394(u8 *eui, struct net_device *dev)
{
union fwnet_hwaddr *ha;
if (dev->addr_len != FWNET_ALEN)
return -1;
ha = (union fwnet_hwaddr *)dev->dev_addr;
memcpy(eui, &ha->uc.uniq_id, sizeof(ha->uc.uniq_id));
eui[0] ^= 2;
return 0;
}
static int addrconf_ifid_arcnet(u8 *eui, struct net_device *dev) static int addrconf_ifid_arcnet(u8 *eui, struct net_device *dev)
{ {
/* XXX: inherit EUI-64 from other interface -- yoshfuji */ /* XXX: inherit EUI-64 from other interface -- yoshfuji */
...@@ -1802,6 +1817,8 @@ static int ipv6_generate_eui64(u8 *eui, struct net_device *dev) ...@@ -1802,6 +1817,8 @@ static int ipv6_generate_eui64(u8 *eui, struct net_device *dev)
return addrconf_ifid_gre(eui, dev); return addrconf_ifid_gre(eui, dev);
case ARPHRD_IEEE802154: case ARPHRD_IEEE802154:
return addrconf_ifid_eui64(eui, dev); return addrconf_ifid_eui64(eui, dev);
case ARPHRD_IEEE1394:
return addrconf_ifid_ieee1394(eui, dev);
} }
return -1; return -1;
} }
...@@ -2643,7 +2660,8 @@ static void addrconf_dev_config(struct net_device *dev) ...@@ -2643,7 +2660,8 @@ static void addrconf_dev_config(struct net_device *dev)
(dev->type != ARPHRD_FDDI) && (dev->type != ARPHRD_FDDI) &&
(dev->type != ARPHRD_ARCNET) && (dev->type != ARPHRD_ARCNET) &&
(dev->type != ARPHRD_INFINIBAND) && (dev->type != ARPHRD_INFINIBAND) &&
(dev->type != ARPHRD_IEEE802154)) { (dev->type != ARPHRD_IEEE802154) &&
(dev->type != ARPHRD_IEEE1394)) {
/* Alas, we support only Ethernet autoconfiguration. */ /* Alas, we support only Ethernet autoconfiguration. */
return; return;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment