とりあえず、ソースをアップロードしろ。

多くの人が指摘しているとおり、ipに有効な値が入っていない。
(C90までの)C言語では、宣言とコードを混ぜることができない。
struct ip *ip;
unsigned int data_length = ip->ip_len - ip->ip_hl;
までに、ipに値を代入することはできないのだよ。
わかるか、規格書を読んでから出直してきてください。ありがとうございました。