History

net: introduce device min_header_len

The stack must not pass packets to device drivers that are shorter than the minimum link layer header length. Previously, packet sockets would drop packets smaller than or equal to dev->hard_header_len, but this has false positives. Zero length payload is used over Ethernet. Other link layer protocols support variable length headers. Support for validation of these protocols removed the min length check for all protocols. Introduce an explicit dev->min_header_len parameter and drop all packets below this value. Initially, set it to non-zero only for Ethernet and loopback. Other protocols can follow in a patch to net-next.

Willem de Bruijn committed 9 years ago

Commit 217e6fa1 parent d7426c63 files · +6 −0Browse files

Unified · Split

3 files
  1. drivers/net/loopback.c +1 −0
  2. include/linux/netdevice.h +4 −0
  3. net/ethernet/eth.c +1 −0
drivers/net/loopback.c+1−0
@@ -164,6 +164,7 @@ static void loopback_setup(struct net_device *dev) · 163 unmodified lines
164{164{
165 dev->mtu = 64 * 1024;165 dev->mtu = 64 * 1024;
166 dev->hard_header_len = ETH_HLEN; /* 14 */166 dev->hard_header_len = ETH_HLEN; /* 14 */
167 dev->min_header_len = ETH_HLEN; /* 14 */
167 dev->addr_len = ETH_ALEN; /* 6 */168 dev->addr_len = ETH_ALEN; /* 6 */
168 dev->type = ARPHRD_LOOPBACK; /* 0x0001*/169 dev->type = ARPHRD_LOOPBACK; /* 0x0001*/
169 dev->flags = IFF_LOOPBACK;170 dev->flags = IFF_LOOPBACK;
include/linux/netdevice.h+4−0
@@ -1511,6 +1511,7 @@ enum netdev_priv_flags { · 1510 unmodified lines
1511 * @max_mtu: Interface Maximum MTU value1511 * @max_mtu: Interface Maximum MTU value
1512 * @type: Interface hardware type1512 * @type: Interface hardware type
1513 * @hard_header_len: Maximum hardware header length.1513 * @hard_header_len: Maximum hardware header length.
1514 * @min_header_len: Minimum hardware header length
1514 *1515 *
1515 * @needed_headroom: Extra headroom the hardware may need, but not in all1516 * @needed_headroom: Extra headroom the hardware may need, but not in all
1516 * cases can this be guaranteed1517 * cases can this be guaranteed
@@ -1728,6 +1729,7 @@ struct net_device { · 211 unmodified lines
1728 unsigned int max_mtu;1729 unsigned int max_mtu;
1729 unsigned short type;1730 unsigned short type;
1730 unsigned short hard_header_len;1731 unsigned short hard_header_len;
1732 unsigned short min_header_len;
1731 1733
1732 unsigned short needed_headroom;1734 unsigned short needed_headroom;
1733 unsigned short needed_tailroom;1735 unsigned short needed_tailroom;
@@ -2694,6 +2696,8 @@ static inline bool dev_validate_header(const struct net_device *dev, · 960 unmodified lines
2694{2696{
2695 if (likely(len >= dev->hard_header_len))2697 if (likely(len >= dev->hard_header_len))
2696 return true;2698 return true;
2699 if (len < dev->min_header_len)
2700 return false;
2697 2701
2698 if (capable(CAP_SYS_RAWIO)) {2702 if (capable(CAP_SYS_RAWIO)) {
2699 memset(ll_header + len, 0, dev->hard_header_len - len);2703 memset(ll_header + len, 0, dev->hard_header_len - len);
net/ethernet/eth.c+1−0
@@ -356,6 +356,7 @@ void ether_setup(struct net_device *dev) · 355 unmodified lines
356 dev->header_ops = &eth_header_ops;356 dev->header_ops = &eth_header_ops;
357 dev->type = ARPHRD_ETHER;357 dev->type = ARPHRD_ETHER;
358 dev->hard_header_len = ETH_HLEN;358 dev->hard_header_len = ETH_HLEN;
359 dev->min_header_len = ETH_HLEN;
359 dev->mtu = ETH_DATA_LEN;360 dev->mtu = ETH_DATA_LEN;
360 dev->min_mtu = ETH_MIN_MTU;361 dev->min_mtu = ETH_MIN_MTU;
361 dev->max_mtu = ETH_DATA_LEN;362 dev->max_mtu = ETH_DATA_LEN;