|
@@ -246,11 +246,16 @@ struct hh_cache
|
|
|
*
|
|
|
* We could use other alignment values, but we must maintain the
|
|
|
* relationship HH alignment <= LL alignment.
|
|
|
+ *
|
|
|
+ * LL_ALLOCATED_SPACE also takes into account the tailroom the device
|
|
|
+ * may need.
|
|
|
*/
|
|
|
#define LL_RESERVED_SPACE(dev) \
|
|
|
- (((dev)->hard_header_len&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)
|
|
|
+ ((((dev)->hard_header_len+(dev)->needed_headroom)&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)
|
|
|
#define LL_RESERVED_SPACE_EXTRA(dev,extra) \
|
|
|
- ((((dev)->hard_header_len+extra)&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)
|
|
|
+ ((((dev)->hard_header_len+(dev)->needed_headroom+(extra))&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)
|
|
|
+#define LL_ALLOCATED_SPACE(dev) \
|
|
|
+ ((((dev)->hard_header_len+(dev)->needed_headroom+(dev)->needed_tailroom)&~(HH_DATA_MOD - 1)) + HH_DATA_MOD)
|
|
|
|
|
|
struct header_ops {
|
|
|
int (*create) (struct sk_buff *skb, struct net_device *dev,
|
|
@@ -569,6 +574,13 @@ struct net_device
|
|
|
unsigned short type; /* interface hardware type */
|
|
|
unsigned short hard_header_len; /* hardware hdr length */
|
|
|
|
|
|
+ /* extra head- and tailroom the hardware may need, but not in all cases
|
|
|
+ * can this be guaranteed, especially tailroom. Some cases also use
|
|
|
+ * LL_MAX_HEADER instead to allocate the skb.
|
|
|
+ */
|
|
|
+ unsigned short needed_headroom;
|
|
|
+ unsigned short needed_tailroom;
|
|
|
+
|
|
|
struct net_device *master; /* Pointer to master device of a group,
|
|
|
* which this device is member of.
|
|
|
*/
|