Skip to content

Commit 3960ccc

Browse files
yuwatabluca
authored andcommitted
network-generator: parse vlan ID from vlan interface name
Fixes #33954. (cherry picked from commit e31a55e) (cherry picked from commit 4cd435c) (cherry picked from commit f9f74a0) (cherry picked from commit 456c15b) (cherry picked from commit 2aaee78)
1 parent 9f3db12 commit 3960ccc

File tree

3 files changed

+65
-0
lines changed

3 files changed

+65
-0
lines changed

src/network/generator/network-generator.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "string-table.h"
1414
#include "string-util.h"
1515
#include "strv.h"
16+
#include "vlan-util.h"
1617

1718
/*
1819
# .network
@@ -928,6 +929,24 @@ static int parse_cmdline_rd_peerdns(Context *context, const char *key, const cha
928929
return network_set_dhcp_use_dns(context, "", r);
929930
}
930931

932+
static int extract_vlan_id(const char *vlan_name, uint16_t *ret) {
933+
assert(!isempty(vlan_name));
934+
assert(ret);
935+
936+
/* From dracut.cmdline(7):
937+
* We support the four styles of vlan names:
938+
* VLAN_PLUS_VID (vlan0005),
939+
* VLAN_PLUS_VID_NO_PAD (vlan5),
940+
* DEV_PLUS_VID (eth0.0005), and
941+
* DEV_PLUS_VID_NO_PAD (eth0.5). */
942+
943+
for (const char *p = vlan_name + strlen(vlan_name) - 1; p > vlan_name; p--)
944+
if (!ascii_isdigit(*p))
945+
return parse_vlanid(p+1, ret);
946+
947+
return -EINVAL;
948+
}
949+
931950
static int parse_cmdline_vlan(Context *context, const char *key, const char *value) {
932951
const char *name, *p;
933952
NetDev *netdev;
@@ -952,6 +971,10 @@ static int parse_cmdline_vlan(Context *context, const char *key, const char *val
952971
return r;
953972
}
954973

974+
r = extract_vlan_id(name, &netdev->vlan_id);
975+
if (r < 0)
976+
return log_debug_errno(r, "Failed to parse VLAN ID from VLAN device name '%s': %m", name);
977+
955978
return network_set_vlan(context, p + 1, name);
956979
}
957980

@@ -1319,6 +1342,13 @@ void netdev_dump(NetDev *netdev, FILE *f) {
13191342

13201343
if (netdev->mtu > 0)
13211344
fprintf(f, "MTUBytes=%" PRIu32 "\n", netdev->mtu);
1345+
1346+
if (streq(netdev->kind, "vlan")) {
1347+
fprintf(f,
1348+
"\n[VLAN]\n"
1349+
"Id=%u\n",
1350+
netdev->vlan_id);
1351+
}
13221352
}
13231353

13241354
void link_dump(Link *link, FILE *f) {

src/network/generator/network-generator.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ struct NetDev {
7878
char *ifname;
7979
char *kind;
8080
uint32_t mtu;
81+
82+
/* [VLAN] */
83+
uint16_t vlan_id;
8184
};
8285

8386
struct Link {

src/network/generator/test-network-generator.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,38 @@ int main(int argc, char *argv[]) {
333333
"MTUBytes=1530\n"
334334
);
335335

336+
test_netdev_one("vlan123", "vlan", "vlan123:eth0",
337+
"[NetDev]\n"
338+
"Kind=vlan\n"
339+
"Name=vlan123\n"
340+
"\n[VLAN]\n"
341+
"Id=123\n"
342+
);
343+
344+
test_netdev_one("vlan0013", "vlan", "vlan0013:eth0",
345+
"[NetDev]\n"
346+
"Kind=vlan\n"
347+
"Name=vlan0013\n"
348+
"\n[VLAN]\n"
349+
"Id=11\n" /* 0013 (octal) -> 11 */
350+
);
351+
352+
test_netdev_one("eth0.123", "vlan", "eth0.123:eth0",
353+
"[NetDev]\n"
354+
"Kind=vlan\n"
355+
"Name=eth0.123\n"
356+
"\n[VLAN]\n"
357+
"Id=123\n"
358+
);
359+
360+
test_netdev_one("eth0.0013", "vlan", "eth0.0013:eth0",
361+
"[NetDev]\n"
362+
"Kind=vlan\n"
363+
"Name=eth0.0013\n"
364+
"\n[VLAN]\n"
365+
"Id=11\n" /* 0013 (octal) -> 11 */
366+
);
367+
336368
test_link_one("hogehoge", "ifname", "hogehoge:00:11:22:33:44:55",
337369
"[Match]\n"
338370
"MACAddress=00:11:22:33:44:55\n"

0 commit comments

Comments
 (0)