]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merge pull request #3898 from dslicenc/peer-group-remote-as
authorDavid Lamparter <equinox@diac24.net>
Mon, 11 Mar 2019 18:40:24 +0000 (19:40 +0100)
committerGitHub <noreply@github.com>
Mon, 11 Mar 2019 18:40:24 +0000 (19:40 +0100)
bpgd: resolve more neighbor peer-group issues

1  2 
bgpd/bgp_vty.c
bgpd/bgpd.c

diff --combined bgpd/bgp_vty.c
index d426e65c530ab2881138c0124c019c72dac0d2dd,8cb20c5e7f7483577a263628cce950fe1d01907b..742e61fbd669291bdf212879aa911357a1356cd0
@@@ -2841,18 -2841,23 +2841,23 @@@ static int peer_remote_as_vty(struct vt
                as = strtoul(as_str, NULL, 10);
        }
  
-       /* If peer is peer group, call proper function.  */
+       /* If peer is peer group or interface peer, call proper function. */
        ret = str2sockunion(peer_str, &su);
        if (ret < 0) {
-               /* Check for peer by interface */
+               struct peer *peer;
+               /* Check if existing interface peer */
+               peer = peer_lookup_by_conf_if(bgp, peer_str);
                ret = peer_remote_as(bgp, NULL, peer_str, &as, as_type, afi,
                                     safi);
-               if (ret < 0) {
+               /* if not interface peer, check peer-group settings */
+               if (ret < 0 && !peer) {
                        ret = peer_group_remote_as(bgp, peer_str, &as, as_type);
                        if (ret < 0) {
                                vty_out(vty,
-                                       "%% Create the peer-group or interface first or specify \"interface\" keyword\n");
-                               vty_out(vty, "%% if using an unnumbered interface neighbor\n");
+                                       "%% Create the peer-group or interface first\n");
                                return CMD_WARNING_CONFIG_FAILED;
                        }
                        return CMD_SUCCESS;
@@@ -3251,7 -3256,7 +3256,7 @@@ DEFUN (no_neighbor_interface_peer_group
        /* look up for neighbor by interface name config. */
        peer = peer_lookup_by_conf_if(bgp, argv[idx_word]->arg);
        if (peer) {
-               peer_as_change(peer, 0, AS_SPECIFIED);
+               peer_as_change(peer, 0, AS_UNSPECIFIED);
                return CMD_SUCCESS;
        }
  
@@@ -14456,7 -14461,8 +14461,7 @@@ static int lcommunity_list_set_vty(stru
  
        /* Free temporary community list string allocated by
           argv_concat().  */
 -      if (str)
 -              XFREE(MTYPE_TMP, str);
 +      XFREE(MTYPE_TMP, str);
  
        if (ret < 0) {
                community_list_perror(vty, ret);
@@@ -14507,7 -14513,8 +14512,7 @@@ static int lcommunity_list_unset_vty(st
  
        /* Free temporary community list string allocated by
           argv_concat().  */
 -      if (str)
 -              XFREE(MTYPE_TMP, str);
 +      XFREE(MTYPE_TMP, str);
  
        if (ret < 0) {
                community_list_perror(vty, ret);
diff --combined bgpd/bgpd.c
index d99b402e28b1c18c3a316acc69300a827177f135,1a73301e433c3256b1c3aead4ae9dabeba313d3b..a20042456167965c163d7f1a91d3c1e0b9e93ac1
@@@ -116,7 -116,7 +116,7 @@@ static int bgp_check_main_socket(bool c
  {
        static int bgp_server_main_created;
  
 -      if (create == true) {
 +      if (create) {
                if (bgp_server_main_created)
                        return 0;
                if (bgp_socket(bgp, bm->port, bm->address) < 0)
@@@ -1099,7 -1099,8 +1099,7 @@@ static void peer_free(struct peer *peer
                peer->update_if = NULL;
        }
  
 -      if (peer->notify.data)
 -              XFREE(MTYPE_TMP, peer->notify.data);
 +      XFREE(MTYPE_TMP, peer->notify.data);
        memset(&peer->notify, 0, sizeof(struct bgp_notify));
  
        if (peer->clear_node_queue)
@@@ -1321,7 -1322,8 +1321,7 @@@ void peer_xfer_config(struct peer *peer
                peer_dst->update_source =
                        sockunion_dup(peer_src->update_source);
        } else if (peer_src->update_if) {
 -              if (peer_dst->update_if)
 -                      XFREE(MTYPE_PEER_UPDATE_SOURCE, peer_dst->update_if);
 +              XFREE(MTYPE_PEER_UPDATE_SOURCE, peer_dst->update_if);
                if (peer_dst->update_source) {
                        sockunion_free(peer_dst->update_source);
                        peer_dst->update_source = NULL;
        }
  
        if (peer_src->ifname) {
 -              if (peer_dst->ifname)
 -                      XFREE(MTYPE_BGP_PEER_IFNAME, peer_dst->ifname);
 +              XFREE(MTYPE_BGP_PEER_IFNAME, peer_dst->ifname);
  
                peer_dst->ifname =
                        XSTRDUP(MTYPE_BGP_PEER_IFNAME, peer_src->ifname);
@@@ -1538,12 -1541,14 +1538,12 @@@ struct peer *peer_create(union sockunio
                        peer->su = *su;
                else
                        bgp_peer_conf_if_to_su_update(peer);
 -              if (peer->host)
 -                      XFREE(MTYPE_BGP_PEER_HOST, peer->host);
 +              XFREE(MTYPE_BGP_PEER_HOST, peer->host);
                peer->host = XSTRDUP(MTYPE_BGP_PEER_HOST, conf_if);
        } else if (su) {
                peer->su = *su;
                sockunion2str(su, buf, SU_ADDRSTRLEN);
 -              if (peer->host)
 -                      XFREE(MTYPE_BGP_PEER_HOST, peer->host);
 +              XFREE(MTYPE_BGP_PEER_HOST, peer->host);
                peer->host = XSTRDUP(MTYPE_BGP_PEER_HOST, buf);
        }
        peer->local_as = local_as;
@@@ -2379,7 -2384,8 +2379,7 @@@ static int peer_group_cmp(struct peer_g
  /* Peer group cofiguration. */
  static struct peer_group *peer_group_new(void)
  {
 -      return (struct peer_group *)XCALLOC(MTYPE_PEER_GROUP,
 -                                          sizeof(struct peer_group));
 +      return XCALLOC(MTYPE_PEER_GROUP, sizeof(struct peer_group));
  }
  
  static void peer_group_free(struct peer_group *group)
@@@ -2410,7 -2416,8 +2410,7 @@@ struct peer_group *peer_group_get(struc
  
        group = peer_group_new();
        group->bgp = bgp;
 -      if (group->name)
 -              XFREE(MTYPE_PEER_GROUP_HOST, group->name);
 +      XFREE(MTYPE_PEER_GROUP_HOST, group->name);
        group->name = XSTRDUP(MTYPE_PEER_GROUP_HOST, name);
        group->peer = list_new();
        for (afi = AFI_IP; afi < AFI_MAX; afi++)
        group->conf = peer_new(bgp);
        if (!bgp_flag_check(bgp, BGP_FLAG_NO_DEFAULT_IPV4))
                group->conf->afc[AFI_IP][SAFI_UNICAST] = 1;
 -      if (group->conf->host)
 -              XFREE(MTYPE_BGP_PEER_HOST, group->conf->host);
 +      XFREE(MTYPE_BGP_PEER_HOST, group->conf->host);
        group->conf->host = XSTRDUP(MTYPE_BGP_PEER_HOST, name);
        group->conf->group = group;
        group->conf->as = 0;
@@@ -2714,7 -2722,7 +2714,7 @@@ int peer_group_bind(struct bgp *bgp, un
                        peer->sort = group->conf->sort;
                }
  
-               if (!group->conf->as) {
+               if (!group->conf->as && peer_sort(peer)) {
                        if (peer_sort(group->conf) != BGP_PEER_INTERNAL
                            && peer_sort(group->conf) != peer_sort(peer)) {
                                if (as)
@@@ -2878,7 -2886,8 +2878,7 @@@ static struct bgp *bgp_create(as_t *as
        bgp->vrf_id = (inst_type == BGP_INSTANCE_TYPE_DEFAULT) ? VRF_DEFAULT
                                                               : VRF_UNKNOWN;
        bgp->peer_self = peer_new(bgp);
 -      if (bgp->peer_self->host)
 -              XFREE(MTYPE_BGP_PEER_HOST, bgp->peer_self->host);
 +      XFREE(MTYPE_BGP_PEER_HOST, bgp->peer_self->host);
        bgp->peer_self->host =
                XSTRDUP(MTYPE_BGP_PEER_HOST, "Static announcement");
        if (bgp->peer_self->hostname != NULL) {
@@@ -3395,7 -3404,8 +3395,7 @@@ void bgp_free(struct bgp *bgp
                if (bgp->rib[afi][safi])
                        bgp_table_finish(&bgp->rib[afi][safi]);
                rmap = &bgp->table_map[afi][safi];
 -              if (rmap->name)
 -                      XFREE(MTYPE_ROUTE_MAP_NAME, rmap->name);
 +              XFREE(MTYPE_ROUTE_MAP_NAME, rmap->name);
        }
  
        bgp_scan_finish(bgp);
                        ecommunity_free(&bgp->vpn_policy[afi].rtlist[dir]);
        }
  
 -      if (bgp->name)
 -              XFREE(MTYPE_BGP, bgp->name);
 -      if (bgp->name_pretty)
 -              XFREE(MTYPE_BGP, bgp->name_pretty);
 +      XFREE(MTYPE_BGP, bgp->name);
 +      XFREE(MTYPE_BGP, bgp->name_pretty);
  
        XFREE(MTYPE_BGP, bgp);
  }
@@@ -4356,7 -4368,8 +4356,7 @@@ int peer_ebgp_multihop_unset(struct pee
  /* Neighbor description. */
  int peer_description_set(struct peer *peer, const char *desc)
  {
 -      if (peer->desc)
 -              XFREE(MTYPE_PEER_DESC, peer->desc);
 +      XFREE(MTYPE_PEER_DESC, peer->desc);
  
        peer->desc = XSTRDUP(MTYPE_PEER_DESC, desc);
  
  
  int peer_description_unset(struct peer *peer)
  {
 -      if (peer->desc)
 -              XFREE(MTYPE_PEER_DESC, peer->desc);
 +      XFREE(MTYPE_PEER_DESC, peer->desc);
  
        peer->desc = NULL;
  
@@@ -5111,13 -5125,15 +5111,13 @@@ int peer_advertise_interval_unset(struc
  /* neighbor interface */
  void peer_interface_set(struct peer *peer, const char *str)
  {
 -      if (peer->ifname)
 -              XFREE(MTYPE_BGP_PEER_IFNAME, peer->ifname);
 +      XFREE(MTYPE_BGP_PEER_IFNAME, peer->ifname);
        peer->ifname = XSTRDUP(MTYPE_BGP_PEER_IFNAME, str);
  }
  
  void peer_interface_unset(struct peer *peer)
  {
 -      if (peer->ifname)
 -              XFREE(MTYPE_BGP_PEER_IFNAME, peer->ifname);
 +      XFREE(MTYPE_BGP_PEER_IFNAME, peer->ifname);
        peer->ifname = NULL;
  }