4 * @brief Implementation of socket_t.
9 * Copyright (C) 2006 Tobias Brunner, Daniel Roethlisberger
10 * Copyright (C) 2005-2006 Martin Willi
11 * Copyright (C) 2005 Jan Hutter
12 * Hochschule fuer Technik Rapperswil
14 * This program is free software; you can redistribute it and/or modify it
15 * under the terms of the GNU General Public License as published by the
16 * Free Software Foundation; either version 2 of the License, or (at your
17 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
19 * This program is distributed in the hope that it will be useful, but
20 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
21 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
26 #include <sys/types.h>
27 #include <sys/socket.h>
33 #include <sys/ioctl.h>
34 #include <netinet/in.h>
35 #include <netinet/ip.h>
36 #include <netinet/ip6.h>
37 #include <netinet/udp.h>
38 #include <linux/ipsec.h>
39 #include <linux/filter.h>
47 /* constants for packet handling */
48 #define IP_LEN sizeof(struct iphdr)
49 #define IP6_LEN sizeof(struct ip6_hdr)
50 #define UDP_LEN sizeof(struct udphdr)
51 #define MARKER_LEN sizeof(u_int32_t)
53 /* offsets for packet handling */
54 #define IP_PROTO_OFFSET 9
55 #define IP6_PROTO_OFFSET 6
56 #define IKE_VERSION_OFFSET 17
57 #define IKE_LENGTH_OFFSET 24
60 #ifndef IP_IPSEC_POLICY
61 #define IP_IPSEC_POLICY 16
62 #endif /*IP_IPSEC_POLICY*/
64 /* from linux/udp.h */
69 #ifndef UDP_ENCAP_ESPINUDP
70 #define UDP_ENCAP_ESPINUDP 2
71 #endif /*UDP_ENCAP_ESPINUDP*/
73 /* needed for older kernel headers */
74 #ifndef IPV6_2292PKTINFO
75 #define IPV6_2292PKTINFO 2
76 #endif /*IPV6_2292PKTINFO*/
78 typedef struct private_socket_t private_socket_t
;
81 * Private data of an socket_t object
83 struct private_socket_t
{
100 * raw receiver socket for IPv4
105 * raw receiver socket for IPv6
110 * send socket on regular port for IPv4
115 * send socket on regular port for IPv6
120 * send socket on nat-t port for IPv4
125 * send socket on nat-t port for IPv6
131 * implementation of socket_t.receive
133 static status_t
receiver(private_socket_t
*this, packet_t
**packet
)
135 char buffer
[MAX_PACKET
];
139 host_t
*source
= NULL
, *dest
= NULL
;
141 int data_offset
, oldstate
;
148 FD_SET(this->recv4
, &rfds
);
152 FD_SET(this->recv6
, &rfds
);
155 DBG2(DBG_NET
, "waiting for data on raw sockets");
157 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE
, &oldstate
);
158 if (select(max(this->recv4
, this->recv6
) + 1, &rfds
, NULL
, NULL
, NULL
) <= 0)
160 pthread_setcancelstate(oldstate
, NULL
);
163 pthread_setcancelstate(oldstate
, NULL
);
165 if (this->recv4
&& FD_ISSET(this->recv4
, &rfds
))
167 /* IPv4 raw sockets return the IP header. We read src/dest
168 * information directly from the raw header */
170 struct sockaddr_in src
, dst
;
172 bytes_read
= recv(this->recv4
, buffer
, MAX_PACKET
, 0);
175 DBG1(DBG_NET
, "error reading from IPv4 socket: %m");
178 DBG3(DBG_NET
, "received IPv4 packet %b", buffer
, bytes_read
);
180 /* read source/dest from raw IP/UDP header */
181 if (bytes_read
< IP_LEN
+ UDP_LEN
+ MARKER_LEN
)
183 DBG1(DBG_NET
, "received IPv4 packet too short (%d bytes)",
187 ip
= (struct iphdr
*) buffer
;
188 udp
= (struct udphdr
*) (buffer
+ IP_LEN
);
189 src
.sin_family
= AF_INET
;
190 src
.sin_addr
.s_addr
= ip
->saddr
;
191 src
.sin_port
= udp
->source
;
192 dst
.sin_family
= AF_INET
;
193 dst
.sin_addr
.s_addr
= ip
->daddr
;
194 dst
.sin_port
= udp
->dest
;
195 source
= host_create_from_sockaddr((sockaddr_t
*)&src
);
196 dest
= host_create_from_sockaddr((sockaddr_t
*)&dst
);
198 pkt
= packet_create();
199 pkt
->set_source(pkt
, source
);
200 pkt
->set_destination(pkt
, dest
);
201 DBG2(DBG_NET
, "received packet: from %#H to %#H", source
, dest
);
202 data_offset
= IP_LEN
+ UDP_LEN
;
203 /* remove non esp marker */
204 if (dest
->get_port(dest
) == this->natt_port
)
206 data_offset
+= MARKER_LEN
;
209 data
.len
= bytes_read
- data_offset
;
210 data
.ptr
= malloc(data
.len
);
211 memcpy(data
.ptr
, buffer
+ data_offset
, data
.len
);
212 pkt
->set_data(pkt
, data
);
214 else if (this->recv6
&& FD_ISSET(this->recv6
, &rfds
))
216 /* IPv6 raw sockets return no IP header. We must query
217 * src/dest via socket options/ancillary data */
219 struct cmsghdr
*cmsgptr
;
220 struct sockaddr_in6 src
, dst
;
225 msg
.msg_namelen
= sizeof(src
);
226 iov
.iov_base
= buffer
;
227 iov
.iov_len
= sizeof(buffer
);
230 msg
.msg_control
= ancillary
;
231 msg
.msg_controllen
= sizeof(ancillary
);
234 bytes_read
= recvmsg(this->recv6
, &msg
, 0);
237 DBG1(DBG_NET
, "error reading from IPv6 socket: %m");
240 DBG3(DBG_NET
, "received IPv6 packet %b", buffer
, bytes_read
);
242 if (bytes_read
< IP_LEN
+ UDP_LEN
+ MARKER_LEN
)
244 DBG3(DBG_NET
, "received IPv6 packet too short (%d bytes)",
249 /* read ancillary data to get destination address */
250 for (cmsgptr
= CMSG_FIRSTHDR(&msg
); cmsgptr
!= NULL
;
251 cmsgptr
= CMSG_NXTHDR(&msg
, cmsgptr
))
253 if (cmsgptr
->cmsg_len
== 0)
255 DBG1(DBG_NET
, "error reading IPv6 ancillary data");
258 if (cmsgptr
->cmsg_level
== SOL_IPV6
&&
259 cmsgptr
->cmsg_type
== IPV6_2292PKTINFO
)
261 struct in6_pktinfo
*pktinfo
;
262 pktinfo
= (struct in6_pktinfo
*)CMSG_DATA(cmsgptr
);
264 memset(&dst
, 0, sizeof(dst
));
265 memcpy(&dst
.sin6_addr
, &pktinfo
->ipi6_addr
, sizeof(dst
.sin6_addr
));
266 dst
.sin6_family
= AF_INET6
;
267 udp
= (struct udphdr
*) (buffer
);
268 dst
.sin6_port
= udp
->dest
;
269 src
.sin6_port
= udp
->source
;
270 dest
= host_create_from_sockaddr((sockaddr_t
*)&dst
);
273 /* ancillary data missing? */
276 DBG1(DBG_NET
, "error reading IPv6 packet header");
280 source
= host_create_from_sockaddr((sockaddr_t
*)&src
);
282 pkt
= packet_create();
283 pkt
->set_source(pkt
, source
);
284 pkt
->set_destination(pkt
, dest
);
285 DBG2(DBG_NET
, "received packet: from %#H to %#H", source
, dest
);
286 data_offset
= UDP_LEN
;
287 /* remove non esp marker */
288 if (dest
->get_port(dest
) == this->natt_port
)
290 data_offset
+= MARKER_LEN
;
293 data
.len
= bytes_read
- data_offset
;
294 data
.ptr
= malloc(data
.len
);
295 memcpy(data
.ptr
, buffer
+ data_offset
, data
.len
);
296 pkt
->set_data(pkt
, data
);
300 /* oops, shouldn't happen */
310 * implementation of socket_t.send
312 status_t
sender(private_socket_t
*this, packet_t
*packet
)
314 int sport
, skt
, family
;
316 chunk_t data
, marked
;
319 src
= packet
->get_source(packet
);
320 dst
= packet
->get_destination(packet
);
321 data
= packet
->get_data(packet
);
323 DBG2(DBG_NET
, "sending packet: from %#H to %#H", src
, dst
);
326 sport
= src
->get_port(src
);
327 family
= dst
->get_family(dst
);
328 if (sport
== this->port
)
330 if (family
== AF_INET
)
339 else if (sport
== this->natt_port
)
341 if (family
== AF_INET
)
343 skt
= this->send4_natt
;
347 skt
= this->send6_natt
;
349 /* NAT keepalives without marker */
350 if (data
.len
!= 1 || data
.ptr
[0] != 0xFF)
352 /* add non esp marker to packet */
353 if (data
.len
> MAX_PACKET
- MARKER_LEN
)
355 DBG1(DBG_NET
, "unable to send packet: it's too big (%d bytes)",
359 marked
= chunk_alloc(data
.len
+ MARKER_LEN
);
360 memset(marked
.ptr
, 0, MARKER_LEN
);
361 memcpy(marked
.ptr
+ MARKER_LEN
, data
.ptr
, data
.len
);
362 /* let the packet do the clean up for us */
363 packet
->set_data(packet
, marked
);
369 DBG1(DBG_NET
, "unable to locate a send socket for port %d", sport
);
373 bytes_sent
= sendto(skt
, data
.ptr
, data
.len
, 0,
374 dst
->get_sockaddr(dst
), *(dst
->get_sockaddr_len(dst
)));
376 if (bytes_sent
!= data
.len
)
378 DBG1(DBG_NET
, "error writing to socket: %m");
385 * implements socket_t.is_local_address
387 static bool is_local_address(private_socket_t
*this, host_t
*host
, char **dev
)
389 struct ifaddrs
*list
;
393 if (getifaddrs(&list
) < 0)
398 for (cur
= list
; cur
!= NULL
; cur
= cur
->ifa_next
)
400 if (!(cur
->ifa_flags
& IFF_UP
))
402 /* ignore interface which are down */
406 if (cur
->ifa_addr
== NULL
||
407 cur
->ifa_addr
->sa_family
!= host
->get_family(host
))
409 /* no match in family */
413 switch (cur
->ifa_addr
->sa_family
)
417 struct sockaddr_in
*listed
, *requested
;
418 listed
= (struct sockaddr_in
*)cur
->ifa_addr
;
419 requested
= (struct sockaddr_in
*)host
->get_sockaddr(host
);
420 if (listed
->sin_addr
.s_addr
== requested
->sin_addr
.s_addr
)
428 struct sockaddr_in6
*listed
, *requested
;
429 listed
= (struct sockaddr_in6
*)cur
->ifa_addr
;
430 requested
= (struct sockaddr_in6
*)host
->get_sockaddr(host
);
431 if (memcmp(&listed
->sin6_addr
, &requested
->sin6_addr
,
432 sizeof(listed
->sin6_addr
)) == 0)
444 if (dev
&& cur
->ifa_name
)
446 /* return interface name, if requested */
447 *dev
= strdup(cur
->ifa_name
);
458 * implements socket_t.create_local_address_list
460 static linked_list_t
* create_local_address_list(private_socket_t
*this)
462 struct ifaddrs
*list
;
465 linked_list_t
*result
= linked_list_create();
467 if (getifaddrs(&list
) < 0)
472 for (cur
= list
; cur
!= NULL
; cur
= cur
->ifa_next
)
474 if (!(cur
->ifa_flags
& IFF_UP
))
476 /* ignore interface which are down */
480 host
= host_create_from_sockaddr(cur
->ifa_addr
);
483 /* we use always the IKEv2 port. This is relevant for
484 * natd payload hashing. */
485 host
->set_port(host
, this->port
);
486 result
->insert_last(result
, host
);
494 * open a socket to send packets
496 static int open_send_socket(private_socket_t
*this, int family
, u_int16_t port
)
499 int type
= UDP_ENCAP_ESPINUDP
;
500 struct sockaddr_storage addr
;
501 u_int sol
, ipsec_policy
;
502 struct sadb_x_policy policy
;
505 memset(&addr
, 0, sizeof(addr
));
506 /* precalculate constants depending on address family */
511 struct sockaddr_in
*sin
= (struct sockaddr_in
*)&addr
;
512 sin
->sin_family
= AF_INET
;
513 sin
->sin_addr
.s_addr
= INADDR_ANY
;
514 sin
->sin_port
= htons(port
);
516 ipsec_policy
= IP_IPSEC_POLICY
;
521 struct sockaddr_in6
*sin6
= (struct sockaddr_in6
*)&addr
;
522 sin6
->sin6_family
= AF_INET6
;
523 memcpy(&sin6
->sin6_addr
, &in6addr_any
, sizeof(in6addr_any
));
524 sin6
->sin6_port
= htons(port
);
526 ipsec_policy
= IPV6_IPSEC_POLICY
;
533 skt
= socket(family
, SOCK_DGRAM
, IPPROTO_UDP
);
536 DBG1(DBG_NET
, "could not open send socket: %m");
540 if (setsockopt(skt
, SOL_SOCKET
, SO_REUSEADDR
, (void*)&on
, sizeof(on
)) < 0)
542 DBG1(DBG_NET
, "unable to set SO_REUSEADDR on send socket: %m");
547 /* bypass outgoung IKE traffic on send socket */
548 policy
.sadb_x_policy_len
= sizeof(policy
) / sizeof(u_int64_t
);
549 policy
.sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
550 policy
.sadb_x_policy_type
= IPSEC_POLICY_BYPASS
;
551 policy
.sadb_x_policy_dir
= IPSEC_DIR_OUTBOUND
;
552 policy
.sadb_x_policy_reserved
= 0;
553 policy
.sadb_x_policy_id
= 0;
554 policy
.sadb_x_policy_priority
= 0;
556 if (setsockopt(skt
, sol
, ipsec_policy
, &policy
, sizeof(policy
)) < 0)
558 DBG1(DBG_NET
, "unable to set IPSEC_POLICY on send socket: %m");
563 /* We don't receive packets on the send socket, but we need a INBOUND policy.
564 * Otherwise, UDP decapsulation does not work!!! */
565 policy
.sadb_x_policy_dir
= IPSEC_DIR_INBOUND
;
566 if (setsockopt(skt
, sol
, ipsec_policy
, &policy
, sizeof(policy
)) < 0)
568 DBG1(DBG_NET
, "unable to set IPSEC_POLICY on send socket: %m");
573 /* bind the send socket */
574 if (bind(skt
, (struct sockaddr
*)&addr
, sizeof(addr
)) < 0)
576 DBG1(DBG_NET
, "unable to bind send socket: %m");
581 if (family
== AF_INET
)
583 /* enable UDP decapsulation globally, only for one socket needed */
584 if (setsockopt(skt
, SOL_UDP
, UDP_ENCAP
, &type
, sizeof(type
)) < 0)
586 DBG1(DBG_NET
, "unable to set UDP_ENCAP: %m; NAT-T may fail");
594 * open a socket to receive packets
596 static int open_recv_socket(private_socket_t
*this, int family
)
600 u_int proto_offset
, ip_len
, sol
, ipsec_policy
, udp_header
, ike_header
;
601 struct sadb_x_policy policy
;
603 /* precalculate constants depending on address family */
607 proto_offset
= IP_PROTO_OFFSET
;
610 ipsec_policy
= IP_IPSEC_POLICY
;
613 proto_offset
= IP6_PROTO_OFFSET
;
614 ip_len
= 0; /* IPv6 raw sockets contain no IP header */
616 ipsec_policy
= IPV6_IPSEC_POLICY
;
622 ike_header
= ip_len
+ UDP_LEN
;
624 /* This filter code filters out all non-IKEv2 traffic on
625 * a SOCK_RAW IP_PROTP_UDP socket. Handling of other
626 * IKE versions is done in pluto.
628 struct sock_filter ikev2_filter_code
[] =
630 /* Destination Port must be either port or natt_port */
631 BPF_STMT(BPF_LD
+BPF_H
+BPF_ABS
, udp_header
+ 2),
632 BPF_JUMP(BPF_JMP
+BPF_JEQ
+BPF_K
, this->port
, 1, 0),
633 BPF_JUMP(BPF_JMP
+BPF_JEQ
+BPF_K
, this->natt_port
, 5, 12),
635 /* IKE version must be 2.0 */
636 BPF_STMT(BPF_LD
+BPF_B
+BPF_ABS
, ike_header
+ IKE_VERSION_OFFSET
),
637 BPF_JUMP(BPF_JMP
+BPF_JEQ
+BPF_K
, 0x20, 0, 10),
638 /* packet length is length in IKEv2 header + ip header + udp header */
639 BPF_STMT(BPF_LD
+BPF_W
+BPF_ABS
, ike_header
+ IKE_LENGTH_OFFSET
),
640 BPF_STMT(BPF_ALU
+BPF_ADD
+BPF_K
, ip_len
+ UDP_LEN
),
641 BPF_STMT(BPF_RET
+BPF_A
, 0),
643 /* nat-t: check for marker */
644 BPF_STMT(BPF_LD
+BPF_W
+BPF_ABS
, ike_header
),
645 BPF_JUMP(BPF_JMP
+BPF_JEQ
+BPF_K
, 0, 0, 5),
646 /* nat-t: IKE version must be 2.0 */
647 BPF_STMT(BPF_LD
+BPF_B
+BPF_ABS
, ike_header
+ MARKER_LEN
+ IKE_VERSION_OFFSET
),
648 BPF_JUMP(BPF_JMP
+BPF_JEQ
+BPF_K
, 0x20, 0, 3),
649 /* nat-t: packet length is length in IKEv2 header + ip header + udp header + non esp marker */
650 BPF_STMT(BPF_LD
+BPF_W
+BPF_ABS
, ike_header
+ MARKER_LEN
+ IKE_LENGTH_OFFSET
),
651 BPF_STMT(BPF_ALU
+BPF_ADD
+BPF_K
, ip_len
+ UDP_LEN
+ MARKER_LEN
),
652 BPF_STMT(BPF_RET
+BPF_A
, 0),
653 /* packet doesn't match, ignore */
654 BPF_STMT(BPF_RET
+BPF_K
, 0),
657 /* Filter struct to use with setsockopt */
658 struct sock_fprog ikev2_filter
= {
659 sizeof(ikev2_filter_code
) / sizeof(struct sock_filter
),
663 /* set up a raw socket */
664 skt
= socket(family
, SOCK_RAW
, IPPROTO_UDP
);
667 DBG1(DBG_NET
, "unable to create raw socket: %m");
671 if (setsockopt(skt
, SOL_SOCKET
, SO_ATTACH_FILTER
,
672 &ikev2_filter
, sizeof(ikev2_filter
)) < 0)
674 DBG1(DBG_NET
, "unable to attach IKEv2 filter to raw socket: %m");
679 if (family
== AF_INET6
&&
680 /* we use IPV6_2292PKTINFO, as IPV6_PKTINFO is defined as
681 * 2 or 50 depending on kernel header version */
682 setsockopt(skt
, sol
, IPV6_2292PKTINFO
, &on
, sizeof(on
)) < 0)
684 DBG1(DBG_NET
, "unable to set IPV6_PKTINFO on raw socket: %m");
689 /* bypass incomining IKE traffic on this socket */
690 policy
.sadb_x_policy_len
= sizeof(policy
) / sizeof(u_int64_t
);
691 policy
.sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
692 policy
.sadb_x_policy_type
= IPSEC_POLICY_BYPASS
;
693 policy
.sadb_x_policy_dir
= IPSEC_DIR_INBOUND
;
694 policy
.sadb_x_policy_reserved
= 0;
695 policy
.sadb_x_policy_id
= 0;
696 policy
.sadb_x_policy_priority
= 0;
698 if (setsockopt(skt
, sol
, ipsec_policy
, &policy
, sizeof(policy
)) < 0)
700 DBG1(DBG_NET
, "unable to set IPSEC_POLICY on raw socket: %m");
709 * implementation of socket_t.destroy
711 static void destroy(private_socket_t
*this)
729 if (this->send4_natt
)
731 close(this->send4_natt
);
733 if (this->send6_natt
)
735 close(this->send6_natt
);
741 * See header for description
743 socket_t
*socket_create(u_int16_t port
, u_int16_t natt_port
)
745 private_socket_t
*this = malloc_thing(private_socket_t
);
747 /* public functions */
748 this->public.send
= (status_t(*)(socket_t
*, packet_t
*))sender
;
749 this->public.receive
= (status_t(*)(socket_t
*, packet_t
**))receiver
;
750 this->public.is_local_address
= (bool(*)(socket_t
*, host_t
*,char**))is_local_address
;
751 this->public.create_local_address_list
= (linked_list_t
*(*)(socket_t
*))create_local_address_list
;
752 this->public.destroy
= (void(*)(socket_t
*)) destroy
;
755 this->natt_port
= natt_port
;
760 this->send4_natt
= 0;
761 this->send6_natt
= 0;
763 this->recv4
= open_recv_socket(this, AF_INET
);
764 if (this->recv4
== 0)
766 DBG1(DBG_NET
, "could not open IPv4 receive socket, IPv4 disabled");
770 this->send4
= open_send_socket(this, AF_INET
, this->port
);
771 if (this->send4
== 0)
773 DBG1(DBG_NET
, "could not open IPv4 send socket, IPv4 disabled");
778 this->send4_natt
= open_send_socket(this, AF_INET
, this->natt_port
);
779 if (this->send4_natt
== 0)
781 DBG1(DBG_NET
, "could not open IPv4 NAT-T send socket");
786 this->recv6
= open_recv_socket(this, AF_INET6
);
787 if (this->recv6
== 0)
789 DBG1(DBG_NET
, "could not open IPv6 receive socket, IPv6 disabled");
793 this->send6
= open_send_socket(this, AF_INET6
, this->port
);
794 if (this->send6
== 0)
796 DBG1(DBG_NET
, "could not open IPv6 send socket, IPv6 disabled");
801 this->send6_natt
= open_send_socket(this, AF_INET6
, this->natt_port
);
802 if (this->send6_natt
== 0)
804 DBG1(DBG_NET
, "could not open IPv6 NAT-T send socket");
809 if (!(this->send4
|| this->send6
) || !(this->recv4
|| this->recv6
))
811 DBG1(DBG_NET
, "could not create any sockets");
813 charon
->kill(charon
, "socket initialization failed");
816 return (socket_t
*)this;