mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 16:29:59 +00:00
vrf: handle CONFIG_IPV6 not set for vrf_add_mac_header_if_unset()
The vrf_add_mac_header_if_unset() is defined within a conditional
compilation block which depends on the CONFIG_IPV6 macro.
However, the vrf_add_mac_header_if_unset() needs to be called also by IPv4
related code and when the CONFIG_IPV6 is not set, this function is missing.
As a consequence, the build process stops reporting the error:
ERROR: implicit declaration of function 'vrf_add_mac_header_if_unset'
The problem is solved by *only* moving functions
vrf_add_mac_header_if_unset() and vrf_prepare_mac_header() out of the
conditional block.
Reported-by: kernel test robot <lkp@intel.com>
Fixes: 0489390882
("vrf: add mac header for tunneled packets when sniffer is attached")
Signed-off-by: Andrea Mayer <andrea.mayer@uniroma2.it>
Reviewed-by: David Ahern <dsahern@kernel.org>
Link: https://lore.kernel.org/r/20201208175210.8906-1-andrea.mayer@uniroma2.it
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
afae3cc2da
commit
9125abe7b9
1 changed files with 55 additions and 55 deletions
|
@ -1237,6 +1237,61 @@ static struct sk_buff *vrf_rcv_nfhook(u8 pf, unsigned int hook,
|
||||||
return skb;
|
return skb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int vrf_prepare_mac_header(struct sk_buff *skb,
|
||||||
|
struct net_device *vrf_dev, u16 proto)
|
||||||
|
{
|
||||||
|
struct ethhdr *eth;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
/* in general, we do not know if there is enough space in the head of
|
||||||
|
* the packet for hosting the mac header.
|
||||||
|
*/
|
||||||
|
err = skb_cow_head(skb, LL_RESERVED_SPACE(vrf_dev));
|
||||||
|
if (unlikely(err))
|
||||||
|
/* no space in the skb head */
|
||||||
|
return -ENOBUFS;
|
||||||
|
|
||||||
|
__skb_push(skb, ETH_HLEN);
|
||||||
|
eth = (struct ethhdr *)skb->data;
|
||||||
|
|
||||||
|
skb_reset_mac_header(skb);
|
||||||
|
|
||||||
|
/* we set the ethernet destination and the source addresses to the
|
||||||
|
* address of the VRF device.
|
||||||
|
*/
|
||||||
|
ether_addr_copy(eth->h_dest, vrf_dev->dev_addr);
|
||||||
|
ether_addr_copy(eth->h_source, vrf_dev->dev_addr);
|
||||||
|
eth->h_proto = htons(proto);
|
||||||
|
|
||||||
|
/* the destination address of the Ethernet frame corresponds to the
|
||||||
|
* address set on the VRF interface; therefore, the packet is intended
|
||||||
|
* to be processed locally.
|
||||||
|
*/
|
||||||
|
skb->protocol = eth->h_proto;
|
||||||
|
skb->pkt_type = PACKET_HOST;
|
||||||
|
|
||||||
|
skb_postpush_rcsum(skb, skb->data, ETH_HLEN);
|
||||||
|
|
||||||
|
skb_pull_inline(skb, ETH_HLEN);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* prepare and add the mac header to the packet if it was not set previously.
|
||||||
|
* In this way, packet sniffers such as tcpdump can parse the packet correctly.
|
||||||
|
* If the mac header was already set, the original mac header is left
|
||||||
|
* untouched and the function returns immediately.
|
||||||
|
*/
|
||||||
|
static int vrf_add_mac_header_if_unset(struct sk_buff *skb,
|
||||||
|
struct net_device *vrf_dev,
|
||||||
|
u16 proto)
|
||||||
|
{
|
||||||
|
if (skb_mac_header_was_set(skb))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return vrf_prepare_mac_header(skb, vrf_dev, proto);
|
||||||
|
}
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
#if IS_ENABLED(CONFIG_IPV6)
|
||||||
/* neighbor handling is done with actual device; do not want
|
/* neighbor handling is done with actual device; do not want
|
||||||
* to flip skb->dev for those ndisc packets. This really fails
|
* to flip skb->dev for those ndisc packets. This really fails
|
||||||
|
@ -1310,61 +1365,6 @@ static void vrf_ip6_input_dst(struct sk_buff *skb, struct net_device *vrf_dev,
|
||||||
skb_dst_set(skb, &rt6->dst);
|
skb_dst_set(skb, &rt6->dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vrf_prepare_mac_header(struct sk_buff *skb,
|
|
||||||
struct net_device *vrf_dev, u16 proto)
|
|
||||||
{
|
|
||||||
struct ethhdr *eth;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
/* in general, we do not know if there is enough space in the head of
|
|
||||||
* the packet for hosting the mac header.
|
|
||||||
*/
|
|
||||||
err = skb_cow_head(skb, LL_RESERVED_SPACE(vrf_dev));
|
|
||||||
if (unlikely(err))
|
|
||||||
/* no space in the skb head */
|
|
||||||
return -ENOBUFS;
|
|
||||||
|
|
||||||
__skb_push(skb, ETH_HLEN);
|
|
||||||
eth = (struct ethhdr *)skb->data;
|
|
||||||
|
|
||||||
skb_reset_mac_header(skb);
|
|
||||||
|
|
||||||
/* we set the ethernet destination and the source addresses to the
|
|
||||||
* address of the VRF device.
|
|
||||||
*/
|
|
||||||
ether_addr_copy(eth->h_dest, vrf_dev->dev_addr);
|
|
||||||
ether_addr_copy(eth->h_source, vrf_dev->dev_addr);
|
|
||||||
eth->h_proto = htons(proto);
|
|
||||||
|
|
||||||
/* the destination address of the Ethernet frame corresponds to the
|
|
||||||
* address set on the VRF interface; therefore, the packet is intended
|
|
||||||
* to be processed locally.
|
|
||||||
*/
|
|
||||||
skb->protocol = eth->h_proto;
|
|
||||||
skb->pkt_type = PACKET_HOST;
|
|
||||||
|
|
||||||
skb_postpush_rcsum(skb, skb->data, ETH_HLEN);
|
|
||||||
|
|
||||||
skb_pull_inline(skb, ETH_HLEN);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* prepare and add the mac header to the packet if it was not set previously.
|
|
||||||
* In this way, packet sniffers such as tcpdump can parse the packet correctly.
|
|
||||||
* If the mac header was already set, the original mac header is left
|
|
||||||
* untouched and the function returns immediately.
|
|
||||||
*/
|
|
||||||
static int vrf_add_mac_header_if_unset(struct sk_buff *skb,
|
|
||||||
struct net_device *vrf_dev,
|
|
||||||
u16 proto)
|
|
||||||
{
|
|
||||||
if (skb_mac_header_was_set(skb))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return vrf_prepare_mac_header(skb, vrf_dev, proto);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct sk_buff *vrf_ip6_rcv(struct net_device *vrf_dev,
|
static struct sk_buff *vrf_ip6_rcv(struct net_device *vrf_dev,
|
||||||
struct sk_buff *skb)
|
struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue