+
+static void
+setbridge_hostfilter(const char *ifn, const char *addr, int s,
+ const struct afswtch *afp)
+{
+ struct ifbrhostfilter req;
+ struct ether_addr *ea;
+ struct in_addr in;
+
+ memset(&req, 0, sizeof(req));
+ req.ifbrhf_flags = IFBRHF_ENABLED;
+
+ strlcpy(req.ifbrhf_ifsname, ifn, sizeof(req.ifbrhf_ifsname));
+
+ ea = ether_aton(addr);
+ if (ea != NULL) {
+ req.ifbrhf_flags |= IFBRHF_HWSRC;
+ bcopy(ea, req.ifbrhf_hwsrca, sizeof(req.ifbrhf_hwsrca));
+ } else if (inet_aton(addr, &in) != 0) {
+ req.ifbrhf_flags |= IFBRHF_IPSRC;
+ req.ifbrhf_ipsrc = in.s_addr;
+ } else
+ errx(1, "invalid address: %s", addr);
+
+ if (do_cmd(s, BRDGSHOSTFILTER, &req, sizeof(req), 1) < 0)
+ err(1, "BRDGSHOSTFILTER %s %s", ifn, addr);
+}
+
+static void
+unsetbridge_hostfilter(const char *ifn, int d, int s, const struct afswtch *afp)
+{
+ struct ifbrhostfilter req;
+
+ memset(&req, 0, sizeof(req));
+ strlcpy(req.ifbrhf_ifsname, ifn, sizeof(req.ifbrhf_ifsname));
+
+ if (do_cmd(s, BRDGSHOSTFILTER, &req, sizeof(req), 1) < 0)
+ err(1, "BRDGSHOSTFILTER");
+}
+