[자문자답[[커널관련] 네트워크 쪽 커널 소스 분석 중 몇가지 추론해본게 있는데 맞는지 좀 봐주세요

twinwings의 이미지

네트워크 쪽 커널 소스 분석 중 몇가지 추론해본게 있는데 맞는지 좀 봐주세요

각각의 추론별로 번호를 매겨봤습니다.

----------------------------------------------
raw 소켓을 생성하니, 패킷(1)을 요청한 원래 Process(P1)와 raw소켓을 생성한 Process(P2)
각각에게 전달되었다. 따라서...

1. 패킷(1)이 각각의 프로세스별로 전달되므로 패킷(1)을 편의상
(P1)에게 전달되는 패킷(1-1) / (P2)에게 전달되는 패킷(1-2)로 지칭하면,
프로세스(P1)에서 패킷(1-1)을 위한 sk_buff(P1-S1)와
프로세스(P2)에서 패킷(1-2)를 위한 sk_buff(P2-S1)가 각각 존재한다.

2. 패킷(1-1)과 패킷(1-2)은 실제로는 물리적으로 하나의 메모리에 할당되며
skb_shared_info내의 dataref 변수에 의해 reference count 된다.

3. 패킷(1)의 메모리 할당의 책임은 Driver에게 있고
해제의 책임은 마지막으로 데이터를 요청한 struct socket(혹은 struct sock)에게 있다.

kernel 2.6 기준 linux/skbuff.h

struct skb_shared_info {
	atomic_t	dataref;
	unsigned short	nr_frags;
	unsigned short	gso_size;
#ifdef CONFIG_HAS_DMA
	dma_addr_t	dma_head;
#endif
        /* 이하 코드 생략 */
};
twinwings의 이미지

서술이 너무 지저분해서 답이 안달리는걸까요 ㅜㅜ

삽을 많이 퍼니 어찌어찌 답이 나오긴 하네요..

1, 2.
linux/skbuff.h

static struct sk_buff *__skb_clone(struct sk_buff *n, struct sk_buff *skb)
{
        /* 코드 생략 */
 
	atomic_inc(&(skb_shinfo(skb)->dataref));
	skb->cloned = 1;
 
	return n;
}

로 보아서 추론이 맞는 듯 함..

3.
driver/net/r8169.c

static int rtl8169_rx_interrupt(struct net_device *dev,
				struct rtl8169_private *tp,
				void __iomem *ioaddr, u32 budget)
{
	/* ~ 코드 생략 ~ */
	/*  이전에 rtl8168_alloc_rx_skb()에 의해서 메모리가 할당되고
	 *  rtl8169_rx_fill()에 의해 수신 큐에 잡힌다..
	 */
	struct sk_buff *skb = tp->Rx_skbuff[entry];
 
	/* 코드 생략 */
	skb_put(skb, pkt_size);
	skb->protocol = eth_type_trans(skb, dev);
 
	/* 코드 생략 */
 
	return count;
}

후.. 큰 흐름만 읽는 것도 힘든데 고수님들은 어떻게 line by line 으로 보는지...