3 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
26 #include <net/packet.h>
28 #include <net/checksum.h>
31 void net_proto_ip_print (net_ipv4 ip
)
33 unsigned char a
= (unsigned char) ip
;
34 unsigned char b
= (unsigned char) (ip
>> 8);
35 unsigned char c
= (unsigned char) (ip
>> 16);
36 unsigned char d
= (unsigned char) (ip
>> 24);
38 printf ("%d.%d.%d.%d", a
, b
, c
, d
);
41 net_ipv4
net_proto_ip_convert (char *ip
)
50 unsigned y
= strlen (ip
);
73 return NET_IPV4_TO_ADDR (a
, b
, c
, d
);
76 unsigned net_proto_ip_network (net_ipv4 ip
)
78 unsigned char a
= (unsigned char) ip
;
80 if (a
== 192 || a
== 10 || a
== 127)
88 unsigned net_proto_ip_send (netif_t
*netif
, packet_t
*packet
, proto_ip_t
*ip
, char *buf
, unsigned len
)
90 char *buf_ip
= (char *) kmalloc ((len
+sizeof (proto_ip_t
)) * sizeof (char));
95 unsigned l
= sizeof (proto_ip_t
);
97 /* 16bit IP header checksum */
98 ip
->checksum
= checksum16 (ip
, l
);
100 /* put ip header and buf data to one buffer */
101 memcpy (buf_ip
, (char *) ip
, l
);
102 memcpy (buf_ip
+l
, buf
, len
);
104 buf_ip
[l
+len
] = '\0';
107 unsigned ret
= net_packet_send (netif
, packet
, buf_ip
, l
+len
);
114 unsigned net_proto_ip_handler (packet_t
*packet
, char *buf
, unsigned len
)
116 proto_ip_t
*ip
= (proto_ip_t
*) buf
;
118 /* calculate real length of header */
119 unsigned head_len
= ip
->head_len
* 4;
122 case NET_PROTO_IP_TYPE_TCP
:
123 return net_proto_tcp_handler (packet
, ip
, buf
+head_len
, len
-head_len
);
124 case NET_PROTO_IP_TYPE_ICMP
:
125 return net_proto_icmp_handler (packet
, ip
, buf
+head_len
, len
-head_len
);