using aligned buffers for netlink
authorMartin Willi <martin@strongswan.org>
Fri, 14 Nov 2008 14:23:11 +0000 (14:23 -0000)
committerMartin Willi <martin@strongswan.org>
Fri, 14 Nov 2008 14:23:11 +0000 (14:23 -0000)
src/charon/plugins/kernel_netlink/kernel_netlink_ipsec.c
src/charon/plugins/kernel_netlink/kernel_netlink_net.c
src/charon/plugins/kernel_netlink/kernel_netlink_shared.h

index 79b4882..3714582 100644 (file)
@@ -735,7 +735,7 @@ static status_t get_spi_internal(private_kernel_netlink_ipsec_t *this,
                host_t *src, host_t *dst, u_int8_t proto, u_int32_t min, u_int32_t max,
                u_int32_t reqid, u_int32_t *spi)
 {
-       unsigned char request[NETLINK_BUFFER_SIZE];
+       netlink_buf_t request;
        struct nlmsghdr *hdr, *out;
        struct xfrm_userspi_info *userspi;
        u_int32_t received_spi = 0;
@@ -858,7 +858,7 @@ static status_t add_sa(private_kernel_netlink_ipsec_t *this,
                                           ipsec_mode_t mode, u_int16_t ipcomp, u_int16_t cpi,
                                           bool encap, bool inbound)
 {
-       unsigned char request[NETLINK_BUFFER_SIZE];
+       netlink_buf_t request;
        char *alg_name;
        struct nlmsghdr *hdr;
        struct xfrm_usersa_info *sa;
@@ -1081,7 +1081,7 @@ static status_t get_replay_state(private_kernel_netlink_ipsec_t *this,
                                                  u_int32_t spi, protocol_id_t protocol, host_t *dst,
                                                  struct xfrm_replay_state *replay)
 {
-       unsigned char request[NETLINK_BUFFER_SIZE];
+       netlink_buf_t request;
        struct nlmsghdr *hdr, *out = NULL;
        struct xfrm_aevent_id *out_aevent = NULL, *aevent_id;
        size_t len;
@@ -1168,7 +1168,7 @@ static status_t get_replay_state(private_kernel_netlink_ipsec_t *this,
 static status_t del_sa(private_kernel_netlink_ipsec_t *this, host_t *dst,
                                           u_int32_t spi, protocol_id_t protocol, u_int16_t cpi)
 {
-       unsigned char request[NETLINK_BUFFER_SIZE];
+       netlink_buf_t request;
        struct nlmsghdr *hdr;
        struct xfrm_usersa_id *sa_id;
        
@@ -1211,7 +1211,8 @@ static status_t update_sa(private_kernel_netlink_ipsec_t *this,
                                                  host_t *new_src, host_t *new_dst,
                                                  bool old_encap, bool new_encap)
 {
-       unsigned char request[NETLINK_BUFFER_SIZE], *pos;
+       netlink_buf_t request;
+       u_char *pos;
        struct nlmsghdr *hdr, *out = NULL;
        struct xfrm_usersa_id *sa_id;
        struct xfrm_usersa_info *out_sa = NULL, *sa;
@@ -1397,7 +1398,7 @@ static status_t add_policy(private_kernel_netlink_ipsec_t *this,
        iterator_t *iterator;
        policy_entry_t *current, *policy;
        bool found = FALSE;
-       unsigned char request[NETLINK_BUFFER_SIZE];
+       netlink_buf_t request;
        struct xfrm_userpolicy_info *policy_info;
        struct nlmsghdr *hdr;
        
@@ -1582,7 +1583,7 @@ static status_t query_policy(private_kernel_netlink_ipsec_t *this,
                                                         traffic_selector_t *dst_ts,
                                                         policy_dir_t direction, u_int32_t *use_time)
 {
-       unsigned char request[NETLINK_BUFFER_SIZE];
+       netlink_buf_t request;
        struct nlmsghdr *out = NULL, *hdr;
        struct xfrm_userpolicy_id *policy_id;
        struct xfrm_userpolicy_info *policy = NULL;
@@ -1654,7 +1655,7 @@ static status_t del_policy(private_kernel_netlink_ipsec_t *this,
 {
        policy_entry_t *current, policy, *to_delete = NULL;
        route_entry_t *route;
-       unsigned char request[NETLINK_BUFFER_SIZE];
+       netlink_buf_t request;
        struct nlmsghdr *hdr;
        struct xfrm_userpolicy_id *policy_id;
        enumerator_t *enumerator;
index 10858ea..40036e1 100644 (file)
@@ -761,7 +761,7 @@ static bool addr_in_subnet(chunk_t addr, chunk_t net, int net_len)
 static host_t *get_route(private_kernel_netlink_net_t *this, host_t *dest,
                                                 bool nexthop, host_t *candidate)
 {
-       unsigned char request[NETLINK_BUFFER_SIZE];
+       netlink_buf_t request;
        struct nlmsghdr *hdr, *out, *current;
        struct rtmsg *msg;
        chunk_t chunk;
@@ -948,7 +948,7 @@ static host_t* get_nexthop(private_kernel_netlink_net_t *this, host_t *dest)
 static status_t manage_ipaddr(private_kernel_netlink_net_t *this, int nlmsg_type,
                                                          int flags, int if_index, host_t *ip)
 {
-       unsigned char request[NETLINK_BUFFER_SIZE];
+       netlink_buf_t request;
        struct nlmsghdr *hdr;
        struct ifaddrmsg *msg;
        chunk_t chunk;
@@ -1116,7 +1116,7 @@ static status_t manage_srcroute(private_kernel_netlink_net_t *this, int nlmsg_ty
                                                                int flags, chunk_t dst_net, u_int8_t prefixlen,
                                                                host_t *gateway, host_t *src_ip, char *if_name)
 {
-       unsigned char request[NETLINK_BUFFER_SIZE];
+       netlink_buf_t request;
        struct nlmsghdr *hdr;
        struct rtmsg *msg;
        int ifindex;
@@ -1196,7 +1196,7 @@ status_t del_route(private_kernel_netlink_net_t *this, chunk_t dst_net,
  */
 static status_t init_address_list(private_kernel_netlink_net_t *this)
 {
-       char request[NETLINK_BUFFER_SIZE];
+       netlink_buf_t request;
        struct nlmsghdr *out, *current, *in;
        struct rtgenmsg *msg;
        size_t len;
@@ -1288,7 +1288,7 @@ static status_t init_address_list(private_kernel_netlink_net_t *this)
 static status_t manage_rule(private_kernel_netlink_net_t *this, int nlmsg_type,
                                                        u_int32_t table, u_int32_t prio)
 {
-       unsigned char request[NETLINK_BUFFER_SIZE];
+       netlink_buf_t request;
        struct nlmsghdr *hdr;
        struct rtmsg *msg;
        chunk_t chunk;
index 84a0813..6918793 100644 (file)
 
 #include <library.h>
 
-#define NETLINK_BUFFER_SIZE 1024
+#include <linux/rtnetlink.h>
+
+/**
+ * General purpose netlink buffer.
+ *
+ * 1024 byte is currently sufficient for all operations. Some platform
+ * require an enforced aligment to four bytes (e.g. ARM).
+ */
+typedef u_char netlink_buf_t[1024] __attribute__((aligned(RTA_ALIGNTO)));
 
 typedef struct netlink_socket_t netlink_socket_t;