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); 
   | 
||