>>606 の引用元を見るとコード片だから、実際にはコンパイルしてないんだな。

char packet[1500];
memset(buf, 0, sizeof(buf));
は、packet と buf が同じもので、正しくは

char packet[1500];
memset(packet, 0, sizeof(packet));

なんだと思う。最初は両方とも buf と書いてあったけど
「もっと自ら語る変数名にしよう」と packet に変えたはいいが、
memset() の方では直し忘れた、というお話かと。


(struct ether_header *) のキャストは、コンパイラの警告対策だな。
…って言うか、これキャストしないでも警告だけで通るのね。