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

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 으로 보는지...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.