int mcp_tcp_client_connect (struct ppp_mcp_sock *peer) { unsigned int ifindex = 0; if(peer->fd > 0) { close(peer->fd); peer->fd = -1; } /* Make socket for the peer. */ peer->fd = sockunion_socket (&peer->su); if (peer->fd < 0) return -1; /* If we can get socket for the peer, adjest TTL and make connection. */ sockopt_ttl (peer->su.sa.sa_family, peer->fd, 512); sockopt_reuseaddr (peer->fd); sockopt_reuseport (peer->fd); PPPD_DEBUG_TCP("%s [Event] Connect start to %s fd %d", peer->hostname, peer->hostname, peer->fd); /* Connect to the remote peer. */ return sockunion_connect (peer->fd, &peer->su, htons(peer->port), ifindex); }
/* Make ospf6d's server socket. */ int ospf6_serv_sock (void) { if (ospf6d_privs.change (ZPRIVS_RAISE)) zlog_err ("ospf6_serv_sock: could not raise privs"); ospf6_sock = socket (AF_INET6, SOCK_RAW, IPPROTO_OSPFIGP); if (ospf6_sock < 0) { zlog_warn ("Network: can't create OSPF6 socket."); if (ospf6d_privs.change (ZPRIVS_LOWER)) zlog_err ("ospf_sock_init: could not lower privs"); return -1; } if (ospf6d_privs.change (ZPRIVS_LOWER)) zlog_err ("ospf_sock_init: could not lower privs"); /* set socket options */ #if 1 sockopt_reuseaddr (ospf6_sock); #else ospf6_set_reuseaddr (); #endif /*1*/ ospf6_reset_mcastloop (); ospf6_set_pktinfo (); ospf6_set_transport_class (); ospf6_set_checksum (); /* setup global in6_addr, allspf6 and alldr6 for later use */ inet_pton (AF_INET6, ALLSPFROUTERS6, &allspfrouters6); inet_pton (AF_INET6, ALLDROUTERS6, &alldrouters6); return 0; }
//open the udp int udp_connect(struct peer* peer) { int ret, en; //open socket udp socket peer->fd = socket(AF_INET, SOCK_DGRAM, 0); if (peer->fd < 0) { fprintf(stderr, "socket: %s\n", strerror(errno)); return connect_error; } //set address and port re use sockopt_reuseaddr(peer->fd); sockopt_reuseport(peer->fd); en = errno; //try to bind ret = bind(peer->fd, (struct sockaddr *) &peer->su.sin, sizeof(struct sockaddr_in)); if (ret < 0) { //fprintf(stderr, "bind: %s\n", strerror(en)); close(peer->fd); return connect_error; }else{ //fprintf(stderr, "bind:%s\n", strerror(en)); } return connect_success; }
/* Make zebra's server socket. */ static void zebra_serv () { int ret; int accept_sock; struct sockaddr_in addr; accept_sock = socket (AF_INET, SOCK_STREAM, 0); if (accept_sock < 0) { zlog_warn ("Can't create zserv stream socket: %s", safe_strerror (errno)); zlog_warn ("zebra can't provice full functionality due to above error"); return; } memset (&route_type_oaths, 0, sizeof (route_type_oaths)); memset (&addr, 0, sizeof (struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_port = htons (ZEBRA_PORT); #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN addr.sin_len = sizeof (struct sockaddr_in); #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */ addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); sockopt_reuseaddr (accept_sock); sockopt_reuseport (accept_sock); if ( zserv_privs.change(ZPRIVS_RAISE) ) zlog (NULL, LOG_ERR, "Can't raise privileges"); ret = bind (accept_sock, (struct sockaddr *)&addr, sizeof (struct sockaddr_in)); if (ret < 0) { zlog_warn ("Can't bind to stream socket: %s", safe_strerror (errno)); zlog_warn ("zebra can't provice full functionality due to above error"); close (accept_sock); /* Avoid sd leak. */ return; } if ( zserv_privs.change(ZPRIVS_LOWER) ) zlog (NULL, LOG_ERR, "Can't lower privileges"); ret = listen (accept_sock, 1); if (ret < 0) { zlog_warn ("Can't listen to stream socket: %s", safe_strerror (errno)); zlog_warn ("zebra can't provice full functionality due to above error"); close (accept_sock); /* Avoid sd leak. */ return; } zebra_event (ZEBRA_SERV, accept_sock, NULL); }
/* Traditional IPv4 only version. */ int bgp_socket (struct bgp *bgp, unsigned short port) { int sock; int socklen; struct sockaddr_in sin; int ret; sock = socket (AF_INET, SOCK_STREAM, 0); if (sock < 0) { zlog_err ("socket: %s", strerror (errno)); return sock; } sockopt_reuseaddr (sock); sockopt_reuseport (sock); memset (&sin, 0, sizeof (struct sockaddr_in)); sin.sin_family = AF_INET; sin.sin_port = htons (port); socklen = sizeof (struct sockaddr_in); #ifdef HAVE_SIN_LEN sin.sin_len = socklen; #endif /* HAVE_SIN_LEN */ ret = bind (sock, (struct sockaddr *) &sin, socklen); if (ret < 0) { zlog_err ("bind: %s", strerror (errno)); close (sock); return ret; } ret = listen (sock, 3); if (ret < 0) { zlog_err ("listen: %s", strerror (errno)); close (sock); return ret; } #ifdef HAVE_TCP_SIGNATURE #ifdef HAVE_LINUX_TCP_SIGNATURE bm->sock = sock; #endif /* HAVE_LINUX_TCP_SIGNATURE */ #ifdef HAVE_OPENBSD_TCP_SIGNATURE bgp_tcpsig_set (sock, 0); bm->sock = -1; #endif /* HAVE_OPENBSD_TCP_SIGNATURE */ #endif /* HAVE_TCP_SIGNATURE */ thread_add_read (bm->master, bgp_accept, bgp, sock); return sock; }
/* BGP try to connect to the peer. */ int bgp_connect (struct peer *peer) { unsigned int ifindex = 0; /* Make socket for the peer. */ peer->fd = sockunion_socket (&peer->su); if (peer->fd < 0) return -1; /* If we can get socket for the peer, adjest TTL and make connection. */ if (peer->sort == BGP_PEER_EBGP) { sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl); if (peer->gtsm_hops) sockopt_minttl (peer->su.sa.sa_family, peer->fd, MAXTTL + 1 - peer->gtsm_hops); } sockopt_reuseaddr (peer->fd); sockopt_reuseport (peer->fd); #ifdef IPTOS_PREC_INTERNETCONTROL if (bgpd_privs.change (ZPRIVS_RAISE)) zlog_err ("%s: could not raise privs", __func__); if (sockunion_family (&peer->su) == AF_INET) setsockopt_ipv4_tos (peer->fd, IPTOS_PREC_INTERNETCONTROL); # ifdef HAVE_IPV6 else if (sockunion_family (&peer->su) == AF_INET6) setsockopt_ipv6_tclass (peer->fd, IPTOS_PREC_INTERNETCONTROL); # endif if (bgpd_privs.change (ZPRIVS_LOWER)) zlog_err ("%s: could not lower privs", __func__); #endif if (peer->password) bgp_md5_set_connect (peer->fd, &peer->su, peer->password); /* Bind socket. */ bgp_bind (peer); /* Update source bind. */ bgp_update_source (peer); #ifdef HAVE_IPV6 if (peer->ifname) ifindex = if_nametoindex (peer->ifname); #endif /* HAVE_IPV6 */ if (BGP_DEBUG (events, EVENTS)) plog_debug (peer->log, "%s [Event] Connect start to %s fd %d", peer->host, peer->host, peer->fd); /* Connect to the remote peer. */ return sockunion_connect (peer->fd, &peer->su, htons (peer->port), ifindex); }
/* BGP try to connect to the peer. */ int bgp_connect (struct peer *peer) { unsigned int ifindex = 0; /* Make socket for the peer. */ peer->fd = sockunion_socket (&peer->su); if (peer->fd < 0) return -1; set_nonblocking (peer->fd); /* Set socket send buffer size */ bgp_update_sock_send_buffer_size(peer->fd); bgp_set_socket_ttl (peer, peer->fd); sockopt_reuseaddr (peer->fd); sockopt_reuseport (peer->fd); #ifdef IPTOS_PREC_INTERNETCONTROL if (bgpd_privs.change (ZPRIVS_RAISE)) zlog_err ("%s: could not raise privs", __func__); if (sockunion_family (&peer->su) == AF_INET) setsockopt_ipv4_tos (peer->fd, IPTOS_PREC_INTERNETCONTROL); # ifdef HAVE_IPV6 else if (sockunion_family (&peer->su) == AF_INET6) setsockopt_ipv6_tclass (peer->fd, IPTOS_PREC_INTERNETCONTROL); # endif if (bgpd_privs.change (ZPRIVS_LOWER)) zlog_err ("%s: could not lower privs", __func__); #endif if (peer->password) bgp_md5_set_connect (peer->fd, &peer->su, peer->password); /* Bind socket. */ bgp_bind (peer); /* Update source bind. */ bgp_update_source (peer); #ifdef HAVE_IPV6 if (peer->ifname) ifindex = if_nametoindex (peer->ifname); #endif /* HAVE_IPV6 */ if (BGP_DEBUG (events, EVENTS)) plog_debug (peer->log, "%s [Event] Connect start to %s fd %d", peer->host, peer->host, peer->fd); /* Connect to the remote peer. */ return sockunion_connect (peer->fd, &peer->su, htons (peer->port), ifindex); }
static int bgp_listener (int sock, struct sockaddr *sa, socklen_t salen) { struct bgp_listener *listener; int ret, en; sockopt_reuseaddr (sock); sockopt_reuseport (sock); #ifdef IPTOS_PREC_INTERNETCONTROL if (sa->sa_family == AF_INET) setsockopt_ipv4_tos (sock, IPTOS_PREC_INTERNETCONTROL); #endif #ifdef IPV6_V6ONLY /* Want only IPV6 on ipv6 socket (not mapped addresses) */ if (sa->sa_family == AF_INET6) { int on = 1; setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, (void *) &on, sizeof (on)); } #endif if (bgpd_privs.change (ZPRIVS_RAISE) ) zlog_err ("bgp_socket: could not raise privs"); ret = bind (sock, sa, salen); en = errno; if (bgpd_privs.change (ZPRIVS_LOWER) ) zlog_err ("bgp_bind_address: could not lower privs"); if (ret < 0) { zlog_err ("bind: %s", safe_strerror (en)); return ret; } ret = listen (sock, 3); if (ret < 0) { zlog_err ("listen: %s", safe_strerror (errno)); return ret; } listener = XMALLOC (MTYPE_BGP_LISTENER, sizeof(*listener)); listener->fd = sock; memcpy(&listener->su, sa, salen); listener->thread = thread_add_read (master, bgp_accept, listener, sock); listnode_add (bm->listen_sockets, listener); return 0; }
static int bgp_listener(int sock, struct sockaddr *sa, socklen_t salen, struct bgp *bgp) { struct bgp_listener *listener; int ret, en; sockopt_reuseaddr(sock); sockopt_reuseport(sock); frr_elevate_privs(&bgpd_privs) { #ifdef IPTOS_PREC_INTERNETCONTROL if (sa->sa_family == AF_INET) setsockopt_ipv4_tos(sock, IPTOS_PREC_INTERNETCONTROL); else if (sa->sa_family == AF_INET6) setsockopt_ipv6_tclass(sock, IPTOS_PREC_INTERNETCONTROL); #endif sockopt_v6only(sa->sa_family, sock); ret = bind(sock, sa, salen); en = errno; } if (ret < 0) { flog_err_sys(EC_LIB_SOCKET, "bind: %s", safe_strerror(en)); return ret; } ret = listen(sock, SOMAXCONN); if (ret < 0) { flog_err_sys(EC_LIB_SOCKET, "listen: %s", safe_strerror(errno)); return ret; } listener = XCALLOC(MTYPE_BGP_LISTENER, sizeof(*listener)); listener->fd = sock; /* this socket needs a change of ns. record bgp back pointer */ if (bgp->vrf_id != VRF_DEFAULT && vrf_is_backend_netns()) listener->bgp = bgp; memcpy(&listener->su, sa, salen); listener->thread = NULL; thread_add_read(bm->master, bgp_accept, listener, sock, &listener->thread); listnode_add(bm->listen_sockets, listener); return 0; }
int shim_sock_init(void) { int shim_sock; if ( svd_privs.change (ZPRIVS_RAISE) ) zlog_err ("shim_sock_init: could not raise privs, %s", safe_strerror (errno) ); shim_sock = socket (AF_INET6, SOCK_RAW, IPPROTO_OSPFIGP); if (shim_sock < 0) { int save_errno = errno; if ( svd_privs.change (ZPRIVS_LOWER) ) zlog_err ("shim_sock_init: could not lower privs, %s", safe_strerror (errno) ); zlog_err ("shim_sock_init: socket: %s", safe_strerror (save_errno)); exit(1); } if (svd_privs.change (ZPRIVS_LOWER)) { zlog_err ("shim_sock_init: could not lower privs, %s", safe_strerror (errno) ); } sockopt_reuseaddr (shim_sock); u_int off = 0; if (setsockopt (shim_sock, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &off, sizeof (u_int)) < 0) zlog_warn ("Network: reset IPV6_MULTICAST_LOOP failed: %s", safe_strerror (errno)); if (setsockopt_ipv6_pktinfo (shim_sock, 1) < 0) zlog_warn ("Can't set pktinfo option for fd %d", shim_sock); int offset = 12; #ifndef DISABLE_IPV6_CHECKSUM if (setsockopt (shim_sock, IPPROTO_IPV6, IPV6_CHECKSUM, &offset, sizeof (offset)) < 0) zlog_warn ("Network: set IPV6_CHECKSUM failed: %s", safe_strerror (errno)); #else zlog_warn ("Network: Don't set IPV6_CHECKSUM"); #endif /* DISABLE_IPV6_CHECKSUM */ inet_pton (AF_INET6, ALLSPFROUTERS6, &allspfrouters6); inet_pton (AF_INET6, ALLDROUTERS6, &alldrouters6); return shim_sock; }
static int bgp_listener (int sock, struct sockaddr *sa, socklen_t salen) { struct bgp_listener *listener; int ret, en; sockopt_reuseaddr (sock); sockopt_reuseport (sock); if (bgpd_privs.change (ZPRIVS_RAISE)) zlog_err ("%s: could not raise privs", __func__); #ifdef IPTOS_PREC_INTERNETCONTROL if (sa->sa_family == AF_INET) setsockopt_ipv4_tos (sock, IPTOS_PREC_INTERNETCONTROL); # ifdef HAVE_IPV6 else if (sa->sa_family == AF_INET6) setsockopt_ipv6_tclass (sock, IPTOS_PREC_INTERNETCONTROL); # endif #endif sockopt_v6only (sa->sa_family, sock); ret = bind (sock, sa, salen); en = errno; if (bgpd_privs.change (ZPRIVS_LOWER)) zlog_err ("%s: could not lower privs", __func__); if (ret < 0) { zlog_err ("bind: %s", safe_strerror (en)); return ret; } ret = listen (sock, 3); if (ret < 0) { zlog_err ("listen: %s", safe_strerror (errno)); return ret; } listener = XMALLOC (MTYPE_BGP_LISTENER, sizeof(*listener)); listener->fd = sock; memcpy(&listener->su, sa, salen); listener->thread = thread_add_read (master, bgp_accept, listener, sock); listnode_add (bm->listen_sockets, listener); return 0; }
static int ext_client_bgp_listener(struct ext_client_bgp * ext_client_bgp, int sock, struct sockaddr * sa, socklen_t salen) { struct bgp_listener *listener; int ret, en; sockopt_reuseaddr (sock); sockopt_reuseport (sock); #ifdef IPTOS_PREC_INTERNETCONTROL if (sa->sa_family == AF_INET) setsockopt_ipv4_tos (sock, IPTOS_PREC_INTERNETCONTROL); #endif #ifdef IPV6_V6ONLY /* Want only IPV6 on ipv6 socket (not mapped addresses) */ if (sa->sa_family == AF_INET6) { int on = 1; setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, (void *) &on, sizeof (on)); } #endif ret = bind (sock, sa, salen); if (ret < 0) { printf ("bind: %s", strerror (en)); return ret; } ret = listen (sock, 3); if (ret < 0) { printf("listen: %s", strerror (errno)); return ret; } listener = calloc(1, sizeof(struct bgp_listener)); listener->accept_fd = sock; listener->peer_fd = -1; memcpy(&listener->su, sa, salen); ext_client_bgp_event(EXT_CLIENT_BGP_ACCEPT, ext_client_bgp, listener); list_push_back(&ext_client_bgp->listen_sockets, &listener->node); return 0; }
/* BGP try to connect to the peer. */ int bgp_connect (struct peer *peer) { unsigned int ifindex = 0; /* Make socket for the peer. */ peer->fd = sockunion_socket (&peer->su); if (peer->fd < 0) return -1; /* If we can get socket for the peer, adjest TTL and make connection. */ if (peer_sort (peer) == BGP_PEER_EBGP) sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl); sockopt_reuseaddr (peer->fd); sockopt_reuseport (peer->fd); /* Bind socket. */ bgp_bind (peer); /* Update source bind. */ bgp_update_source (peer); #ifdef HAVE_IPV6 if (peer->ifname) ifindex = if_nametoindex (peer->ifname); #endif /* HAVE_IPV6 */ if (BGP_DEBUG (events, EVENTS)) plog_info (peer->log, "%s [Event] Connect start to %s fd %d", peer->host, peer->host, peer->fd); #ifdef HAVE_TCP_SIGNATURE if (CHECK_FLAG (peer->flags, PEER_FLAG_PASSWORD)) bgp_tcpsig_set (peer->fd, peer); #endif /* HAVE_TCP_SIGNATURE */ /* Connect to the remote peer. */ return sockunion_connect (peer->fd, &peer->su, htons (peer->port), ifindex); }
int shim_sisis_listener(int sock, struct sockaddr * sa, socklen_t salen) { int ret,en; sockopt_reuseaddr(sock); sockopt_reuseport(sock); if (sa->sa_family == AF_INET6) { int on = 1; setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, (void *) &on, sizeof (on)); } if (svd_privs.change (ZPRIVS_RAISE) ) zlog_err ("shim_sisis_listener: could not raise privs"); ret = bind (sock, sa, salen); en = errno; if (svd_privs.change (ZPRIVS_LOWER) ) zlog_err ("shim_sisis_listener: could not lower privs"); if (ret < 0) { zlog_err ("bind: %s", safe_strerror (en)); return ret; } ret = listen (sock, 3); if (ret < 0) { zlog_err ("listen: %s", safe_strerror (errno)); return ret; } thread_add_read (master, shim_sisis_accept, NULL, sock); return 0; }
int ppp_client_connection_mcp (struct thread *thread) { struct ppp_mcp_sock *peer; //struct listnode *nn, *nm; unsigned int ifindex = 0; int ret; peer = THREAD_ARG (thread); peer->t_connect_admin = NULL; MCP_TIMER_ON (peer->t_connect_admin, ppp_client_connection_mcp, peer, MCP_TRANS_TCP_RECONNECT_ADMIN_TIME); if(peer->connect_status == CLIENT_CONNECT_SERVER_OK) return 0; if(peer->fd > 0) { close(peer->fd); peer->fd = -1; } peer->fd = sockunion_socket (&peer->su); if (peer->fd < 0) { PPPD_DEBUG_TCP("ppp client connect server peer:%s error", peer->hostname); return -1; } sockopt_reuseaddr (peer->fd); sockopt_reuseport (peer->fd); ret = sockunion_connect(peer->fd, &peer->su, htons(peer->port), ifindex); if(ret == connect_error) { PPPD_DEBUG_TCP("client connect server err"); return -1; } MCP_WRITE_ON (peer->t_check, ppp_tcp_client_connect_check, peer, peer->fd); return 0; }
/* active peer socket setup */ int pim_msdp_sock_connect(struct pim_msdp_peer *mp) { int rc; if (PIM_DEBUG_MSDP_INTERNAL) { zlog_debug("MSDP peer %s attempt connect%s", mp->key_str, mp->fd < 0 ? "" : "(dup)"); } /* if we have an existing connection we need to kill that one * with this one */ if (mp->fd >= 0) { if (PIM_DEBUG_MSDP_EVENTS) { zlog_notice( "msdp duplicate connect to %s nuke old connection", mp->key_str); } pim_msdp_peer_stop_tcp_conn(mp, false /* chg_state */); } /* Make socket for the peer. */ mp->fd = sockunion_socket(&mp->su_peer); if (mp->fd < 0) { flog_err_sys(LIB_ERR_SOCKET, "pim_msdp_socket socket failure: %s", safe_strerror(errno)); return -1; } if (mp->pim->vrf_id != VRF_DEFAULT) { struct interface *ifp = if_lookup_by_name(mp->pim->vrf->name, mp->pim->vrf_id); if (!ifp) { flog_err(LIB_ERR_INTERFACE, "%s: Unable to lookup vrf interface: %s", __PRETTY_FUNCTION__, mp->pim->vrf->name); return -1; } if (pim_socket_bind(mp->fd, ifp)) { flog_err_sys(LIB_ERR_SOCKET, "%s: Unable to bind to socket: %s", __PRETTY_FUNCTION__, safe_strerror(errno)); close(mp->fd); mp->fd = -1; return -1; } } set_nonblocking(mp->fd); /* Set socket send buffer size */ pim_msdp_update_sock_send_buffer_size(mp->fd); sockopt_reuseaddr(mp->fd); sockopt_reuseport(mp->fd); /* source bind */ rc = sockunion_bind(mp->fd, &mp->su_local, 0, &mp->su_local); if (rc < 0) { flog_err_sys(LIB_ERR_SOCKET, "pim_msdp_socket connect bind failure: %s", safe_strerror(errno)); close(mp->fd); mp->fd = -1; return rc; } /* Connect to the remote mp. */ return (sockunion_connect(mp->fd, &mp->su_peer, htons(PIM_MSDP_TCP_PORT), 0)); }
/* global listener for the MSDP well know TCP port */ int pim_msdp_sock_listen(struct pim_instance *pim) { int sock; int socklen; struct sockaddr_in sin; int rc; struct pim_msdp_listener *listener = &pim->msdp.listener; if (pim->msdp.flags & PIM_MSDPF_LISTENER) { /* listener already setup */ return 0; } sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { flog_err_sys(LIB_ERR_SOCKET, "socket: %s", safe_strerror(errno)); return sock; } memset(&sin, 0, sizeof(struct sockaddr_in)); sin.sin_family = AF_INET; sin.sin_port = htons(PIM_MSDP_TCP_PORT); socklen = sizeof(struct sockaddr_in); #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN sin.sin_len = socklen; #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */ sockopt_reuseaddr(sock); sockopt_reuseport(sock); if (pim->vrf_id != VRF_DEFAULT) { struct interface *ifp = if_lookup_by_name(pim->vrf->name, pim->vrf_id); if (!ifp) { flog_err(LIB_ERR_INTERFACE, "%s: Unable to lookup vrf interface: %s", __PRETTY_FUNCTION__, pim->vrf->name); close(sock); return -1; } if (pim_socket_bind(sock, ifp)) { flog_err_sys(LIB_ERR_SOCKET, "%s: Unable to bind to socket: %s", __PRETTY_FUNCTION__, safe_strerror(errno)); close(sock); return -1; } } frr_elevate_privs(&pimd_privs) { /* bind to well known TCP port */ rc = bind(sock, (struct sockaddr *)&sin, socklen); } if (rc < 0) { flog_err_sys(LIB_ERR_SOCKET, "pim_msdp_socket bind to port %d: %s", ntohs(sin.sin_port), safe_strerror(errno)); close(sock); return rc; } rc = listen(sock, 3 /* backlog */); if (rc < 0) { flog_err_sys(LIB_ERR_SOCKET, "pim_msdp_socket listen: %s", safe_strerror(errno)); close(sock); return rc; } /* add accept thread */ listener->fd = sock; memcpy(&listener->su, &sin, socklen); listener->thread = NULL; thread_add_read(pim->msdp.master, pim_msdp_sock_accept, pim, sock, &listener->thread); pim->msdp.flags |= PIM_MSDPF_LISTENER; return 0; }
/* BGP try to connect to the peer. */ int bgp_connect(struct peer *peer) { assert(!CHECK_FLAG(peer->thread_flags, PEER_THREAD_WRITES_ON)); assert(!CHECK_FLAG(peer->thread_flags, PEER_THREAD_READS_ON)); ifindex_t ifindex = 0; if (peer->conf_if && BGP_PEER_SU_UNSPEC(peer)) { zlog_debug("Peer address not learnt: Returning from connect"); return 0; } frr_elevate_privs(&bgpd_privs) { /* Make socket for the peer. */ peer->fd = vrf_sockunion_socket(&peer->su, peer->bgp->vrf_id, bgp_get_bound_name(peer)); } if (peer->fd < 0) return -1; set_nonblocking(peer->fd); /* Set socket send buffer size */ setsockopt_so_sendbuf(peer->fd, BGP_SOCKET_SNDBUF_SIZE); if (bgp_set_socket_ttl(peer, peer->fd) < 0) return -1; sockopt_reuseaddr(peer->fd); sockopt_reuseport(peer->fd); #ifdef IPTOS_PREC_INTERNETCONTROL frr_elevate_privs(&bgpd_privs) { if (sockunion_family(&peer->su) == AF_INET) setsockopt_ipv4_tos(peer->fd, IPTOS_PREC_INTERNETCONTROL); else if (sockunion_family(&peer->su) == AF_INET6) setsockopt_ipv6_tclass(peer->fd, IPTOS_PREC_INTERNETCONTROL); } #endif if (peer->password) { uint16_t prefixlen = peer->su.sa.sa_family == AF_INET ? IPV4_MAX_PREFIXLEN : IPV6_MAX_PREFIXLEN; bgp_md5_set_connect(peer->fd, &peer->su, prefixlen, peer->password); } /* Update source bind. */ if (bgp_update_source(peer) < 0) { return connect_error; } if (peer->conf_if || peer->ifname) ifindex = ifname2ifindex(peer->conf_if ? peer->conf_if : peer->ifname, peer->bgp->vrf_id); if (bgp_debug_neighbor_events(peer)) zlog_debug("%s [Event] Connect start to %s fd %d", peer->host, peer->host, peer->fd); /* Connect to the remote peer. */ return sockunion_connect(peer->fd, &peer->su, htons(peer->port), ifindex); }
int smux_socket () { int ret; #ifdef HAVE_IPV6 struct addrinfo hints, *res0, *res; int gai; #else struct sockaddr_in serv; struct servent *sp; #endif int sock = 0; #ifdef HAVE_IPV6 memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; gai = getaddrinfo(NULL, "smux", &hints, &res0); if (gai == EAI_SERVICE) { char servbuf[NI_MAXSERV]; sprintf(servbuf,"%d",SMUX_PORT_DEFAULT); servbuf[sizeof (servbuf) - 1] = '\0'; gai = getaddrinfo(NULL, servbuf, &hints, &res0); } if (gai) { zlog_warn("Cannot locate loopback service smux"); return -1; } for(res=res0; res; res=res->ai_next) { if (res->ai_family != AF_INET #ifdef HAVE_IPV6 && res->ai_family != AF_INET6 #endif /* HAVE_IPV6 */ ) continue; sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (sock < 0) continue; sockopt_reuseaddr (sock); sockopt_reuseport (sock); ret = connect (sock, res->ai_addr, res->ai_addrlen); if (ret < 0) { close(sock); sock = -1; continue; } break; } freeaddrinfo(res0); if (sock < 0) zlog_warn ("Can't connect to SNMP agent with SMUX"); #else sock = socket (AF_INET, SOCK_STREAM, 0); if (sock < 0) { zlog_warn ("Can't make socket for SNMP"); return -1; } memset (&serv, 0, sizeof (struct sockaddr_in)); serv.sin_family = AF_INET; #ifdef HAVE_SIN_LEN serv.sin_len = sizeof (struct sockaddr_in); #endif /* HAVE_SIN_LEN */ sp = getservbyname ("smux", "tcp"); if (sp != NULL) serv.sin_port = sp->s_port; else serv.sin_port = htons (SMUX_PORT_DEFAULT); serv.sin_addr.s_addr = htonl (INADDR_LOOPBACK); sockopt_reuseaddr (sock); sockopt_reuseport (sock); ret = connect (sock, (struct sockaddr *) &serv, sizeof (struct sockaddr_in)); if (ret < 0) { close (sock); smux_sock = -1; zlog_warn ("Can't connect to SNMP agent with SMUX"); return -1; } #endif return sock; }
/* BGP try to connect to the peer. */ int bgp_connect (struct peer *peer) { printf("\n BGP CONNECT: I am in BGP Connect\n"); unsigned int ifindex = 0; /*setting up TLS for a second*/ printf("\n BGP CONNECT: I am just about to initialise SSL\n"); ssl_init(); //initialise the library, method, contact of ssl session, returns nothing if(BGPTLS.psCTX==NULL) { printf("\n BGP CONNECT: There is no entry in the .psCTX pointer \n"); } else { printf("\n BGP CONNECT: There is an entry in the .psCTX pointer, it is %i \n", BGPTLS_sess_server.psCTX); } printf("\n BGP CONNECT: There is an entry in the .psCTX pointer: "); printf("%i \n", BGPTLS.psCTX); /*if (SSL_CTX_use_certificate_chain_file(BGPTLS_sess_server.psCTX,"/usr/home/dugald/subcert.pem")!=1) { printf("Error loading certificate from file"); } else { printf("Certificate has loaded correctly"); } */ /* Make socket for the peer. */ printf("BGP CONNECT: Here's sockets"); peer->fd = sockunion_socket (&peer->su); SSL_connect(BGPTLS->ssl); if (peer->fd < 0) return -1; /* If we can get socket for the peer, adjest TTL and make connection. */ if (peer->sort == BGP_PEER_EBGP) { sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl); if (peer->gtsm_hops) sockopt_minttl (peer->su.sa.sa_family, peer->fd, MAXTTL + 1 - peer->gtsm_hops); } sockopt_reuseaddr (peer->fd); sockopt_reuseport (peer->fd); #ifdef IPTOS_PREC_INTERNETCONTROL if (bgpd_privs.change (ZPRIVS_RAISE)) zlog_err ("%s: could not raise privs", __func__); if (sockunion_family (&peer->su) == AF_INET) setsockopt_ipv4_tos (peer->fd, IPTOS_PREC_INTERNETCONTROL); # ifdef HAVE_IPV6 else if (sockunion_family (&peer->su) == AF_INET6) setsockopt_ipv6_tclass (peer->fd, IPTOS_PREC_INTERNETCONTROL); # endif if (bgpd_privs.change (ZPRIVS_LOWER)) zlog_err ("%s: could not lower privs", __func__); #endif if (peer->password) bgp_md5_set_connect (peer->fd, &peer->su, peer->password); /* Bind socket. */ //bgp_bind (peer); /* Update source bind. */ //bgp_update_source (peer); #ifdef HAVE_IPV6 if (peer->ifname) ifindex = if_nametoindex (peer->ifname); #endif /* HAVE_IPV6 */ if (BGP_DEBUG (events, EVENTS)) plog_debug (peer->log, "%s [Event] Connect start to %s fd %d", peer->host, peer->host, peer->fd); /* Connect to the remote peer. */ return sockunion_connect (peer->fd, &peer->su, htons (peer->port), ifindex); }
int bgp_socket (struct bgp *bgp, unsigned short port) { int ret; struct addrinfo req; struct addrinfo *ainfo; struct addrinfo *ainfo_save; int sock = 0; char port_str[BUFSIZ]; memset (&req, 0, sizeof (struct addrinfo)); req.ai_flags = AI_PASSIVE; req.ai_family = AF_UNSPEC; req.ai_socktype = SOCK_STREAM; sprintf (port_str, "%d", port); port_str[sizeof (port_str) - 1] = '\0'; ret = getaddrinfo (NULL, port_str, &req, &ainfo); if (ret != 0) { zlog_err ("getaddrinfo: %s", gai_strerror (ret)); return -1; } ainfo_save = ainfo; do { if (ainfo->ai_family != AF_INET && ainfo->ai_family != AF_INET6) continue; sock = socket (ainfo->ai_family, ainfo->ai_socktype, ainfo->ai_protocol); if (sock < 0) { zlog_err ("socket: %s", strerror (errno)); continue; } sockopt_reuseaddr (sock); sockopt_reuseport (sock); ret = bind (sock, ainfo->ai_addr, ainfo->ai_addrlen); if (ret < 0) { zlog_err ("bind: %s", strerror (errno)); close (sock); continue; } ret = listen (sock, 3); if (ret < 0) { zlog_err ("listen: %s", strerror (errno)); close (sock); continue; } #ifdef HAVE_TCP_SIGNATURE #ifdef HAVE_LINUX_TCP_SIGNATURE bm->sock = sock; #endif /* HAVE_LINUX_TCP_SIGNATURE */ #ifdef HAVE_OPENBSD_TCP_SIGNATURE bgp_tcpsig_set (sock, 0); bm->sock = -1; #endif /* HAVE_OPENBSD_TCP_SIGNATURE */ #endif /* HAVE_TCP_SIGNATURE */ thread_add_read (master, bgp_accept, bgp, sock); } while ((ainfo = ainfo->ai_next) != NULL); freeaddrinfo (ainfo_save); return sock; }