Feature #365 ยป v1-0001-batman-adv-Add-support-for-jumbo-frames.patch
net/batman-adv/hard-interface.c | ||
---|---|---|
/**
|
||
* batadv_hardif_min_mtu() - Calculate maximum MTU for soft interface
|
||
* @soft_iface: netdev struct of the soft interface
|
||
* @max_mtu: limit for maximum returned MTU
|
||
*
|
||
* Return: MTU for the soft-interface (limited by the minimal MTU of all active
|
||
* slave interfaces)
|
||
*/
|
||
int batadv_hardif_min_mtu(struct net_device *soft_iface)
|
||
int batadv_hardif_min_mtu(struct net_device *soft_iface, unsigned int max_mtu)
|
||
{
|
||
struct batadv_priv *bat_priv = netdev_priv(soft_iface);
|
||
const struct batadv_hard_iface *hard_iface;
|
||
... | ... | |
/* the real soft-interface MTU is computed by removing the payload
|
||
* overhead from the maximum amount of bytes that was just computed.
|
||
*
|
||
* However batman-adv does not support MTUs bigger than ETH_DATA_LEN
|
||
*/
|
||
return min_t(int, min_mtu - batadv_max_header_len(), ETH_DATA_LEN);
|
||
return min_t(int, min_mtu - batadv_max_header_len(), max_mtu);
|
||
}
|
||
/**
|
||
... | ... | |
*/
|
||
void batadv_update_min_mtu(struct net_device *soft_iface)
|
||
{
|
||
soft_iface->mtu = batadv_hardif_min_mtu(soft_iface);
|
||
soft_iface->mtu = batadv_hardif_min_mtu(soft_iface, soft_iface->mtu);
|
||
/* Check if the local translate table should be cleaned up to match a
|
||
* new (and smaller) MTU.
|
||
... | ... | |
hard_iface->net_dev->name);
|
||
if (atomic_read(&bat_priv->fragmentation) &&
|
||
hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len)
|
||
hard_iface->net_dev->mtu < BATADV_MAX_MTU + max_header_len)
|
||
batadv_info(hard_iface->soft_iface,
|
||
"The MTU of interface %s is too small (%i) to handle the transport of batman-adv packets. Packets going over this interface will be fragmented on layer2 which could impact the performance. Setting the MTU to %i would solve the problem.\n",
|
||
hard_iface->net_dev->name, hard_iface->net_dev->mtu,
|
||
ETH_DATA_LEN + max_header_len);
|
||
BATADV_MAX_MTU + max_header_len);
|
||
if (!atomic_read(&bat_priv->fragmentation) &&
|
||
hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len)
|
||
hard_iface->net_dev->mtu < BATADV_MAX_MTU + max_header_len)
|
||
batadv_info(hard_iface->soft_iface,
|
||
"The MTU of interface %s is too small (%i) to handle the transport of batman-adv packets. If you experience problems getting traffic through try increasing the MTU to %i.\n",
|
||
hard_iface->net_dev->name, hard_iface->net_dev->mtu,
|
||
ETH_DATA_LEN + max_header_len);
|
||
BATADV_MAX_MTU + max_header_len);
|
||
if (batadv_hardif_is_iface_up(hard_iface))
|
||
batadv_hardif_activate_interface(hard_iface);
|
net/batman-adv/hard-interface.h | ||
---|---|---|
int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
|
||
struct net_device *soft_iface);
|
||
void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface);
|
||
int batadv_hardif_min_mtu(struct net_device *soft_iface);
|
||
int batadv_hardif_min_mtu(struct net_device *soft_iface, unsigned int max_mtu);
|
||
void batadv_update_min_mtu(struct net_device *soft_iface);
|
||
void batadv_hardif_release(struct kref *ref);
|
||
int batadv_hardif_no_broadcast(struct batadv_hard_iface *if_outgoing,
|
net/batman-adv/main.h | ||
---|---|---|
#define BATADV_THROUGHPUT_MAX_VALUE 0xFFFFFFFF
|
||
#define BATADV_JITTER 20
|
||
#define BATADV_MAX_MTU (ETH_MAX_MTU - batadv_max_header_len())
|
||
/* Time To Live of broadcast messages */
|
||
#define BATADV_TTL 50
|
||
net/batman-adv/soft-interface.c | ||
---|---|---|
static int batadv_interface_change_mtu(struct net_device *dev, int new_mtu)
|
||
{
|
||
/* check ranges */
|
||
if (new_mtu < 68 || new_mtu > batadv_hardif_min_mtu(dev))
|
||
if (new_mtu < ETH_MIN_MTU)
|
||
return -EINVAL;
|
||
if (new_mtu > batadv_hardif_min_mtu(dev, BATADV_MAX_MTU))
|
||
return -EINVAL;
|
||
dev->mtu = new_mtu;
|
||
... | ... | |
atomic_set(&bat_priv->log_level, 0);
|
||
#endif
|
||
atomic_set(&bat_priv->fragmentation, 1);
|
||
atomic_set(&bat_priv->packet_size_max, ETH_DATA_LEN);
|
||
atomic_set(&bat_priv->packet_size_max, BATADV_MAX_MTU);
|
||
atomic_set(&bat_priv->bcast_queue_left, BATADV_BCAST_QUEUE_LEN);
|
||
atomic_set(&bat_priv->batman_queue_left, BATADV_BATMAN_QUEUE_LEN);
|
||
... | ... | |
* have not been initialized yet
|
||
*/
|
||
dev->mtu = ETH_DATA_LEN;
|
||
dev->max_mtu = BATADV_MAX_MTU;
|
||
/* generate random address */
|
||
eth_hw_addr_random(dev);
|