In teoria sarebbe a livello logico ancora meglio...
Se buffer è un puntatore a char allora dovrebbe bastare

struct iphdr *ip = buffer;

va boh.... tanto ho capito che non ne uscirò mai... il fatto è che non trovo niente online su come usare passo passo i puntatori ma non per giocare, per fare cose serie...

arrivo alla solita solfadetto in parole poverissime) il puntatore è una variabile che punta all'indirizzo di un'altra variabile o struttura dati ecc..
a=5

p=&a; //p= all'indirizzo di memoria di a che contiene 5

Da qui ad arrivare a tutti gli altri esempi non si sa come fare..

Comunque se avete per caso tempo e voglia di illuminarmi un po'... vi sarei gratissimo...