2014-08-06 14:50:53 +04:00
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd .
Copyright 2013 Tom Gundersen < teg @ jklm . no >
systemd is free software ; you can redistribute it and / or modify it
under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation ; either version 2.1 of the License , or
( at your option ) any later version .
systemd is distributed in the hope that it will be useful , but
WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
Lesser General Public License for more details .
You should have received a copy of the GNU Lesser General Public License
along with systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
# pragma once
# include "networkd.h"
typedef enum LinkState {
LINK_STATE_INITIALIZING ,
LINK_STATE_ENSLAVING ,
LINK_STATE_SETTING_ADDRESSES ,
LINK_STATE_SETTING_ROUTES ,
LINK_STATE_CONFIGURED ,
LINK_STATE_UNMANAGED ,
LINK_STATE_FAILED ,
LINK_STATE_LINGER ,
_LINK_STATE_MAX ,
_LINK_STATE_INVALID = - 1
} LinkState ;
typedef enum LinkOperationalState {
2014-08-12 22:00:34 +04:00
LINK_OPERSTATE_DOWN ,
LINK_OPERSTATE_UP ,
2014-08-06 14:50:53 +04:00
LINK_OPERSTATE_DORMANT ,
LINK_OPERSTATE_CARRIER ,
LINK_OPERSTATE_DEGRADED ,
LINK_OPERSTATE_ROUTABLE ,
_LINK_OPERSTATE_MAX ,
_LINK_OPERSTATE_INVALID = - 1
} LinkOperationalState ;
struct Link {
Manager * manager ;
int n_ref ;
int ifindex ;
char * ifname ;
char * state_file ;
struct ether_addr mac ;
uint32_t mtu ;
struct udev_device * udev_device ;
unsigned flags ;
uint8_t kernel_operstate ;
Network * network ;
LinkState state ;
LinkOperationalState operstate ;
2014-08-08 14:12:17 +04:00
unsigned link_messages ;
2014-08-06 14:50:53 +04:00
unsigned enslaving ;
LIST_HEAD ( Address , addresses ) ;
sd_dhcp_client * dhcp_client ;
sd_dhcp_lease * dhcp_lease ;
char * lease_file ;
uint16_t original_mtu ;
2014-08-08 14:12:17 +04:00
unsigned dhcp4_messages ;
bool dhcp4_configured ;
2014-08-06 17:54:03 +04:00
2014-08-06 14:50:53 +04:00
sd_ipv4ll * ipv4ll ;
2014-08-06 17:54:03 +04:00
bool ipv4ll_address ;
bool ipv4ll_route ;
2014-08-06 14:50:53 +04:00
2014-08-08 14:12:17 +04:00
bool static_configured ;
2014-08-06 14:50:53 +04:00
LIST_HEAD ( Address , pool_addresses ) ;
sd_dhcp_server * dhcp_server ;
sd_icmp6_nd * icmp6_router_discovery ;
sd_dhcp6_client * dhcp6_client ;
} ;
Link * link_unref ( Link * link ) ;
Link * link_ref ( Link * link ) ;
int link_get ( Manager * m , int ifindex , Link * * ret ) ;
int link_add ( Manager * manager , sd_rtnl_message * message , Link * * ret ) ;
void link_drop ( Link * link ) ;
2014-08-06 17:54:03 +04:00
int link_get_address_handler ( sd_rtnl * rtnl , sd_rtnl_message * m , void * userdata ) ;
int link_address_drop_handler ( sd_rtnl * rtnl , sd_rtnl_message * m , void * userdata ) ;
int link_route_drop_handler ( sd_rtnl * rtnl , sd_rtnl_message * m , void * userdata ) ;
2014-08-06 14:50:53 +04:00
2014-08-06 17:54:03 +04:00
void link_enter_failed ( Link * link ) ;
2014-08-06 14:50:53 +04:00
int link_initialized ( Link * link , struct udev_device * device ) ;
2014-08-06 17:54:03 +04:00
void link_client_handler ( Link * link ) ;
int link_update ( Link * link , sd_rtnl_message * message ) ;
int link_rtnl_process_address ( sd_rtnl * rtnl , sd_rtnl_message * message , void * userdata ) ;
2014-08-06 14:50:53 +04:00
int link_save ( Link * link ) ;
bool link_has_carrier ( unsigned flags , uint8_t operstate ) ;
2014-08-08 14:12:17 +04:00
int link_set_mtu ( Link * link , uint32_t mtu ) ;
int link_set_hostname ( Link * link , const char * hostname ) ;
2014-08-06 17:54:03 +04:00
int ipv4ll_configure ( Link * link ) ;
2014-08-08 14:12:17 +04:00
int dhcp4_configure ( Link * link ) ;
2014-08-06 17:54:03 +04:00
2014-08-06 14:50:53 +04:00
const char * link_state_to_string ( LinkState s ) _const_ ;
LinkState link_state_from_string ( const char * s ) _pure_ ;
const char * link_operstate_to_string ( LinkOperationalState s ) _const_ ;
LinkOperationalState link_operstate_from_string ( const char * s ) _pure_ ;
DEFINE_TRIVIAL_CLEANUP_FUNC ( Link * , link_unref ) ;
# define _cleanup_link_unref_ _cleanup_(link_unrefp)
/* Macros which append INTERFACE= to the message */
# define log_full_link(level, link, fmt, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "INTERFACE=", link->ifname, "%-*s: " fmt, IFNAMSIZ, link->ifname, ##__VA_ARGS__)
# define log_debug_link(link, ...) log_full_link(LOG_DEBUG, link, ##__VA_ARGS__)
# define log_info_link(link, ...) log_full_link(LOG_INFO, link, ##__VA_ARGS__)
# define log_notice_link(link, ...) log_full_link(LOG_NOTICE, link, ##__VA_ARGS__)
# define log_warning_link(link, ...) log_full_link(LOG_WARNING, link, ##__VA_ARGS__)
# define log_error_link(link, ...) log_full_link(LOG_ERR, link, ##__VA_ARGS__)
# define log_struct_link(level, link, ...) log_struct(level, "INTERFACE=%s", link->ifname, __VA_ARGS__)
# define ADDRESS_FMT_VAL(address) \
( address ) . s_addr & 0xFF , \
( ( address ) . s_addr > > 8 ) & 0xFF , \
( ( address ) . s_addr > > 16 ) & 0xFF , \
( address ) . s_addr > > 24