1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
3 * This library is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU Lesser General Public
5 * License as published by the Free Software Foundation; either
6 * version 2 of the License, or (at your option) any later version.
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
13 * You should have received a copy of the GNU Lesser General Public
14 * License along with this library; if not, write to the
15 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16 * Boston, MA 02110-1301 USA.
18 * Copyright 2015 Red Hat, Inc.
21 #include "nm-default.h"
25 #include "nm-setting-connection.h"
26 #include "nm-setting-vxlan.h"
29 #include "nm-device-vxlan.h"
30 #include "nm-device-private.h"
31 #include "nm-object-private.h"
33 G_DEFINE_TYPE (NMDeviceVxlan, nm_device_vxlan, NM_TYPE_DEVICE)
35 #define NM_DEVICE_VXLAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_VXLAN, NMDeviceVxlanPrivate))
56 } NMDeviceVxlanPrivate;
83 * nm_device_vxlan_get_hw_address:
84 * @device: a #NMDeviceVxlan
86 * Gets the hardware (MAC) address of the #NMDeviceVxlan
88 * Returns: the hardware address. This is the internal string used by the
89 * device, and must not be modified.
94 nm_device_vxlan_get_hw_address (NMDeviceVxlan *device)
96 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), NULL);
98 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->hw_address;
102 * nm_device_vxlan_get_carrier:
103 * @device: a #NMDeviceVxlan
105 * Whether the device has carrier.
107 * Returns: %TRUE if the device has carrier.
112 nm_device_vxlan_get_carrier (NMDeviceVxlan *device)
114 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), FALSE);
116 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->carrier;
120 * nm_device_vxlan_get_parent:
121 * @device: a #NMDeviceVxlan
123 * Returns: (transfer none): the device's parent device
128 nm_device_vxlan_get_parent (NMDeviceVxlan *device)
130 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), NULL);
132 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->parent;
136 * nm_device_vxlan_get_id:
137 * @device: a #NMDeviceVxlan
139 * Returns: the device's VXLAN ID.
144 nm_device_vxlan_get_id (NMDeviceVxlan *device)
146 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), 0);
148 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->id;
152 * nm_device_vxlan_get_group:
153 * @device: a #NMDeviceVxlan
155 * Returns: The unicast destination IP address or the multicast
161 nm_device_vxlan_get_group (NMDeviceVxlan *device)
163 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), NULL);
165 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->group;
169 * nm_device_vxlan_get_local:
170 * @device: a #NMDeviceVxlan
172 * Returns: the source IP address to use in outgoing packets
177 nm_device_vxlan_get_local (NMDeviceVxlan *device)
179 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), NULL);
181 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->local;
185 * nm_device_vxlan_get_src_port_min:
186 * @device: a #NMDeviceVxlan
188 * Returns: the minimum UDP source port
193 nm_device_vxlan_get_src_port_min (NMDeviceVxlan *device)
195 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), 0);
197 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->src_port_min;
201 * nm_device_vxlan_get_src_port_max:
202 * @device: a #NMDeviceVxlan
204 * Returns: the maximum UDP source port
209 nm_device_vxlan_get_src_port_max (NMDeviceVxlan *device)
211 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), 0);
213 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->src_port_max;
217 * nm_device_vxlan_get_dst_port:
218 * @device: a #NMDeviceVxlan
220 * Returns: the UDP destination port
225 nm_device_vxlan_get_dst_port (NMDeviceVxlan *device)
227 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), 0);
229 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->dst_port;
233 * nm_device_vxlan_get_learning:
234 * @device: a #NMDeviceVxlan
236 * Returns: whether address learning is enabled
241 nm_device_vxlan_get_learning (NMDeviceVxlan *device)
243 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), FALSE);
245 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->learning;
249 * nm_device_vxlan_get_ageing:
250 * @device: a #NMDeviceVxlan
252 * Returns: the lifetime in seconds of FDB entries learnt by the kernel
257 nm_device_vxlan_get_ageing (NMDeviceVxlan *device)
259 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), 0);
261 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->ageing;
265 * nm_device_vxlan_get_tos:
266 * @device: a #NMDeviceVxlan
268 * Returns: the TOS value to use in outgoing packets
273 nm_device_vxlan_get_tos (NMDeviceVxlan *device)
275 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), 0);
277 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->tos;
281 * nm_device_vxlan_get_ttl:
282 * @device: a #NMDeviceVxlan
284 * Returns: the time-to-live value to use in outgoing packets
289 nm_device_vxlan_get_ttl (NMDeviceVxlan *device)
291 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), 0);
293 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->ttl;
297 * nm_device_vxlan_get_limit:
298 * @device: a #NMDeviceVxlan
300 * Returns: the maximum number of entries that can be added to the
306 nm_device_vxlan_get_limit (NMDeviceVxlan *device)
308 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), 0);
310 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->limit;
314 * nm_device_vxlan_get_proxy:
315 * @device: a #NMDeviceVxlan
317 * Returns: whether ARP proxy is turned on
322 nm_device_vxlan_get_proxy (NMDeviceVxlan *device)
324 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), FALSE);
326 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->proxy;
330 * nm_device_vxlan_get_rsc:
331 * @device: a #NMDeviceVxlan
333 * Returns: whether route short circuit is turned on
338 nm_device_vxlan_get_rsc (NMDeviceVxlan *device)
340 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), FALSE);
342 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->rsc;
346 * nm_device_vxlan_get_l2miss:
347 * @device: a #NMDeviceVxlan
349 * Returns: whether netlink LL ADDR miss notifications are generated
354 nm_device_vxlan_get_l2miss (NMDeviceVxlan *device)
356 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), FALSE);
358 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->l2miss;
362 * nm_device_vxlan_get_l3miss:
363 * @device: a #NMDeviceVxlan
365 * Returns: wether netlink IP ADDR miss notifications are generated
370 nm_device_vxlan_get_l3miss (NMDeviceVxlan *device)
372 g_return_val_if_fail (NM_IS_DEVICE_VXLAN (device), FALSE);
374 return NM_DEVICE_VXLAN_GET_PRIVATE (device)->l3miss;
378 connection_compatible (NMDevice *device, NMConnection *connection, GError **error)
380 NMSettingVxlan *s_vxlan;
382 if (!NM_DEVICE_CLASS (nm_device_vxlan_parent_class)->connection_compatible (device, connection, error))
385 if (!nm_connection_is_type (connection, NM_SETTING_VXLAN_SETTING_NAME)) {
386 g_set_error_literal (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_INCOMPATIBLE_CONNECTION,
387 _("The connection was not a VXLAN connection."));
391 s_vxlan = nm_connection_get_setting_vxlan (connection);
392 if (nm_setting_vxlan_get_id (s_vxlan) != nm_device_vxlan_get_id (NM_DEVICE_VXLAN (device))) {
393 g_set_error_literal (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_INCOMPATIBLE_CONNECTION,
394 _("The VXLAN identifiers of the device and the connection didn't match."));
402 get_setting_type (NMDevice *device)
404 return NM_TYPE_SETTING_VXLAN;
408 get_hw_address (NMDevice *device)
410 return nm_device_vxlan_get_hw_address (NM_DEVICE_VXLAN (device));
413 /***********************************************************/
416 nm_device_vxlan_init (NMDeviceVxlan *device)
418 _nm_device_set_device_type (NM_DEVICE (device), NM_DEVICE_TYPE_VXLAN);
422 init_dbus (NMObject *object)
424 NMDeviceVxlanPrivate *priv = NM_DEVICE_VXLAN_GET_PRIVATE (object);
425 const NMPropertiesInfo property_info[] = {
426 { NM_DEVICE_VXLAN_HW_ADDRESS, &priv->hw_address },
427 { NM_DEVICE_VXLAN_CARRIER, &priv->carrier },
428 { NM_DEVICE_VXLAN_PARENT, &priv->parent, NULL, NM_TYPE_DEVICE },
429 { NM_DEVICE_VXLAN_ID, &priv->id },
430 { NM_DEVICE_VXLAN_GROUP, &priv->group },
431 { NM_DEVICE_VXLAN_LOCAL, &priv->local },
432 { NM_DEVICE_VXLAN_SRC_PORT_MIN, &priv->src_port_min },
433 { NM_DEVICE_VXLAN_SRC_PORT_MAX, &priv->src_port_max },
434 { NM_DEVICE_VXLAN_DST_PORT, &priv->dst_port },
435 { NM_DEVICE_VXLAN_TOS, &priv->tos },
436 { NM_DEVICE_VXLAN_TTL, &priv->ttl },
437 { NM_DEVICE_VXLAN_LIMIT, &priv->limit },
438 { NM_DEVICE_VXLAN_LEARNING, &priv->learning },
439 { NM_DEVICE_VXLAN_AGEING, &priv->ageing },
440 { NM_DEVICE_VXLAN_PROXY, &priv->proxy },
441 { NM_DEVICE_VXLAN_RSC, &priv->rsc },
442 { NM_DEVICE_VXLAN_L2MISS, &priv->l2miss },
443 { NM_DEVICE_VXLAN_L3MISS, &priv->l3miss },
447 NM_OBJECT_CLASS (nm_device_vxlan_parent_class)->init_dbus (object);
449 _nm_object_register_properties (object,
450 NM_DBUS_INTERFACE_DEVICE_VXLAN,
455 finalize (GObject *object)
457 NMDeviceVxlanPrivate *priv = NM_DEVICE_VXLAN_GET_PRIVATE (object);
459 g_free (priv->hw_address);
460 g_clear_object (&priv->parent);
462 G_OBJECT_CLASS (nm_device_vxlan_parent_class)->finalize (object);
466 get_property (GObject *object,
471 NMDeviceVxlan *device = NM_DEVICE_VXLAN (object);
474 case PROP_HW_ADDRESS:
475 g_value_set_string (value, nm_device_vxlan_get_hw_address (device));
478 g_value_set_boolean (value, nm_device_vxlan_get_carrier (device));
481 g_value_set_object (value, nm_device_vxlan_get_parent (device));
484 g_value_set_uint (value, nm_device_vxlan_get_id (device));
487 g_value_set_string (value, nm_device_vxlan_get_group (device));
490 g_value_set_string (value, nm_device_vxlan_get_local (device));
493 g_value_set_uint (value, nm_device_vxlan_get_tos (device));
496 g_value_set_uint (value, nm_device_vxlan_get_ttl (device));
499 g_value_set_uint (value, nm_device_vxlan_get_limit (device));
502 g_value_set_boolean (value, nm_device_vxlan_get_learning (device));
505 g_value_set_uint (value, nm_device_vxlan_get_ageing (device));
508 g_value_set_uint (value, nm_device_vxlan_get_dst_port (device));
510 case PROP_SRC_PORT_MIN:
511 g_value_set_uint (value, nm_device_vxlan_get_src_port_min (device));
513 case PROP_SRC_PORT_MAX:
514 g_value_set_uint (value, nm_device_vxlan_get_src_port_max (device));
517 g_value_set_boolean (value, nm_device_vxlan_get_proxy (device));
520 g_value_set_boolean (value, nm_device_vxlan_get_rsc (device));
523 g_value_set_boolean (value, nm_device_vxlan_get_l2miss (device));
526 g_value_set_boolean (value, nm_device_vxlan_get_l3miss (device));
529 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
535 nm_device_vxlan_class_init (NMDeviceVxlanClass *vxlan_class)
537 GObjectClass *object_class = G_OBJECT_CLASS (vxlan_class);
538 NMObjectClass *nm_object_class = NM_OBJECT_CLASS (vxlan_class);
539 NMDeviceClass *device_class = NM_DEVICE_CLASS (vxlan_class);
541 g_type_class_add_private (vxlan_class, sizeof (NMDeviceVxlanPrivate));
543 _nm_object_class_add_interface (nm_object_class, NM_DBUS_INTERFACE_DEVICE_VXLAN);
545 /* virtual methods */
546 object_class->finalize = finalize;
547 object_class->get_property = get_property;
549 nm_object_class->init_dbus = init_dbus;
551 device_class->connection_compatible = connection_compatible;
552 device_class->get_setting_type = get_setting_type;
553 device_class->get_hw_address = get_hw_address;
558 * NMDeviceVxlan:hw-address:
560 * The hardware (MAC) address of the device.
564 g_object_class_install_property
565 (object_class, PROP_HW_ADDRESS,
566 g_param_spec_string (NM_DEVICE_VXLAN_HW_ADDRESS, "", "",
569 G_PARAM_STATIC_STRINGS));
572 * NMDeviceVxlan:carrier:
574 * Whether the device has carrier.
578 g_object_class_install_property
579 (object_class, PROP_CARRIER,
580 g_param_spec_boolean (NM_DEVICE_VXLAN_CARRIER, "", "",
583 G_PARAM_STATIC_STRINGS));
586 * NMDeviceVxlan:parent:
588 * The devices's parent device.
592 g_object_class_install_property
593 (object_class, PROP_PARENT,
594 g_param_spec_object (NM_DEVICE_VXLAN_PARENT, "", "",
597 G_PARAM_STATIC_STRINGS));
602 * The device's VXLAN ID.
606 g_object_class_install_property
607 (object_class, PROP_ID,
608 g_param_spec_uint (NM_DEVICE_VXLAN_ID, "", "",
611 G_PARAM_STATIC_STRINGS));
614 * NMDeviceVxlan:group:
616 * The unicast destination IP address used in outgoing packets when the
617 * destination link layer address is not known in the VXLAN device
618 * forwarding database or the multicast IP address joined.
622 g_object_class_install_property
623 (object_class, PROP_GROUP,
624 g_param_spec_string (NM_DEVICE_VXLAN_GROUP, "", "",
627 G_PARAM_STATIC_STRINGS));
630 * NMDeviceVxlan:local:
632 * The source IP address to use in outgoing packets.
636 g_object_class_install_property
637 (object_class, PROP_LOCAL,
638 g_param_spec_string (NM_DEVICE_VXLAN_LOCAL, "", "",
641 G_PARAM_STATIC_STRINGS));
646 * The TOS value to use in outgoing packets.
650 g_object_class_install_property
651 (object_class, PROP_TOS,
652 g_param_spec_uchar (NM_DEVICE_VXLAN_TOS, "", "",
655 G_PARAM_STATIC_STRINGS));
660 * The time-to-live value to use in outgoing packets.
664 g_object_class_install_property
665 (object_class, PROP_TTL,
666 g_param_spec_uchar (NM_DEVICE_VXLAN_TTL, "", "",
669 G_PARAM_STATIC_STRINGS));
672 * NMDeviceVxlan:learning:
674 * Whether unknown source link layer addresses and IP addresses are entered
675 * into the VXLAN device forwarding database.
679 g_object_class_install_property
680 (object_class, PROP_LEARNING,
681 g_param_spec_boolean (NM_DEVICE_VXLAN_LEARNING, "", "",
684 G_PARAM_STATIC_STRINGS));
687 * NMDeviceVxlan:ageing:
689 * The lifetime in seconds of FDB entries learnt by the kernel.
693 g_object_class_install_property
694 (object_class, PROP_AGEING,
695 g_param_spec_uint (NM_DEVICE_VXLAN_AGEING, "", "",
698 G_PARAM_STATIC_STRINGS));
701 * NMDeviceVxlan:limit:
703 * The maximum number of entries that can be added to the forwarding table.
707 g_object_class_install_property
708 (object_class, PROP_LIMIT,
709 g_param_spec_uint (NM_DEVICE_VXLAN_LIMIT, "", "",
712 G_PARAM_STATIC_STRINGS));
715 * NMDeviceVxlan:dst-port:
717 * The UDP destination port used to communicate with the remote VXLAN tunnel
722 g_object_class_install_property
723 (object_class, PROP_DST_PORT,
724 g_param_spec_uint (NM_DEVICE_VXLAN_DST_PORT, "", "",
727 G_PARAM_STATIC_STRINGS));
730 * NMDeviceVxlan:src-port-min:
732 * The minimum UDP source port used to communicate with the remote VXLAN
737 g_object_class_install_property
738 (object_class, PROP_SRC_PORT_MIN,
739 g_param_spec_uint (NM_DEVICE_VXLAN_SRC_PORT_MIN, "", "",
742 G_PARAM_STATIC_STRINGS));
745 * NMDeviceVxlan:src-port-max:
747 * The maximum UDP source port used to communicate with the remote VXLAN
752 g_object_class_install_property
753 (object_class, PROP_SRC_PORT_MAX,
754 g_param_spec_uint (NM_DEVICE_VXLAN_SRC_PORT_MAX, "", "",
757 G_PARAM_STATIC_STRINGS));
760 * NMDeviceVxlan:proxy:
762 * Whether ARP proxy is turned on.
766 g_object_class_install_property
767 (object_class, PROP_PROXY,
768 g_param_spec_boolean (NM_DEVICE_VXLAN_PROXY, "", "",
771 G_PARAM_STATIC_STRINGS));
776 * Whether route short circuit is turned on.
780 g_object_class_install_property
781 (object_class, PROP_RSC,
782 g_param_spec_boolean (NM_DEVICE_VXLAN_RSC, "", "",
785 G_PARAM_STATIC_STRINGS));
788 * NMDeviceVxlan:l2miss:
790 * Whether netlink LL ADDR miss notifications are generated.
794 g_object_class_install_property
795 (object_class, PROP_L2MISS,
796 g_param_spec_boolean (NM_DEVICE_VXLAN_L2MISS, "", "",
799 G_PARAM_STATIC_STRINGS));
802 * NMDeviceVxlan:l3miss:
804 * Whether netlink IP ADDR miss notifications are generated.
808 g_object_class_install_property
809 (object_class, PROP_L3MISS,
810 g_param_spec_boolean (NM_DEVICE_VXLAN_L3MISS, "", "",
813 G_PARAM_STATIC_STRINGS));