memcpy(skb_put(skb, attrlen), data, attrlen);
        return 0;
  }
 +EXPORT_SYMBOL(nla_append);
 +#endif
  
  EXPORT_SYMBOL(nla_validate);
+ EXPORT_SYMBOL(nla_policy_len);
  EXPORT_SYMBOL(nla_parse);
  EXPORT_SYMBOL(nla_find);
  EXPORT_SYMBOL(nla_strlcpy);
 
  static unsigned long ifname_compare(const char *_a, const char *_b, const char *_mask)
  {
  #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
-       const unsigned long *a = (const unsigned long *)_a;
-       const unsigned long *b = (const unsigned long *)_b;
-       const unsigned long *mask = (const unsigned long *)_mask;
-       unsigned long ret;
- 
-       ret = (a[0] ^ b[0]) & mask[0];
-       if (IFNAMSIZ > sizeof(unsigned long))
-               ret |= (a[1] ^ b[1]) & mask[1];
-       if (IFNAMSIZ > 2 * sizeof(unsigned long))
-               ret |= (a[2] ^ b[2]) & mask[2];
-       if (IFNAMSIZ > 3 * sizeof(unsigned long))
-               ret |= (a[3] ^ b[3]) & mask[3];
-       BUILD_BUG_ON(IFNAMSIZ > 4 * sizeof(unsigned long));
+       unsigned long ret = ifname_compare_aligned(_a, _b, _mask);
  #else
        unsigned long ret = 0;
 +      const u16 *a = (const u16 *)_a;
 +      const u16 *b = (const u16 *)_b;
 +      const u16 *mask = (const u16 *)_mask;
        int i;
  
 -      for (i = 0; i < IFNAMSIZ; i++)
 -              ret |= (_a[i] ^ _b[i]) & _mask[i];
 +      for (i = 0; i < IFNAMSIZ/sizeof(u16); i++)
 +              ret |= (a[i] ^ b[i]) & mask[i];
  #endif
        return ret;
  }