</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><varname>BSSID=</varname></term>
+ <listitem>
+ <para>A whitespace-separated list of hardware address of the currently connected wireless
+ LAN. Use full colon-, hyphen- or dot-delimited hexadecimal. See the example in
+ <varname>MACAddress=</varname>. This option may appear more than one, in which case the
+ lists are merged. If the empty string is assigned to this option, the list of BSSID defined
+ prior to this is reset.</para>
+ </listitem>
+ </varlistentry>
<varlistentry>
<term><varname>Host=</varname></term>
<listitem>
char * const *match_names,
char * const *match_property,
char * const *match_ssid,
+ Set *match_bssid,
sd_device *device,
const struct ether_addr *dev_mac,
const char *dev_name,
- const char *ssid) {
+ const char *ssid,
+ const struct ether_addr *bssid) {
const char *dev_path = NULL, *dev_driver = NULL, *dev_type = NULL, *mac_str;
if (!net_condition_test_strv(match_ssid, ssid))
return false;
+ if (match_bssid && (!bssid || !set_contains(match_bssid, bssid)))
+ return false;
+
return true;
}
char * const *match_name,
char * const *match_property,
char * const *match_ssid,
+ Set *match_bssid,
sd_device *device,
const struct ether_addr *dev_mac,
const char *dev_name,
- const char *ssid);
+ const char *ssid,
+ const struct ether_addr *bssid);
CONFIG_PARSER_PROTOTYPE(config_parse_net_condition);
CONFIG_PARSER_PROTOTYPE(config_parse_hwaddr);
return 0;
r = network_get(link->manager, link->sd_device, link->ifname,
- &link->mac, link->ssid, &network);
+ &link->mac, link->ssid, &link->bssid, &network);
if (r == -ENOENT) {
link_enter_unmanaged(link);
return 0;
return r;
r = network_get(link->manager, link->sd_device, link->ifname,
- &link->mac, link->ssid, &network);
+ &link->mac, link->ssid, &link->bssid, &network);
if (r == -ENOENT) {
link_enter_unmanaged(link);
return 0;
Match.Driver, config_parse_match_strv, 0, offsetof(Network, match_driver)
Match.Type, config_parse_match_strv, 0, offsetof(Network, match_type)
Match.SSID, config_parse_match_strv, 0, offsetof(Network, match_ssid)
+Match.BSSID, config_parse_hwaddrs, 0, offsetof(Network, match_bssid)
Match.Name, config_parse_match_ifnames, 0, offsetof(Network, match_name)
Match.Property, config_parse_match_property, 0, offsetof(Network, match_property)
Match.Host, config_parse_net_condition, CONDITION_HOST, offsetof(Network, conditions)
strv_free(network->match_name);
strv_free(network->match_property);
strv_free(network->match_ssid);
+ set_free_free(network->match_bssid);
condition_free_list(network->conditions);
free(network->description);
int network_get(Manager *manager, sd_device *device,
const char *ifname, const struct ether_addr *address,
- const char *ssid, Network **ret) {
+ const char *ssid, const struct ether_addr *bssid, Network **ret) {
Network *network;
Iterator i;
ORDERED_HASHMAP_FOREACH(network, manager->networks, i)
if (net_match_config(network->match_mac, network->match_path, network->match_driver,
network->match_type, network->match_name, network->match_property,
- network->match_ssid,
- device, address, ifname, ssid)) {
+ network->match_ssid, network->match_bssid,
+ device, address, ifname, ssid, bssid)) {
if (network->match_name && device) {
const char *attr;
uint8_t name_assign_type = NET_NAME_UNKNOWN;
char **match_name;
char **match_property;
char **match_ssid;
+ Set *match_bssid;
LIST_HEAD(Condition, conditions);
char *description;
int network_verify(Network *network);
int network_get_by_name(Manager *manager, const char *name, Network **ret);
-int network_get(Manager *manager, sd_device *device, const char *ifname, const struct ether_addr *mac, const char *ssid, Network **ret);
+int network_get(Manager *manager, sd_device *device, const char *ifname, const struct ether_addr *mac,
+ const char *ssid, const struct ether_addr *bssid, Network **ret);
int network_apply(Network *network, Link *link);
void network_apply_anonymize_if_set(Network *network);
/* let's assume that the test machine does not have a .network file
that applies to the loopback device... */
- assert_se(network_get(manager, loopback, "lo", &mac, NULL, &network) == -ENOENT);
+ assert_se(network_get(manager, loopback, "lo", &mac, NULL, NULL, &network) == -ENOENT);
assert_se(!network);
}
LIST_FOREACH(links, link, ctx->links) {
if (net_match_config(link->match_mac, link->match_path, link->match_driver,
- link->match_type, link->match_name, link->match_property, NULL,
- device, NULL, NULL, NULL)) {
+ link->match_type, link->match_name, link->match_property, NULL, NULL,
+ device, NULL, NULL, NULL, NULL)) {
if (link->match_name && !strv_contains(link->match_name, "*")) {
unsigned name_assign_type = NET_NAME_UNKNOWN;
Architecture=
Path=
SSID=
+BSSID=
Name=
Property=
Virtualization=