Differences

This shows you the differences between two versions of the page.

Link to this comparison view

rl:labs:10 [2025/12/08 13:50]
vlad_andrei.badoiu [Netlink]
rl:labs:10 [2025/12/08 14:06] (current)
vlad_andrei.badoiu [Utilizare]
Line 57: Line 57:
 De asemenea, se pot folosi apelurile de sistem din Linux pentru a interacționa cu API-ul de bridge. Sunt două metode: prin **IOCTL** (varianta veche) și prin socket-uri **Netlink**. Mai jos este un exemplu cu IOCTL. De asemenea, se pot folosi apelurile de sistem din Linux pentru a interacționa cu API-ul de bridge. Sunt două metode: prin **IOCTL** (varianta veche) și prin socket-uri **Netlink**. Mai jos este un exemplu cu IOCTL.
  
 +<spoiler ioctl_create_bridge.c>​
 <code C> <code C>
 #include <​stdio.h>​ #include <​stdio.h>​
Line 87: Line 88:
 } }
 </​code>​ </​code>​
 +</​spoiler>​
  
 ==== VETH ==== ==== VETH ====
Line 275: Line 276:
 </​code>​ </​code>​
  
-Acum putem scrie mesaje în clientul din ''​ns1''​ și acestea vor apărea în serverul din ''​ns2'',​ demonstrând ​comunicarea completă ​între cele două namespace-uri izolate prin intermediul bridge-ului.]+Acum putem scrie mesaje în clientul din ''​ns1''​ și acestea vor apărea în serverul din ''​ns2'',​ demonstrând ​conectivitatea ​între cele două namespace-uri izolate prin intermediul bridge-ului.
  
 ==== Netlink ==== ==== Netlink ====
  
 Netlink este un API din Linux utilizat pentru comunicarea inter-proces (IPC) atât între kernel și procesele userspace, cât și între diferite procese userspace, într-un mod similar socket-urilor de domeniu Unix. Netlink este un API din Linux utilizat pentru comunicarea inter-proces (IPC) atât între kernel și procesele userspace, cât și între diferite procese userspace, într-un mod similar socket-urilor de domeniu Unix.
 +
 +Introdus inițial pentru a rezolva problema ioctl-urilor (API-ul de ''​ioctl''​ necesita modificări în kernel pentru fiecare nou protocol de comunicare),​ Netlink este mecanism extensibil de comunicare între spațiul utilizator și kernel. Spre deosebire de ''​ioctl'',​ Netlink permite adăugarea de noi funcționalități fără a modifica codul kernel-ului,​ evitând astfel procesul de aprobare și integrare în kernel. Acesta a fost ulterior adaptat pentru a interacționa cu mai multe subsisteme.
  
 La fel ca socket-urile de domeniu Unix și spre deosebire de socket-urile INET, comunicarea Netlink nu poate traversa granițele gazdei. Netlink oferă o interfață standard bazată pe socket-uri pentru procesele userspace și un API pentru nucleu destinat utilizării interne de către modulele nucleului. Inițial, Netlink a folosit familia de socket-uri AF_NETLINK. Netlink este conceput pentru a fi un succesor mai flexibil al ioctl; RFC 3549 descrie protocolul în detaliu. La fel ca socket-urile de domeniu Unix și spre deosebire de socket-urile INET, comunicarea Netlink nu poate traversa granițele gazdei. Netlink oferă o interfață standard bazată pe socket-uri pentru procesele userspace și un API pentru nucleu destinat utilizării interne de către modulele nucleului. Inițial, Netlink a folosit familia de socket-uri AF_NETLINK. Netlink este conceput pentru a fi un succesor mai flexibil al ioctl; RFC 3549 descrie protocolul în detaliu.
Line 285: Line 288:
 Netlink este folosit, printre altele, de ''​ip route''​ sau ''​iptables''​. Mai jos gasim un exemplu de cod ce face toggle up <-> down la ''​some_interface''​. Netlink este folosit, printre altele, de ''​ip route''​ sau ''​iptables''​. Mai jos gasim un exemplu de cod ce face toggle up <-> down la ''​some_interface''​.
  
 +<spoiler switch_inferface_state.c>​
 <code C> <code C>
 #include <​stdio.h>​ #include <​stdio.h>​
Line 405: Line 409:
  
 Codul de mai sus: Codul de mai sus:
-* Deschide un socket cu AF_NETLINK ca familie +  ​* Deschide un socket cu AF_NETLINK ca familie 
-* Setează id-ul adresei la 0 (pentru kernel) +  * Setează id-ul adresei la 0 (pentru kernel) 
-* Creează antetul standard al mesajului +  * Creează antetul standard al mesajului 
-* Atașează payload-ul corect (incluzând ifinfomsg și numele NIC-ului) +  * Atașează payload-ul corect (incluzând ifinfomsg și numele NIC-ului) 
-Apelează sendmsg+  ​* ​Apelează sendmsg 
 + 
 +<code bash> 
 +> gcc switch_interface_state.c -o switch_interface_state 
 +> ip a show some_interface 
 +> sudo ./​switch_interface_state 
 +> ip a show some_interface 
 +</​code>​
  
 +</​spoiler>​
 ==== Exercitii ==== ==== Exercitii ====
  
rl/labs/10.1765194655.txt.gz · Last modified: 2025/12/08 13:50 by vlad_andrei.badoiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0