2 * Copyright (C) 2006-2010 Tobias Brunner
3 * Copyright (C) 2005-2010 Martin Willi
4 * Copyright (C) 2006 Daniel Roethlisberger
5 * Copyright (C) 2005 Jan Hutter
6 * Hochschule fuer Technik Rapperswil
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 /* for struct in6_pktinfo */
22 #include "socket_raw_socket.h"
24 #include <sys/types.h>
25 #include <sys/socket.h>
31 #include <sys/ioctl.h>
32 #include <netinet/in.h>
33 #include <netinet/ip.h>
34 #include <netinet/udp.h>
35 #include <linux/types.h>
36 #include <linux/filter.h>
41 #include <threading/thread.h>
43 /* Maximum size of a packet */
44 #define MAX_PACKET 10000
46 /* constants for packet handling */
47 #define IP_LEN sizeof(struct iphdr)
48 #define IP6_LEN sizeof(struct ip6_hdr)
49 #define UDP_LEN sizeof(struct udphdr)
50 #define MARKER_LEN sizeof(u_int32_t)
52 /* offsets for packet handling */
53 #define IP_PROTO_OFFSET 9
54 #define IP6_PROTO_OFFSET 6
55 #define IKE_VERSION_OFFSET 17
56 #define IKE_LENGTH_OFFSET 24
58 /* from linux/udp.h */
63 #ifndef UDP_ENCAP_ESPINUDP
64 #define UDP_ENCAP_ESPINUDP 2
65 #endif /*UDP_ENCAP_ESPINUDP*/
67 /* needed for older kernel headers */
68 #ifndef IPV6_2292PKTINFO
69 #define IPV6_2292PKTINFO 2
70 #endif /*IPV6_2292PKTINFO*/
72 typedef struct private_socket_raw_socket_t private_socket_raw_socket_t
;
75 * Private data of an socket_t object
77 struct private_socket_raw_socket_t
{
82 socket_raw_socket_t
public;
95 * raw receiver socket for IPv4
100 * raw receiver socket for IPv6
105 * send socket on regular port for IPv4
110 * send socket on regular port for IPv6
115 * send socket on nat-t port for IPv4
120 * send socket on nat-t port for IPv6
125 * Maximum packet size to receive
130 METHOD(socket_t
, receiver
, status_t
,
131 private_socket_raw_socket_t
*this, packet_t
**packet
)
133 char buffer
[this->max_packet
];
137 host_t
*source
= NULL
, *dest
= NULL
;
138 int bytes_read
= 0, data_offset
;
146 FD_SET(this->recv4
, &rfds
);
150 FD_SET(this->recv6
, &rfds
);
153 DBG2(DBG_NET
, "waiting for data on raw sockets");
155 oldstate
= thread_cancelability(TRUE
);
156 if (select(max(this->recv4
, this->recv6
) + 1, &rfds
, NULL
, NULL
, NULL
) <= 0)
158 thread_cancelability(oldstate
);
161 thread_cancelability(oldstate
);
163 if (this->recv4
&& FD_ISSET(this->recv4
, &rfds
))
165 /* IPv4 raw sockets return the IP header. We read src/dest
166 * information directly from the raw header */
168 struct sockaddr_in src
, dst
;
170 bytes_read
= recv(this->recv4
, buffer
, this->max_packet
, 0);
173 DBG1(DBG_NET
, "error reading from IPv4 socket: %s", strerror(errno
));
176 if (bytes_read
== this->max_packet
)
178 DBG1(DBG_NET
, "receive buffer too small, packet discarded");
181 DBG3(DBG_NET
, "received IPv4 packet %b", buffer
, bytes_read
);
183 /* read source/dest from raw IP/UDP header */
184 if (bytes_read
< IP_LEN
+ UDP_LEN
+ MARKER_LEN
)
186 DBG1(DBG_NET
, "received IPv4 packet too short (%d bytes)",
190 ip
= (struct iphdr
*) buffer
;
191 udp
= (struct udphdr
*) (buffer
+ IP_LEN
);
192 src
.sin_family
= AF_INET
;
193 src
.sin_addr
.s_addr
= ip
->saddr
;
194 src
.sin_port
= udp
->source
;
195 dst
.sin_family
= AF_INET
;
196 dst
.sin_addr
.s_addr
= ip
->daddr
;
197 dst
.sin_port
= udp
->dest
;
198 source
= host_create_from_sockaddr((sockaddr_t
*)&src
);
199 dest
= host_create_from_sockaddr((sockaddr_t
*)&dst
);
201 pkt
= packet_create();
202 pkt
->set_source(pkt
, source
);
203 pkt
->set_destination(pkt
, dest
);
204 DBG2(DBG_NET
, "received packet: from %#H to %#H", source
, dest
);
205 data_offset
= IP_LEN
+ UDP_LEN
;
206 /* remove non esp marker */
207 if (dest
->get_port(dest
) == CHARON_NATT_PORT
)
209 data_offset
+= MARKER_LEN
;
212 data
.len
= bytes_read
- data_offset
;
213 data
.ptr
= malloc(data
.len
);
214 memcpy(data
.ptr
, buffer
+ data_offset
, data
.len
);
215 pkt
->set_data(pkt
, data
);
217 else if (this->recv6
&& FD_ISSET(this->recv6
, &rfds
))
219 /* IPv6 raw sockets return no IP header. We must query
220 * src/dest via socket options/ancillary data */
222 struct cmsghdr
*cmsgptr
;
223 struct sockaddr_in6 src
, dst
;
228 msg
.msg_namelen
= sizeof(src
);
229 iov
.iov_base
= buffer
;
230 iov
.iov_len
= this->max_packet
;
233 msg
.msg_control
= ancillary
;
234 msg
.msg_controllen
= sizeof(ancillary
);
237 bytes_read
= recvmsg(this->recv6
, &msg
, 0);
240 DBG1(DBG_NET
, "error reading from IPv6 socket: %s", strerror(errno
));
243 DBG3(DBG_NET
, "received IPv6 packet %b", buffer
, bytes_read
);
245 if (bytes_read
< IP_LEN
+ UDP_LEN
+ MARKER_LEN
)
247 DBG3(DBG_NET
, "received IPv6 packet too short (%d bytes)",
252 /* read ancillary data to get destination address */
253 for (cmsgptr
= CMSG_FIRSTHDR(&msg
); cmsgptr
!= NULL
;
254 cmsgptr
= CMSG_NXTHDR(&msg
, cmsgptr
))
256 if (cmsgptr
->cmsg_len
== 0)
258 DBG1(DBG_NET
, "error reading IPv6 ancillary data");
262 #ifdef HAVE_IN6_PKTINFO
263 if (cmsgptr
->cmsg_level
== SOL_IPV6
&&
264 cmsgptr
->cmsg_type
== IPV6_2292PKTINFO
)
266 struct in6_pktinfo
*pktinfo
;
267 pktinfo
= (struct in6_pktinfo
*)CMSG_DATA(cmsgptr
);
269 memset(&dst
, 0, sizeof(dst
));
270 memcpy(&dst
.sin6_addr
, &pktinfo
->ipi6_addr
, sizeof(dst
.sin6_addr
));
271 dst
.sin6_family
= AF_INET6
;
272 udp
= (struct udphdr
*) (buffer
);
273 dst
.sin6_port
= udp
->dest
;
274 src
.sin6_port
= udp
->source
;
275 dest
= host_create_from_sockaddr((sockaddr_t
*)&dst
);
277 #endif /* HAVE_IN6_PKTINFO */
279 /* ancillary data missing? */
282 DBG1(DBG_NET
, "error reading IPv6 packet header");
286 source
= host_create_from_sockaddr((sockaddr_t
*)&src
);
288 pkt
= packet_create();
289 pkt
->set_source(pkt
, source
);
290 pkt
->set_destination(pkt
, dest
);
291 DBG2(DBG_NET
, "received packet: from %#H to %#H", source
, dest
);
292 data_offset
= UDP_LEN
;
293 /* remove non esp marker */
294 if (dest
->get_port(dest
) == CHARON_NATT_PORT
)
296 data_offset
+= MARKER_LEN
;
299 data
.len
= bytes_read
- data_offset
;
300 data
.ptr
= malloc(data
.len
);
301 memcpy(data
.ptr
, buffer
+ data_offset
, data
.len
);
302 pkt
->set_data(pkt
, data
);
306 /* oops, shouldn't happen */
315 METHOD(socket_t
, sender
, status_t
,
316 private_socket_raw_socket_t
*this, packet_t
*packet
)
318 int sport
, skt
, family
;
320 chunk_t data
, marked
;
323 struct cmsghdr
*cmsg
;
326 src
= packet
->get_source(packet
);
327 dst
= packet
->get_destination(packet
);
328 data
= packet
->get_data(packet
);
330 DBG2(DBG_NET
, "sending packet: from %#H to %#H", src
, dst
);
333 sport
= src
->get_port(src
);
334 family
= dst
->get_family(dst
);
335 if (sport
== CHARON_UDP_PORT
)
337 if (family
== AF_INET
)
346 else if (sport
== CHARON_NATT_PORT
)
348 if (family
== AF_INET
)
350 skt
= this->send4_natt
;
354 skt
= this->send6_natt
;
356 /* NAT keepalives without marker */
357 if (data
.len
!= 1 || data
.ptr
[0] != 0xFF)
359 /* add non esp marker to packet */
360 marked
= chunk_alloc(data
.len
+ MARKER_LEN
);
361 memset(marked
.ptr
, 0, MARKER_LEN
);
362 memcpy(marked
.ptr
+ MARKER_LEN
, data
.ptr
, data
.len
);
363 /* let the packet do the clean up for us */
364 packet
->set_data(packet
, marked
);
370 DBG1(DBG_NET
, "unable to locate a send socket for port %d", sport
);
374 memset(&msg
, 0, sizeof(struct msghdr
));
375 msg
.msg_name
= dst
->get_sockaddr(dst
);;
376 msg
.msg_namelen
= *dst
->get_sockaddr_len(dst
);
377 iov
.iov_base
= data
.ptr
;
378 iov
.iov_len
= data
.len
;
383 if (!src
->is_anyaddr(src
))
385 if (family
== AF_INET
)
387 char buf
[CMSG_SPACE(sizeof(struct in_pktinfo
))];
388 struct in_pktinfo
*pktinfo
;
389 struct sockaddr_in
*sin
;
391 msg
.msg_control
= buf
;
392 msg
.msg_controllen
= sizeof(buf
);
393 cmsg
= CMSG_FIRSTHDR(&msg
);
394 cmsg
->cmsg_level
= SOL_IP
;
395 cmsg
->cmsg_type
= IP_PKTINFO
;
396 cmsg
->cmsg_len
= CMSG_LEN(sizeof(struct in_pktinfo
));
397 pktinfo
= (struct in_pktinfo
*)CMSG_DATA(cmsg
);
398 memset(pktinfo
, 0, sizeof(struct in_pktinfo
));
399 sin
= (struct sockaddr_in
*)src
->get_sockaddr(src
);
400 memcpy(&pktinfo
->ipi_spec_dst
, &sin
->sin_addr
, sizeof(struct in_addr
));
402 #ifdef HAVE_IN6_PKTINFO
405 char buf
[CMSG_SPACE(sizeof(struct in6_pktinfo
))];
406 struct in6_pktinfo
*pktinfo
;
407 struct sockaddr_in6
*sin
;
409 msg
.msg_control
= buf
;
410 msg
.msg_controllen
= sizeof(buf
);
411 cmsg
= CMSG_FIRSTHDR(&msg
);
412 cmsg
->cmsg_level
= SOL_IPV6
;
413 cmsg
->cmsg_type
= IPV6_2292PKTINFO
;
414 cmsg
->cmsg_len
= CMSG_LEN(sizeof(struct in6_pktinfo
));
415 pktinfo
= (struct in6_pktinfo
*)CMSG_DATA(cmsg
);
416 memset(pktinfo
, 0, sizeof(struct in6_pktinfo
));
417 sin
= (struct sockaddr_in6
*)src
->get_sockaddr(src
);
418 memcpy(&pktinfo
->ipi6_addr
, &sin
->sin6_addr
, sizeof(struct in6_addr
));
420 #endif /* HAVE_IN6_PKTINFO */
423 bytes_sent
= sendmsg(skt
, &msg
, 0);
425 if (bytes_sent
!= data
.len
)
427 DBG1(DBG_NET
, "error writing to socket: %s", strerror(errno
));
434 * open a socket to send packets
436 static int open_send_socket(private_socket_raw_socket_t
*this,
437 int family
, u_int16_t port
)
440 int type
= UDP_ENCAP_ESPINUDP
;
441 struct sockaddr_storage addr
;
444 memset(&addr
, 0, sizeof(addr
));
445 addr
.ss_family
= family
;
446 /* precalculate constants depending on address family */
451 struct sockaddr_in
*sin
= (struct sockaddr_in
*)&addr
;
452 htoun32(&sin
->sin_addr
.s_addr
, INADDR_ANY
);
453 htoun16(&sin
->sin_port
, port
);
458 struct sockaddr_in6
*sin6
= (struct sockaddr_in6
*)&addr
;
459 memcpy(&sin6
->sin6_addr
, &in6addr_any
, sizeof(in6addr_any
));
460 htoun16(&sin6
->sin6_port
, port
);
467 skt
= socket(family
, SOCK_DGRAM
, IPPROTO_UDP
);
470 DBG1(DBG_NET
, "could not open send socket: %s", strerror(errno
));
474 if (setsockopt(skt
, SOL_SOCKET
, SO_REUSEADDR
, (void*)&on
, sizeof(on
)) < 0)
476 DBG1(DBG_NET
, "unable to set SO_REUSEADDR on send socket: %s",
482 /* bind the send socket */
483 if (bind(skt
, (struct sockaddr
*)&addr
, sizeof(addr
)) < 0)
485 DBG1(DBG_NET
, "unable to bind send socket: %s",
491 if (family
== AF_INET
)
493 /* enable UDP decapsulation globally, only for one socket needed */
494 if (setsockopt(skt
, SOL_UDP
, UDP_ENCAP
, &type
, sizeof(type
)) < 0)
496 DBG1(DBG_NET
, "unable to set UDP_ENCAP: %s; NAT-T may fail",
501 if (!hydra
->kernel_interface
->bypass_socket(hydra
->kernel_interface
,
504 DBG1(DBG_NET
, "installing bypass policy on send socket failed");
511 * open a socket to receive packets
513 static int open_recv_socket(private_socket_raw_socket_t
*this, int family
)
517 u_int ip_len
, sol
, udp_header
, ike_header
;
519 /* precalculate constants depending on address family */
527 ip_len
= 0; /* IPv6 raw sockets contain no IP header */
534 ike_header
= ip_len
+ UDP_LEN
;
536 /* This filter code filters out all non-IKEv2 traffic on
537 * a SOCK_RAW IP_PROTP_UDP socket. Handling of other
538 * IKE versions is done in pluto.
540 struct sock_filter ikev2_filter_code
[] =
542 /* Destination Port must be either port or natt_port */
543 BPF_STMT(BPF_LD
+BPF_H
+BPF_ABS
, udp_header
+ 2),
544 BPF_JUMP(BPF_JMP
+BPF_JEQ
+BPF_K
, CHARON_UDP_PORT
, 1, 0),
545 BPF_JUMP(BPF_JMP
+BPF_JEQ
+BPF_K
, CHARON_NATT_PORT
, 6, 14),
547 /* IKE version must be 2.x */
548 BPF_STMT(BPF_LD
+BPF_B
+BPF_ABS
, ike_header
+ IKE_VERSION_OFFSET
),
549 BPF_STMT(BPF_ALU
+BPF_RSH
+BPF_K
, 4),
550 BPF_JUMP(BPF_JMP
+BPF_JEQ
+BPF_K
, 2, 0, 11),
551 /* packet length is length in IKEv2 header + ip header + udp header */
552 BPF_STMT(BPF_LD
+BPF_W
+BPF_ABS
, ike_header
+ IKE_LENGTH_OFFSET
),
553 BPF_STMT(BPF_ALU
+BPF_ADD
+BPF_K
, ip_len
+ UDP_LEN
),
554 BPF_STMT(BPF_RET
+BPF_A
, 0),
556 /* nat-t: check for marker */
557 BPF_STMT(BPF_LD
+BPF_W
+BPF_ABS
, ike_header
),
558 BPF_JUMP(BPF_JMP
+BPF_JEQ
+BPF_K
, 0, 0, 6),
559 /* nat-t: IKE version must be 2.x */
560 BPF_STMT(BPF_LD
+BPF_B
+BPF_ABS
, ike_header
+ MARKER_LEN
+ IKE_VERSION_OFFSET
),
561 BPF_STMT(BPF_ALU
+BPF_RSH
+BPF_K
, 4),
562 BPF_JUMP(BPF_JMP
+BPF_JEQ
+BPF_K
, 2, 0, 3),
563 /* nat-t: packet length is length in IKEv2 header + ip header + udp header + non esp marker */
564 BPF_STMT(BPF_LD
+BPF_W
+BPF_ABS
, ike_header
+ MARKER_LEN
+ IKE_LENGTH_OFFSET
),
565 BPF_STMT(BPF_ALU
+BPF_ADD
+BPF_K
, ip_len
+ UDP_LEN
+ MARKER_LEN
),
566 BPF_STMT(BPF_RET
+BPF_A
, 0),
567 /* packet doesn't match, ignore */
568 BPF_STMT(BPF_RET
+BPF_K
, 0),
571 /* Filter struct to use with setsockopt */
572 struct sock_fprog ikev2_filter
= {
573 sizeof(ikev2_filter_code
) / sizeof(struct sock_filter
),
577 /* set up a raw socket */
578 skt
= socket(family
, SOCK_RAW
, IPPROTO_UDP
);
581 DBG1(DBG_NET
, "unable to create raw socket: %s", strerror(errno
));
585 if (setsockopt(skt
, SOL_SOCKET
, SO_ATTACH_FILTER
,
586 &ikev2_filter
, sizeof(ikev2_filter
)) < 0)
588 DBG1(DBG_NET
, "unable to attach IKEv2 filter to raw socket: %s",
594 if (family
== AF_INET6
&&
595 /* we use IPV6_2292PKTINFO, as IPV6_PKTINFO is defined as
596 * 2 or 50 depending on kernel header version */
597 setsockopt(skt
, sol
, IPV6_2292PKTINFO
, &on
, sizeof(on
)) < 0)
599 DBG1(DBG_NET
, "unable to set IPV6_PKTINFO on raw socket: %s",
605 if (!hydra
->kernel_interface
->bypass_socket(hydra
->kernel_interface
,
608 DBG1(DBG_NET
, "installing bypass policy on receive socket failed");
614 METHOD(socket_t
, destroy
, void,
615 private_socket_raw_socket_t
*this)
633 if (this->send4_natt
)
635 close(this->send4_natt
);
637 if (this->send6_natt
)
639 close(this->send6_natt
);
645 * See header for description
647 socket_raw_socket_t
*socket_raw_socket_create()
649 private_socket_raw_socket_t
*this;
655 .receive
= _receiver
,
659 .max_packet
= lib
->settings
->get_int(lib
->settings
,
660 "%s.max_packet", MAX_PACKET
, charon
->name
),
663 this->recv4
= open_recv_socket(this, AF_INET
);
664 if (this->recv4
== 0)
666 DBG1(DBG_NET
, "could not open IPv4 receive socket, IPv4 disabled");
670 this->send4
= open_send_socket(this, AF_INET
, CHARON_UDP_PORT
);
671 if (this->send4
== 0)
673 DBG1(DBG_NET
, "could not open IPv4 send socket, IPv4 disabled");
678 this->send4_natt
= open_send_socket(this, AF_INET
, CHARON_NATT_PORT
);
679 if (this->send4_natt
== 0)
681 DBG1(DBG_NET
, "could not open IPv4 NAT-T send socket");
686 this->recv6
= open_recv_socket(this, AF_INET6
);
687 if (this->recv6
== 0)
689 DBG1(DBG_NET
, "could not open IPv6 receive socket, IPv6 disabled");
693 this->send6
= open_send_socket(this, AF_INET6
, CHARON_UDP_PORT
);
694 if (this->send6
== 0)
696 DBG1(DBG_NET
, "could not open IPv6 send socket, IPv6 disabled");
701 this->send6_natt
= open_send_socket(this, AF_INET6
, CHARON_NATT_PORT
);
702 if (this->send6_natt
== 0)
704 DBG1(DBG_NET
, "could not open IPv6 NAT-T send socket");
709 if (!(this->send4
|| this->send6
) || !(this->recv4
|| this->recv6
))
711 DBG1(DBG_NET
, "could not create any sockets");
716 return &this->public;