LINUX.ORG.RU

движение пакета между неймспейсами

 , , , ,


0

1

Приветствую,

Меня интересует, сохраняется ли какая-то namespace spcific мета-информация в skb при перемещении пакета из одного неймспейса в другой? Подозреваю, что ядро это подчищает, но вот где конкретно в ядре это посмотреть?

★★

Между неймспейсами пакеты перемещают обычно через veth, можно начать плясать оттуда.

drivers/net/veth.c:

static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
{
	/* ... */
	if (likely(dev_forward_skb(rcv, skb) == NET_RX_SUCCESS)) {
		/* ... */
	}
	/* ... */
}

net/core/dev.c:

/**
 * dev_forward_skb - loopback an skb to another netif
 *
 * @dev: destination network device
 * @skb: buffer to forward
 *
 * return values:
 *	NET_RX_SUCCESS	(no congestion)
 *	NET_RX_DROP     (packet was dropped, but freed)
 *
 * dev_forward_skb can be used for injecting an skb from the
 * start_xmit function of one device into the receive queue
 * of another device.
 *
 * The receiving device may be in another namespace, so
 * we have to clear all information in the skb that could
 * impact namespace isolation.
 */
int dev_forward_skb(struct net_device *dev, struct sk_buff *skb)
{
	return __dev_forward_skb(dev, skb) ?: netif_rx_internal(skb);
}
EXPORT_SYMBOL_GPL(dev_forward_skb);

include/linux/netdevice.h:

static __always_inline int ____dev_forward_skb(struct net_device *dev,
					       struct sk_buff *skb)
{
	/* ... */
	skb_scrub_packet(skb, true);
	/* ... */
}

net/core/skbuff.c:

/**
 * skb_scrub_packet - scrub an skb
 *
 * @skb: buffer to clean
 * @xnet: packet is crossing netns
 *
 * skb_scrub_packet can be used after encapsulating or decapsulting a packet
 * into/from a tunnel. Some information have to be cleared during these
 * operations.
 * skb_scrub_packet can also be used to clean a skb before injecting it in
 * another namespace (@xnet == true). We have to clear all information in the
 * skb that could impact namespace isolation.
 */
void skb_scrub_packet(struct sk_buff *skb, bool xnet)
{
	skb->tstamp = 0;
	skb->pkt_type = PACKET_HOST;
	skb->skb_iif = 0;
	skb->ignore_df = 0;
	skb_dst_drop(skb);
	secpath_reset(skb);
	nf_reset(skb);
	nf_reset_trace(skb);

	if (!xnet)
		return;

	ipvs_reset(skb);
	skb_orphan(skb);
	skb->mark = 0;
}
EXPORT_SYMBOL_GPL(skb_scrub_packet);

ilammy ★★★
()
Ответ на: комментарий от ilammy

Большое спасибо! То есть получается, что информация об неймспейсе-источнике пакета нигде не сохраняется?

cruz7 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.