int bgp_md5_set (struct peer *peer) { struct listnode *node; int ret = 0; struct bgp_listener *listener; if ( bgpd_privs.change (ZPRIVS_RAISE) ) { zlog_err ("%s: could not raise privs", __func__); return -1; } /* Just set the password on the listen socket(s). Outbound connections * are taken care of in bgp_connect() below. */ for (ALL_LIST_ELEMENTS_RO(bm->listen_sockets, node, listener)) if (listener->su.sa.sa_family == peer->su.sa.sa_family) { ret = bgp_md5_set_socket (listener->fd, &peer->su, peer->password); break; } if (bgpd_privs.change (ZPRIVS_LOWER) ) zlog_err ("%s: could not lower privs", __func__); return ret; }
static int bgp_md5_set_password(struct peer *peer, const char *password) { struct listnode *node; int ret = 0; struct bgp_listener *listener; /* * Set or unset the password on the listen socket(s). Outbound * connections are taken care of in bgp_connect() below. */ frr_elevate_privs(&bgpd_privs) { for (ALL_LIST_ELEMENTS_RO(bm->listen_sockets, node, listener)) if (listener->su.sa.sa_family == peer->su.sa.sa_family) { uint16_t prefixlen = peer->su.sa.sa_family == AF_INET ? IPV4_MAX_PREFIXLEN : IPV6_MAX_PREFIXLEN; ret = bgp_md5_set_socket(listener->fd, &peer->su, prefixlen, password); break; } } return ret; }
/* Helper for bgp_connect */ static int bgp_md5_set_connect(int socket, union sockunion *su, uint16_t prefixlen, const char *password) { int ret = -1; #if HAVE_DECL_TCP_MD5SIG frr_elevate_privs(&bgpd_privs) { ret = bgp_md5_set_socket(socket, su, prefixlen, password); } #endif /* HAVE_TCP_MD5SIG */ return ret; }
/* Helper for bgp_connect */ static int bgp_md5_set_connect (int socket, union sockunion *su, const char *password) { int ret = -1; #if HAVE_DECL_TCP_MD5SIG if ( bgpd_privs.change (ZPRIVS_RAISE) ) { zlog_err ("%s: could not raise privs", __func__); return ret; } ret = bgp_md5_set_socket (socket, su, password); if (bgpd_privs.change (ZPRIVS_LOWER) ) zlog_err ("%s: could not lower privs", __func__); #endif /* HAVE_TCP_MD5SIG */ return ret; }
int bgp_md5_set_prefix(struct prefix *p, const char *password) { int ret = 0; union sockunion su; struct listnode *node; struct bgp_listener *listener; /* Set or unset the password on the listen socket(s). */ frr_elevate_privs(&bgpd_privs) { for (ALL_LIST_ELEMENTS_RO(bm->listen_sockets, node, listener)) if (listener->su.sa.sa_family == p->family) { prefix2sockunion(p, &su); ret = bgp_md5_set_socket(listener->fd, &su, p->prefixlen, password); break; } } return ret; }