|
@@ -268,6 +268,7 @@ struct header_ops {
|
|
|
void (*cache_update)(struct hh_cache *hh,
|
|
|
const struct net_device *dev,
|
|
|
const unsigned char *haddr);
|
|
|
+ bool (*validate)(const char *ll_header, unsigned int len);
|
|
|
};
|
|
|
|
|
|
/* These flag bits are private to the generic network queueing
|
|
@@ -1459,8 +1460,7 @@ enum netdev_priv_flags {
|
|
|
* @dma: DMA channel
|
|
|
* @mtu: Interface MTU value
|
|
|
* @type: Interface hardware type
|
|
|
- * @hard_header_len: Hardware header length, which means that this is the
|
|
|
- * minimum size of a packet.
|
|
|
+ * @hard_header_len: Maximum hardware header length.
|
|
|
*
|
|
|
* @needed_headroom: Extra headroom the hardware may need, but not in all
|
|
|
* cases can this be guaranteed
|
|
@@ -2687,6 +2687,24 @@ static inline int dev_parse_header(const struct sk_buff *skb,
|
|
|
return dev->header_ops->parse(skb, haddr);
|
|
|
}
|
|
|
|
|
|
+/* ll_header must have at least hard_header_len allocated */
|
|
|
+static inline bool dev_validate_header(const struct net_device *dev,
|
|
|
+ char *ll_header, int len)
|
|
|
+{
|
|
|
+ if (likely(len >= dev->hard_header_len))
|
|
|
+ return true;
|
|
|
+
|
|
|
+ if (capable(CAP_SYS_RAWIO)) {
|
|
|
+ memset(ll_header + len, 0, dev->hard_header_len - len);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (dev->header_ops && dev->header_ops->validate)
|
|
|
+ return dev->header_ops->validate(ll_header, len);
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len);
|
|
|
int register_gifconf(unsigned int family, gifconf_func_t *gifconf);
|
|
|
static inline int unregister_gifconf(unsigned int family)
|