On Sat, Nov 19, 2022 at 12:03:59PM +0000, Mikolaj Kucharski wrote:
> Kind reminder.
>
> Below diff also at:
>
> https://marc.info/?l=openbsd-tech&m=166806412910623&w=2
>
> This is diff by Noah Meier with small changes by me.
>
>
> On Thu, Nov 10, 2022 at 07:14:11AM +0000, Mikolaj Kucharski wrote:
> > On Thu, Nov 10, 2022 at 12:53:07AM +0000, Mikolaj Kucharski wrote:
> > > On Wed, Oct 20, 2021 at 10:20:09PM -0400, Noah Meier wrote:
> > > > Hi,
> > > >
> > > > While wireguard interfaces can have a description set by ifconfig,
> > > > wireguard peers currently cannot. I now have a lot of peers and
> > > > descriptions of them in ifconfig would be helpful.
> > > >
> > > > This diff adds a 'wgdesc' option to a 'wgpeer' in ifconfig (and a
> > > > corresponding '-wgdesc' option). Man page also updated.
> > > >
> > > > NM
> > >
> > > Now that my `ifconfig, wireguard output less verbose, unless -A or <if>`
> > > diff is commited ( see https://marc.info/?t=165779150000002&r=1&w=2 ),
> > > bump of an old thread.
> > >
> > > Below is rebased on -current and tiny modified by me, Noah's diff.
> > >
> > > You need both kernel and ifconfig with below code, otherwise you may see
> > > issues bringing up wg(4) interface. If you may loose access to machine
> > > behind wg(4) VPN, make sure you update on that machine both kernel and
> > > ifconfig(8) at the same time.
> > >
Rebased again, just a moment ago. Will test runtime again over the weekend,
are there no surprises.
- ifconfig compiles
- GENERIC.MP/amd64 kernel compiles too
Index: sbin/ifconfig/ifconfig.c
===================================================================
RCS file: /cvs/src/sbin/ifconfig/ifconfig.c,v
retrieving revision 1.460
diff -u -p -u -r1.460 ifconfig.c
--- sbin/ifconfig/ifconfig.c 18 Dec 2022 18:56:38 -0000 1.460
+++ sbin/ifconfig/ifconfig.c 24 Dec 2022 00:49:05 -0000
@@ -355,12 +355,14 @@ void setwgpeerep(const char *, const cha
void setwgpeeraip(const char *, int);
void setwgpeerpsk(const char *, int);
void setwgpeerpka(const char *, int);
+void setwgpeerdesc(const char *, int);
void setwgport(const char *, int);
void setwgkey(const char *, int);
void setwgrtable(const char *, int);
void unsetwgpeer(const char *, int);
void unsetwgpeerpsk(const char *, int);
+void unsetwgpeerdesc(const char *, int);
void unsetwgpeerall(const char *, int);
void wg_status(int);
@@ -623,11 +625,13 @@ const struct cmd {
{ "wgaip", NEXTARG, A_WIREGUARD, setwgpeeraip},
{ "wgpsk", NEXTARG, A_WIREGUARD, setwgpeerpsk},
{ "wgpka", NEXTARG, A_WIREGUARD, setwgpeerpka},
+ { "wgdesc", NEXTARG, A_WIREGUARD, setwgpeerdesc},
{ "wgport", NEXTARG, A_WIREGUARD, setwgport},
{ "wgkey", NEXTARG, A_WIREGUARD, setwgkey},
{ "wgrtable", NEXTARG, A_WIREGUARD, setwgrtable},
{ "-wgpeer", NEXTARG, A_WIREGUARD, unsetwgpeer},
{ "-wgpsk", 0, A_WIREGUARD, unsetwgpeerpsk},
+ { "-wgdesc", 0, A_WIREGUARD, unsetwgpeerdesc},
{ "-wgpeerall", 0, A_WIREGUARD, unsetwgpeerall},
#else /* SMALL */
@@ -5856,6 +5860,16 @@ setwgpeerpka(const char *pka, int param)
}
void
+setwgpeerdesc(const char *wgdesc, int param)
+{
+ if (wg_peer == NULL)
+ errx(1, "wgdesc: wgpeer not set");
+ if (strlen(wgdesc))
+ strlcpy(wg_peer->p_description, wgdesc, IFDESCRSIZE);
+ wg_peer->p_flags |= WG_PEER_SET_DESCRIPTION;
+}
+
+void
setwgport(const char *port, int param)
{
const char *errmsg = NULL;
@@ -5902,6 +5916,15 @@ unsetwgpeerpsk(const char *value, int pa
}
void
+unsetwgpeerdesc(const char *value, int param)
+{
+ if (wg_peer == NULL)
+ errx(1, "wgdesc: wgpeer not set");
+ strlcpy(wg_peer->p_description, "", IFDESCRSIZE);
+ wg_peer->p_flags |= WG_PEER_SET_DESCRIPTION;
+}
+
+void
unsetwgpeerall(const char *value, int param)
{
ensurewginterface();
@@ -5961,6 +5984,9 @@ wg_status(int ifaliases)
b64_ntop(wg_peer->p_public, WG_KEY_LEN,
key, sizeof(key));
printf("\twgpeer %s\n", key);
+
+ if (strlen(wg_peer->p_description))
+ printf("\t\twgdesc %s\n",
wg_peer->p_description);
if (wg_peer->p_flags & WG_PEER_HAS_PSK)
printf("\t\twgpsk (present)\n");
Index: share/man/man4/wg.4
===================================================================
RCS file: /cvs/src/share/man/man4/wg.4,v
retrieving revision 1.10
diff -u -p -u -r1.10 wg.4
--- share/man/man4/wg.4 14 Mar 2021 10:08:38 -0000 1.10
+++ share/man/man4/wg.4 24 Dec 2022 00:49:05 -0000
@@ -42,6 +42,19 @@ configuration file for
.Xr netstart 8 .
The interface itself can be configured with
.Xr ifconfig 8 .
+To display
+.Cm wgpeer
+information for each
+.Nm wg
+interface option
+.Fl A
+to
+.Xr ifconfig 8
+should be used or
+.Nm wg
+interface should be specified as an argument to
+.Xr ifconfig 8
+command.
.Pp
.Nm wg
interfaces support the following
Index: sys/net/if_wg.c
===================================================================
RCS file: /cvs/src/sys/net/if_wg.c,v
retrieving revision 1.26
diff -u -p -u -r1.26 if_wg.c
--- sys/net/if_wg.c 21 Jul 2022 11:26:50 -0000 1.26
+++ sys/net/if_wg.c 24 Dec 2022 00:49:06 -0000
@@ -221,6 +221,9 @@ struct wg_peer {
SLIST_ENTRY(wg_peer) p_start_list;
int p_start_onlist;
+
+ struct mutex p_description_mtx;
+ char p_description[IFDESCRSIZE];
};
struct wg_softc {
@@ -275,6 +278,7 @@ int wg_peer_get_sockaddr(struct wg_peer
void wg_peer_clear_src(struct wg_peer *);
void wg_peer_get_endpoint(struct wg_peer *, struct wg_endpoint *);
void wg_peer_counters_add(struct wg_peer *, uint64_t, uint64_t);
+void wg_peer_set_description(struct wg_peer *, char *);
int wg_aip_add(struct wg_softc *, struct wg_peer *, struct wg_aip_io *);
struct wg_peer *
@@ -407,6 +411,9 @@ wg_peer_create(struct wg_softc *sc, uint
peer->p_counters_tx = 0;
peer->p_counters_rx = 0;
+ mtx_init(&peer->p_description_mtx, IPL_NET);
+ memset(peer->p_description, 0, IFDESCRSIZE);
+
mtx_init(&peer->p_endpoint_mtx, IPL_NET);
bzero(&peer->p_endpoint, sizeof(peer->p_endpoint));
@@ -581,6 +588,15 @@ wg_peer_counters_add(struct wg_peer *pee
mtx_leave(&peer->p_counters_mtx);
}
+void
+wg_peer_set_description(struct wg_peer *peer, char *description)
+{
+ mtx_enter(&peer->p_description_mtx);
+ memset(peer->p_description, 0, IFDESCRSIZE);
+ strlcpy(peer->p_description, description, IFDESCRSIZE);
+ mtx_leave(&peer->p_description_mtx);
+}
+
int
wg_aip_add(struct wg_softc *sc, struct wg_peer *peer, struct wg_aip_io *d)
{
@@ -2320,6 +2336,10 @@ wg_ioctl_set(struct wg_softc *sc, struct
}
}
+ if (peer_o.p_flags & WG_PEER_SET_DESCRIPTION) {
+ wg_peer_set_description(peer, peer_o.p_description);
+ }
+
aip_p = &peer_p->p_aips[0];
for (j = 0; j < peer_o.p_aips_count; j++) {
if ((ret = copyin(aip_p, &aip_o, sizeof(aip_o))) != 0)
@@ -2429,6 +2449,8 @@ wg_ioctl_get(struct wg_softc *sc, struct
aip_count++;
}
peer_o.p_aips_count = aip_count;
+
+ strlcpy(peer_o.p_description, peer->p_description, IFDESCRSIZE);
if ((ret = copyout(&peer_o, peer_p, sizeof(peer_o))) != 0)
goto unlock_and_ret_size;
Index: sys/net/if_wg.h
===================================================================
RCS file: /cvs/src/sys/net/if_wg.h,v
retrieving revision 1.4
diff -u -p -u -r1.4 if_wg.h
--- sys/net/if_wg.h 22 Jun 2020 12:20:44 -0000 1.4
+++ sys/net/if_wg.h 24 Dec 2022 00:49:06 -0000
@@ -61,6 +61,7 @@ struct wg_aip_io {
#define WG_PEER_REPLACE_AIPS (1 << 4)
#define WG_PEER_REMOVE (1 << 5)
#define WG_PEER_UPDATE (1 << 6)
+#define WG_PEER_SET_DESCRIPTION (1 << 7)
#define p_sa p_endpoint.sa_sa
#define p_sin p_endpoint.sa_sin
@@ -80,6 +81,7 @@ struct wg_peer_io {
uint64_t p_txbytes;
uint64_t p_rxbytes;
struct timespec p_last_handshake; /* nanotime */
+ char p_description[IFDESCRSIZE];
size_t p_aips_count;
struct wg_aip_io p_aips[];
};
--
Regards,
Mikolaj