summaryrefslogtreecommitdiff
path: root/src/libcharon/plugins/kernel_netlink
diff options
context:
space:
mode:
authorYves-Alexis Perez <corsac@debian.org>2018-06-04 09:59:21 +0200
committerYves-Alexis Perez <corsac@debian.org>2018-06-04 09:59:21 +0200
commit51a71ee15c1bcf0e82f363a16898f571e211f9c3 (patch)
tree2a03e117d072c55cfe2863d26b73e64d933e7ad8 /src/libcharon/plugins/kernel_netlink
parent7793611ee71b576dd9c66dee327349fa64e38740 (diff)
downloadvyos-strongswan-51a71ee15c1bcf0e82f363a16898f571e211f9c3.tar.gz
vyos-strongswan-51a71ee15c1bcf0e82f363a16898f571e211f9c3.zip
New upstream version 5.6.3
Diffstat (limited to 'src/libcharon/plugins/kernel_netlink')
-rw-r--r--src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.c262
-rw-r--r--src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.h2
-rw-r--r--src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c188
-rw-r--r--src/libcharon/plugins/kernel_netlink/kernel_netlink_net.h2
-rw-r--r--src/libcharon/plugins/kernel_netlink/kernel_netlink_plugin.c2
-rw-r--r--src/libcharon/plugins/kernel_netlink/kernel_netlink_plugin.h2
-rw-r--r--src/libcharon/plugins/kernel_netlink/kernel_netlink_shared.c2
-rw-r--r--src/libcharon/plugins/kernel_netlink/kernel_netlink_shared.h4
8 files changed, 370 insertions, 94 deletions
diff --git a/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.c b/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.c
index 4e79dfced..4926c3de8 100644
--- a/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.c
+++ b/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006-2017 Tobias Brunner
+ * Copyright (C) 2006-2018 Tobias Brunner
* Copyright (C) 2005-2009 Martin Willi
* Copyright (C) 2008-2016 Andreas Steffen
* Copyright (C) 2006-2007 Fabian Hartmann, Noah Heusser
@@ -17,16 +17,40 @@
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
+/*
+ * Copyright (C) 2018 Mellanox Technologies.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/socket.h>
+#include <sys/ioctl.h>
#include <stdint.h>
#include <linux/ipsec.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <linux/xfrm.h>
#include <linux/udp.h>
+#include <linux/ethtool.h>
+#include <linux/sockios.h>
#include <net/if.h>
#include <unistd.h>
#include <time.h>
@@ -237,6 +261,27 @@ static kernel_algorithm_t compression_algs[] = {
};
/**
+ * IPsec HW offload state in kernel
+ */
+typedef enum {
+ NL_OFFLOAD_UNKNOWN,
+ NL_OFFLOAD_UNSUPPORTED,
+ NL_OFFLOAD_SUPPORTED
+} nl_offload_state_t;
+
+/**
+ * Global metadata used for IPsec HW offload
+ */
+static struct {
+ /** bit in feature set */
+ u_int bit;
+ /** total number of device feature blocks */
+ u_int total_blocks;
+ /** determined HW offload state */
+ nl_offload_state_t state;
+} netlink_hw_offload;
+
+/**
* Look up a kernel algorithm name and its key size
*/
static const char* lookup_algorithm(transform_type_t type, int ikev2)
@@ -1290,6 +1335,193 @@ static bool add_mark(struct nlmsghdr *hdr, int buflen, mark_t mark)
return TRUE;
}
+/**
+ * Check if kernel supports HW offload
+ */
+static void netlink_find_offload_feature(const char *ifname, int query_socket)
+{
+ struct ethtool_sset_info *sset_info;
+ struct ethtool_gstrings *cmd = NULL;
+ struct ifreq ifr;
+ uint32_t sset_len, i;
+ char *str;
+ int err;
+
+ netlink_hw_offload.state = NL_OFFLOAD_UNSUPPORTED;
+
+ /* determine number of device features */
+ INIT_EXTRA(sset_info, sizeof(uint32_t),
+ .cmd = ETHTOOL_GSSET_INFO,
+ .sset_mask = 1ULL << ETH_SS_FEATURES,
+ );
+ strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+ ifr.ifr_name[IFNAMSIZ-1] = '\0';
+ ifr.ifr_data = (void*)sset_info;
+
+ err = ioctl(query_socket, SIOCETHTOOL, &ifr);
+ if (err || sset_info->sset_mask != 1ULL << ETH_SS_FEATURES)
+ {
+ goto out;
+ }
+ sset_len = sset_info->data[0];
+
+ /* retrieve names of device features */
+ INIT_EXTRA(cmd, ETH_GSTRING_LEN * sset_len,
+ .cmd = ETHTOOL_GSTRINGS,
+ .string_set = ETH_SS_FEATURES,
+ );
+ strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+ ifr.ifr_name[IFNAMSIZ-1] = '\0';
+ ifr.ifr_data = (void*)cmd;
+
+ err = ioctl(query_socket, SIOCETHTOOL, &ifr);
+ if (err)
+ {
+ goto out;
+ }
+
+ /* look for the ESP_HW feature bit */
+ str = (char*)cmd->data;
+ for (i = 0; i < cmd->len; i++)
+ {
+ if (strneq(str, "esp-hw-offload", ETH_GSTRING_LEN))
+ {
+ netlink_hw_offload.bit = i;
+ netlink_hw_offload.total_blocks = (sset_len + 31) / 32;
+ netlink_hw_offload.state = NL_OFFLOAD_SUPPORTED;
+ break;
+ }
+ str += ETH_GSTRING_LEN;
+ }
+
+out:
+ free(sset_info);
+ free(cmd);
+}
+
+/**
+ * Check if interface supported HW offload
+ */
+static bool netlink_detect_offload(const char *ifname)
+{
+ struct ethtool_gfeatures *cmd;
+ uint32_t feature_bit;
+ struct ifreq ifr;
+ int query_socket;
+ int block;
+ bool ret = FALSE;
+
+ query_socket = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_XFRM);
+ if (query_socket < 0)
+ {
+ return FALSE;
+ }
+
+ /* kernel requires a real interface in order to query the kernel-wide
+ * capability, so we do it here on first invocation.
+ */
+ if (netlink_hw_offload.state == NL_OFFLOAD_UNKNOWN)
+ {
+ netlink_find_offload_feature(ifname, query_socket);
+ }
+ if (netlink_hw_offload.state == NL_OFFLOAD_UNSUPPORTED)
+ {
+ DBG1(DBG_KNL, "HW offload is not supported by kernel");
+ goto out;
+ }
+
+ /* feature is supported by kernel, query device features */
+ INIT_EXTRA(cmd, sizeof(cmd->features[0]) * netlink_hw_offload.total_blocks,
+ .cmd = ETHTOOL_GFEATURES,
+ .size = netlink_hw_offload.total_blocks,
+ );
+ strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+ ifr.ifr_name[IFNAMSIZ-1] = '\0';
+ ifr.ifr_data = (void*)cmd;
+
+ if (ioctl(query_socket, SIOCETHTOOL, &ifr))
+ {
+ goto out_free;
+ }
+
+ block = netlink_hw_offload.bit / 32;
+ feature_bit = 1U << (netlink_hw_offload.bit % 32);
+ if (cmd->features[block].active & feature_bit)
+ {
+ ret = TRUE;
+ }
+
+out_free:
+ free(cmd);
+ if (!ret)
+ {
+ DBG1(DBG_KNL, "HW offload is not supported by device");
+ }
+out:
+ close(query_socket);
+ return ret;
+}
+
+/**
+ * There are 3 HW offload configuration values:
+ * 1. HW_OFFLOAD_NO : Do not configure HW offload.
+ * 2. HW_OFFLOAD_YES : Configure HW offload.
+ * Fail SA addition if offload is not supported.
+ * 3. HW_OFFLOAD_AUTO : Configure HW offload if supported by the kernel
+ * and device.
+ * Do not fail SA addition otherwise.
+ */
+static bool config_hw_offload(kernel_ipsec_sa_id_t *id,
+ kernel_ipsec_add_sa_t *data, struct nlmsghdr *hdr,
+ int buflen)
+{
+ host_t *local = data->inbound ? id->dst : id->src;
+ struct xfrm_user_offload *offload;
+ bool hw_offload_yes, ret = FALSE;
+ char *ifname;
+
+ /* do Ipsec configuration without offload */
+ if (data->hw_offload == HW_OFFLOAD_NO)
+ {
+ return TRUE;
+ }
+
+ hw_offload_yes = (data->hw_offload == HW_OFFLOAD_YES);
+
+ if (!charon->kernel->get_interface(charon->kernel, local, &ifname))
+ {
+ return !hw_offload_yes;
+ }
+
+ /* check if interface supports hw_offload */
+ if (!netlink_detect_offload(ifname))
+ {
+ ret = !hw_offload_yes;
+ goto out;
+ }
+
+ /* activate HW offload */
+ offload = netlink_reserve(hdr, buflen,
+ XFRMA_OFFLOAD_DEV, sizeof(*offload));
+ if (!offload)
+ {
+ ret = !hw_offload_yes;
+ goto out;
+ }
+ offload->ifindex = if_nametoindex(ifname);
+ if (local->get_family(local) == AF_INET6)
+ {
+ offload->flags |= XFRM_OFFLOAD_IPV6;
+ }
+ offload->flags |= data->inbound ? XFRM_OFFLOAD_INBOUND : 0;
+
+ ret = TRUE;
+
+out:
+ free(ifname);
+ return ret;
+}
+
METHOD(kernel_ipsec_t, add_sa, status_t,
private_kernel_netlink_ipsec_t *this, kernel_ipsec_sa_id_t *id,
kernel_ipsec_add_sa_t *data)
@@ -1650,30 +1882,12 @@ METHOD(kernel_ipsec_t, add_sa, status_t,
data->replay_window);
sa->replay_window = data->replay_window;
}
- if (data->hw_offload)
- {
- host_t *local = data->inbound ? id->dst : id->src;
- char *ifname;
- if (charon->kernel->get_interface(charon->kernel, local, &ifname))
- {
- struct xfrm_user_offload *offload;
-
- offload = netlink_reserve(hdr, sizeof(request),
- XFRMA_OFFLOAD_DEV, sizeof(*offload));
- if (!offload)
- {
- free(ifname);
- goto failed;
- }
- offload->ifindex = if_nametoindex(ifname);
- if (local->get_family(local) == AF_INET6)
- {
- offload->flags |= XFRM_OFFLOAD_IPV6;
- }
- offload->flags |= data->inbound ? XFRM_OFFLOAD_INBOUND : 0;
- free(ifname);
- }
+ DBG2(DBG_KNL, " HW offload: %N", hw_offload_names, data->hw_offload);
+ if (!config_hw_offload(id, data, hdr, sizeof(request)))
+ {
+ DBG1(DBG_KNL, "failed to configure HW offload");
+ goto failed;
}
}
diff --git a/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.h b/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.h
index 3a45cce06..bafdea0b9 100644
--- a/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.h
+++ b/src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.h
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2008 Tobias Brunner
- * Hochschule fuer Technik Rapperswil
+ * HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
diff --git a/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c b/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c
index c3f92f500..b6eb54370 100644
--- a/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c
+++ b/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c
@@ -1797,7 +1797,7 @@ static void rt_entry_destroy(rt_entry_t *this)
/**
* Check if the route received with RTM_NEWROUTE is usable based on its type.
*/
-static bool route_usable(struct nlmsghdr *hdr)
+static bool route_usable(struct nlmsghdr *hdr, bool allow_local)
{
struct rtmsg *msg;
@@ -1809,6 +1809,8 @@ static bool route_usable(struct nlmsghdr *hdr)
case RTN_PROHIBIT:
case RTN_THROW:
return FALSE;
+ case RTN_LOCAL:
+ return allow_local;
default:
return TRUE;
}
@@ -1832,15 +1834,11 @@ static rt_entry_t *parse_route(struct nlmsghdr *hdr, rt_entry_t *route)
if (route)
{
- route->gtw = chunk_empty;
- route->pref_src = chunk_empty;
- route->dst = chunk_empty;
- route->dst_len = msg->rtm_dst_len;
- route->src = chunk_empty;
- route->src_len = msg->rtm_src_len;
- route->table = msg->rtm_table;
- route->oif = 0;
- route->priority = 0;
+ *route = (rt_entry_t){
+ .dst_len = msg->rtm_dst_len,
+ .src_len = msg->rtm_src_len,
+ .table = msg->rtm_table,
+ };
}
else
{
@@ -1988,7 +1986,7 @@ static host_t *get_route(private_kernel_netlink_net_t *this, host_t *dest,
rt_entry_t *other;
uintptr_t table;
- if (!route_usable(current))
+ if (!route_usable(current, TRUE))
{
continue;
}
@@ -2260,49 +2258,31 @@ METHOD(enumerator_t, enumerate_subnets, bool,
break;
case RTM_NEWROUTE:
{
- struct rtmsg *msg;
- struct rtattr *rta;
- size_t rtasize;
- chunk_t dst = chunk_empty;
- uint32_t oif = 0;
+ rt_entry_t route;
- msg = NLMSG_DATA(this->current);
-
- if (!route_usable(this->current))
+ if (!route_usable(this->current, FALSE))
{
break;
}
- else if (msg->rtm_table && (
- msg->rtm_table == RT_TABLE_LOCAL ||
- msg->rtm_table == this->private->routing_table))
+ parse_route(this->current, &route);
+
+ if (route.table && (
+ route.table == RT_TABLE_LOCAL ||
+ route.table == this->private->routing_table))
{ /* ignore our own and the local routing tables */
break;
}
-
- rta = RTM_RTA(msg);
- rtasize = RTM_PAYLOAD(this->current);
- while (RTA_OK(rta, rtasize))
- {
- switch (rta->rta_type)
- {
- case RTA_DST:
- dst = chunk_create(RTA_DATA(rta), RTA_PAYLOAD(rta));
- break;
- case RTA_OIF:
- if (RTA_PAYLOAD(rta) == sizeof(oif))
- {
- oif = *(uint32_t*)RTA_DATA(rta);
- }
- break;
- }
- rta = RTA_NEXT(rta, rtasize);
+ else if (route.gtw.ptr)
+ { /* ignore routes via gateway/next hop */
+ break;
}
- if (dst.ptr && oif && if_indextoname(oif, this->ifname))
+ if (route.dst.ptr && route.oif &&
+ if_indextoname(route.oif, this->ifname))
{
- this->net = host_create_from_chunk(msg->rtm_family, dst, 0);
+ this->net = host_create_from_chunk(AF_UNSPEC, route.dst, 0);
*net = this->net;
- *mask = msg->rtm_dst_len;
+ *mask = route.dst_len;
*ifname = this->ifname;
return TRUE;
}
@@ -2669,31 +2649,89 @@ static status_t manage_srcroute(private_kernel_netlink_net_t *this,
return this->socket->send_ack(this->socket, hdr);
}
+/**
+ * Helper struct used to check routes
+ */
+typedef struct {
+ /** the entry we look for */
+ route_entry_t route;
+ /** kernel interface */
+ private_kernel_netlink_net_t *this;
+} route_entry_lookup_t;
+
+/**
+ * Check if a matching route entry has a VIP associated
+ */
+static bool route_with_vip(route_entry_lookup_t *a, route_entry_t *b)
+{
+ if (chunk_equals(a->route.dst_net, b->dst_net) &&
+ a->route.prefixlen == b->prefixlen &&
+ is_known_vip(a->this, b->src_ip))
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/**
+ * Check if there is any route entry with a matching destination
+ */
+static bool route_with_dst(route_entry_lookup_t *a, route_entry_t *b)
+{
+ if (chunk_equals(a->route.dst_net, b->dst_net) &&
+ a->route.prefixlen == b->prefixlen)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
METHOD(kernel_net_t, add_route, status_t,
private_kernel_netlink_net_t *this, chunk_t dst_net, uint8_t prefixlen,
host_t *gateway, host_t *src_ip, char *if_name)
{
status_t status;
- route_entry_t *found, route = {
- .dst_net = dst_net,
- .prefixlen = prefixlen,
- .gateway = gateway,
- .src_ip = src_ip,
- .if_name = if_name,
+ route_entry_t *found;
+ route_entry_lookup_t lookup = {
+ .route = {
+ .dst_net = dst_net,
+ .prefixlen = prefixlen,
+ .gateway = gateway,
+ .src_ip = src_ip,
+ .if_name = if_name,
+ },
+ .this = this,
};
this->routes_lock->lock(this->routes_lock);
- found = this->routes->get(this->routes, &route);
+ found = this->routes->get(this->routes, &lookup.route);
if (found)
{
this->routes_lock->unlock(this->routes_lock);
return ALREADY_DONE;
}
- status = manage_srcroute(this, RTM_NEWROUTE, NLM_F_CREATE | NLM_F_EXCL,
- dst_net, prefixlen, gateway, src_ip, if_name);
+
+ /* don't replace the route if we already have one with a VIP installed,
+ * but keep track of it in case that other route is uninstalled */
+ this->lock->read_lock(this->lock);
+ if (!is_known_vip(this, src_ip))
+ {
+ found = this->routes->get_match(this->routes, &lookup,
+ (void*)route_with_vip);
+ }
+ this->lock->unlock(this->lock);
+ if (found)
+ {
+ status = SUCCESS;
+ }
+ else
+ {
+ status = manage_srcroute(this, RTM_NEWROUTE, NLM_F_CREATE|NLM_F_REPLACE,
+ dst_net, prefixlen, gateway, src_ip, if_name);
+ }
if (status == SUCCESS)
{
- found = route_entry_clone(&route);
+ found = route_entry_clone(&lookup.route);
this->routes->put(this->routes, found, found);
}
this->routes_lock->unlock(this->routes_lock);
@@ -2705,25 +2743,49 @@ METHOD(kernel_net_t, del_route, status_t,
host_t *gateway, host_t *src_ip, char *if_name)
{
status_t status;
- route_entry_t *found, route = {
- .dst_net = dst_net,
- .prefixlen = prefixlen,
- .gateway = gateway,
- .src_ip = src_ip,
- .if_name = if_name,
+ route_entry_t *found;
+ route_entry_lookup_t lookup = {
+ .route = {
+ .dst_net = dst_net,
+ .prefixlen = prefixlen,
+ .gateway = gateway,
+ .src_ip = src_ip,
+ .if_name = if_name,
+ },
+ .this = this,
};
this->routes_lock->lock(this->routes_lock);
- found = this->routes->get(this->routes, &route);
+ found = this->routes->remove(this->routes, &lookup.route);
if (!found)
{
this->routes_lock->unlock(this->routes_lock);
return NOT_FOUND;
}
- this->routes->remove(this->routes, found);
route_entry_destroy(found);
- status = manage_srcroute(this, RTM_DELROUTE, 0, dst_net, prefixlen,
- gateway, src_ip, if_name);
+
+ /* check if there are any other routes for the same destination and if
+ * so update the route, otherwise uninstall it */
+ this->lock->read_lock(this->lock);
+ found = this->routes->get_match(this->routes, &lookup,
+ (void*)route_with_vip);
+ this->lock->unlock(this->lock);
+ if (!found)
+ {
+ found = this->routes->get_match(this->routes, &lookup,
+ (void*)route_with_dst);
+ }
+ if (found)
+ {
+ status = manage_srcroute(this, RTM_NEWROUTE, NLM_F_CREATE|NLM_F_REPLACE,
+ found->dst_net, found->prefixlen, found->gateway,
+ found->src_ip, found->if_name);
+ }
+ else
+ {
+ status = manage_srcroute(this, RTM_DELROUTE, 0, dst_net, prefixlen,
+ gateway, src_ip, if_name);
+ }
this->routes_lock->unlock(this->routes_lock);
return status;
}
diff --git a/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.h b/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.h
index ff9831d3c..862059c2b 100644
--- a/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.h
+++ b/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.h
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2008 Tobias Brunner
- * Hochschule fuer Technik Rapperswil
+ * HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
diff --git a/src/libcharon/plugins/kernel_netlink/kernel_netlink_plugin.c b/src/libcharon/plugins/kernel_netlink/kernel_netlink_plugin.c
index 58350028f..5ab8924f4 100644
--- a/src/libcharon/plugins/kernel_netlink/kernel_netlink_plugin.c
+++ b/src/libcharon/plugins/kernel_netlink/kernel_netlink_plugin.c
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2008 Tobias Brunner
- * Hochschule fuer Technik Rapperswil
+ * HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
diff --git a/src/libcharon/plugins/kernel_netlink/kernel_netlink_plugin.h b/src/libcharon/plugins/kernel_netlink/kernel_netlink_plugin.h
index 74c9ae24f..f3b4ad785 100644
--- a/src/libcharon/plugins/kernel_netlink/kernel_netlink_plugin.h
+++ b/src/libcharon/plugins/kernel_netlink/kernel_netlink_plugin.h
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2008 Tobias Brunner
- * Hochschule fuer Technik Rapperswil
+ * HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
diff --git a/src/libcharon/plugins/kernel_netlink/kernel_netlink_shared.c b/src/libcharon/plugins/kernel_netlink/kernel_netlink_shared.c
index f3b5b1d4a..441c0c482 100644
--- a/src/libcharon/plugins/kernel_netlink/kernel_netlink_shared.c
+++ b/src/libcharon/plugins/kernel_netlink/kernel_netlink_shared.c
@@ -2,7 +2,7 @@
* Copyright (C) 2014 Martin Willi
* Copyright (C) 2014 revosec AG
* Copyright (C) 2008 Tobias Brunner
- * Hochschule fuer Technik Rapperswil
+ * HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
diff --git a/src/libcharon/plugins/kernel_netlink/kernel_netlink_shared.h b/src/libcharon/plugins/kernel_netlink/kernel_netlink_shared.h
index b034326d7..7056e6ccc 100644
--- a/src/libcharon/plugins/kernel_netlink/kernel_netlink_shared.h
+++ b/src/libcharon/plugins/kernel_netlink/kernel_netlink_shared.h
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2008 Tobias Brunner
- * Hochschule fuer Technik Rapperswil
+ * HSR Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -32,7 +32,7 @@
/**
* General purpose netlink buffer.
*
- * Some platforms require an enforced aligment to four bytes (e.g. ARM).
+ * Some platforms require an enforced alignment to four bytes (e.g. ARM).
*/
typedef union {
struct nlmsghdr hdr;