SO2 Lecture 10 - Networking

Network Management

Network Management Overview

../_images/ditaa-a2ded49c8b739635d6742479583443fb10ad120a.png

Sockets Implementation Overview

../_images/ditaa-79e3734c36891f6c04d684aa5caa39f76915dbaf.png

Sockets Families and Protocols

../_images/ditaa-bf1244d1a5c3d99bd8d40148d81cb3e5748c0b94.png

Example: UDP send

char c;
struct sockaddr_in addr;
int s;

s = socket(AF_INET, SOCK_DGRAM, 0);
connect(s, (struct sockaddr*)&addr, sizeof(addr));
write(s, &c, 1);
close(s);

Example: UDP send

../_images/ditaa-ee04e3e544de75375b914f7645c79d5ae46fe6f3.png

Network processing phases

Packet Routing

../_images/ditaa-528948c80a3fd78b89fb6f7bd69503a58b93a4ae.png

Routing Table

tavi@desktop-tavi:~/src/linux$ ip route list table main
default via 172.30.240.1 dev eth0
172.30.240.0/20 dev eth0 proto kernel scope link src 172.30.249.241

tavi@desktop-tavi:~/src/linux$ ip route list table local
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 172.30.240.0 dev eth0 proto kernel scope link src 172.30.249.241
local 172.30.249.241 dev eth0 proto kernel scope host src 172.30.249.241
broadcast 172.30.255.255 dev eth0 proto kernel scope link src 172.30.249.241

tavi@desktop-tavi:~/src/linux$ ip rule list
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

Routing Policy Database

Routing table processing

Forward Information Database (removed in 3.6)

 

../_images/fidb-overview1.png

Forward Information Database (removed in 3.6)

../_images/fidb-details1.png

Routing Cache (removed in 3.6)

 

../_images/routing-cache1.png

FIB TRIE

 

../_images/fib-trie1.png

Compressed Trie

 

../_images/fib-trie-compressed1.png

Netfilter

Network packets (skbs)

../_images/skb1.png

struct sk_buff

struct sk_buff {
    struct sk_buff *next;
    struct sk_buff *prev;

    struct sock *sk;
    ktime_t tstamp;
    struct net_device *dev;
    char cb[48];

    unsigned int len,
    data_len;
    __u16 mac_len,
    hdr_len;

    void (*destructor)(struct sk_buff *skb);

    sk_buff_data_t transport_header;
    sk_buff_data_t network_header;
    sk_buff_data_t mac_header;
    sk_buff_data_t tail;
    sk_buff_data_t end;

    unsigned char *head,
    *data;
    unsigned int truesize;
    atomic_t users;

skb APIs

/* reserve head room */
void skb_reserve(struct sk_buff *skb, int len);

/* add data to the end */
unsigned char *skb_put(struct sk_buff *skb, unsigned int len);

/* add data to the top */
unsigned char *skb_push(struct sk_buff *skb, unsigned int len);

/* discard data at the top */
unsigned char *skb_pull(struct sk_buff *skb, unsigned int len);

/* discard data at the end */
unsigned char *skb_trim(struct sk_buff *skb, unsigned int len);

unsigned char *skb_transport_header(const struct sk_buff *skb);

void skb_reset_transport_header(struct sk_buff *skb);

void skb_set_transport_header(struct sk_buff *skb, const int offset);

unsigned char *skb_network_header(const struct sk_buff *skb);

void skb_reset_network_header(struct sk_buff *skb);

void skb_set_network_header(struct sk_buff *skb, const int offset);

unsigned char *skb_mac_header(const struct sk_buff *skb);

int skb_mac_header_was_set(const struct sk_buff *skb);

void skb_reset_mac_header(struct sk_buff *skb);

void skb_set_mac_header(struct sk_buff *skb, const int offset);

skb data management

 

../_images/ditaa-91073cb05a3f537eb54ab10745c307531e6795a0.png

Network Device Interface

../_images/net-dev-hw1.png

Advanced features

TCP offload

Performance observation

Stateless offload

TCP Segmentation Offload

../_images/tso1.png

Large Receive Offload

../_images/lro1.png