Skip to content

Commit f9f74a0

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)
1 parent be571ff commit f9f74a0

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
@@ -14,6 +14,7 @@
1414
#include "string-table.h"
1515
#include "string-util.h"
1616
#include "strv.h"
17+
#include "vlan-util.h"
1718

1819
/*
1920
# .network
@@ -951,6 +952,24 @@ static int parse_cmdline_rd_peerdns(Context *context, const char *key, const cha
951952
return network_set_dhcp_use_dns(context, "", r);
952953
}
953954

955+
static int extract_vlan_id(const char *vlan_name, uint16_t *ret) {
956+
assert(!isempty(vlan_name));
957+
assert(ret);
958+
959+
/* From dracut.cmdline(7):
960+
* We support the four styles of vlan names:
961+
* VLAN_PLUS_VID (vlan0005),
962+
* VLAN_PLUS_VID_NO_PAD (vlan5),
963+
* DEV_PLUS_VID (eth0.0005), and
964+
* DEV_PLUS_VID_NO_PAD (eth0.5). */
965+
966+
for (const char *p = vlan_name + strlen(vlan_name) - 1; p > vlan_name; p--)
967+
if (!ascii_isdigit(*p))
968+
return parse_vlanid(p+1, ret);
969+
970+
return -EINVAL;
971+
}
972+
954973
static int parse_cmdline_vlan(Context *context, const char *key, const char *value) {
955974
const char *name, *p;
956975
NetDev *netdev;
@@ -975,6 +994,10 @@ static int parse_cmdline_vlan(Context *context, const char *key, const char *val
975994
return r;
976995
}
977996

997+
r = extract_vlan_id(name, &netdev->vlan_id);
998+
if (r < 0)
999+
return log_debug_errno(r, "Failed to parse VLAN ID from VLAN device name '%s': %m", name);
1000+
9781001
return network_set_vlan(context, p + 1, name);
9791002
}
9801003

@@ -1352,6 +1375,13 @@ void netdev_dump(NetDev *netdev, FILE *f) {
13521375

13531376
if (netdev->mtu > 0)
13541377
fprintf(f, "MTUBytes=%" PRIu32 "\n", netdev->mtu);
1378+
1379+
if (streq(netdev->kind, "vlan")) {
1380+
fprintf(f,
1381+
"\n[VLAN]\n"
1382+
"Id=%u\n",
1383+
netdev->vlan_id);
1384+
}
13551385
}
13561386

13571387
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
@@ -79,6 +79,9 @@ struct NetDev {
7979
char *ifname;
8080
char *kind;
8181
uint32_t mtu;
82+
83+
/* [VLAN] */
84+
uint16_t vlan_id;
8285
};
8386

8487
struct Link {

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

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

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

0 commit comments

Comments
 (0)