|
@@ -91,6 +91,37 @@ int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2);
|
|
|
void addrconf_join_solict(struct net_device *dev, const struct in6_addr *addr);
|
|
|
void addrconf_leave_solict(struct inet6_dev *idev, const struct in6_addr *addr);
|
|
|
|
|
|
+static inline int addrconf_ifid_eui48(u8 *eui, struct net_device *dev)
|
|
|
+{
|
|
|
+ if (dev->addr_len != ETH_ALEN)
|
|
|
+ return -1;
|
|
|
+ memcpy(eui, dev->dev_addr, 3);
|
|
|
+ memcpy(eui + 5, dev->dev_addr + 3, 3);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * The zSeries OSA network cards can be shared among various
|
|
|
+ * OS instances, but the OSA cards have only one MAC address.
|
|
|
+ * This leads to duplicate address conflicts in conjunction
|
|
|
+ * with IPv6 if more than one instance uses the same card.
|
|
|
+ *
|
|
|
+ * The driver for these cards can deliver a unique 16-bit
|
|
|
+ * identifier for each instance sharing the same card. It is
|
|
|
+ * placed instead of 0xFFFE in the interface identifier. The
|
|
|
+ * "u" bit of the interface identifier is not inverted in this
|
|
|
+ * case. Hence the resulting interface identifier has local
|
|
|
+ * scope according to RFC2373.
|
|
|
+ */
|
|
|
+ if (dev->dev_id) {
|
|
|
+ eui[3] = (dev->dev_id >> 8) & 0xFF;
|
|
|
+ eui[4] = dev->dev_id & 0xFF;
|
|
|
+ } else {
|
|
|
+ eui[3] = 0xFF;
|
|
|
+ eui[4] = 0xFE;
|
|
|
+ eui[0] ^= 2;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static inline unsigned long addrconf_timeout_fixup(u32 timeout,
|
|
|
unsigned int unit)
|
|
|
{
|