diff options
| -rw-r--r-- | bgpd/bgp_route.c | 16 | ||||
| -rw-r--r-- | bgpd/bgp_zebra.c | 6 | ||||
| -rw-r--r-- | bgpd/bgp_zebra.h | 4 | ||||
| -rw-r--r-- | lib/zclient.c | 1 | ||||
| -rw-r--r-- | lib/zclient.h | 2 | 
5 files changed, 17 insertions, 12 deletions
| diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 68d05484..3e5e9c2f 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -1491,7 +1491,7 @@ bgp_process_main (struct work_queue *wq, void *data)        if (! CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))          {            if (CHECK_FLAG (old_select->flags, BGP_INFO_IGP_CHANGED)) -            bgp_zebra_announce (p, old_select, bgp); +            bgp_zebra_announce (p, old_select, bgp, safi);            UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);            return WQ_SUCCESS; @@ -1514,20 +1514,20 @@ bgp_process_main (struct work_queue *wq, void *data)      }    /* FIB update. */ -  if (safi == SAFI_UNICAST && ! bgp->name && -      ! bgp_option_check (BGP_OPT_NO_FIB)) +  if ((safi == SAFI_UNICAST || safi == SAFI_MULTICAST) && (! bgp->name && +      ! bgp_option_check (BGP_OPT_NO_FIB)))      {        if (new_select   	  && new_select->type == ZEBRA_ROUTE_BGP   	  && new_select->sub_type == BGP_ROUTE_NORMAL) -	bgp_zebra_announce (p, new_select, bgp); +	bgp_zebra_announce (p, new_select, bgp, safi);        else  	{  	  /* Withdraw the route from the kernel. */  	  if (old_select   	      && old_select->type == ZEBRA_ROUTE_BGP  	      && old_select->sub_type == BGP_ROUTE_NORMAL) -	    bgp_zebra_withdraw (p, old_select); +	    bgp_zebra_withdraw (p, old_select, safi);  	}      } @@ -1810,7 +1810,7 @@ bgp_update_rsclient (struct peer *rsclient, afi_t afi, safi_t safi,    bgp_attr_unintern (&attr_new2);    /* IPv4 unicast next hop check.  */ -  if (afi == AFI_IP && safi == SAFI_UNICAST) +  if ((afi == AFI_IP) && ((safi == SAFI_UNICAST) || safi == SAFI_MULTICAST))      {       /* Next hop must not be 0.0.0.0 nor Class D/E address. */        if (new_attr.nexthop.s_addr == 0 @@ -2934,7 +2934,7 @@ bgp_cleanup_routes (void)  	  if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)  	      && ri->type == ZEBRA_ROUTE_BGP   	      && ri->sub_type == BGP_ROUTE_NORMAL) -	    bgp_zebra_withdraw (&rn->p, ri); +	    bgp_zebra_withdraw (&rn->p, ri,SAFI_UNICAST);        table = bgp->rib[AFI_IP6][SAFI_UNICAST]; @@ -2943,7 +2943,7 @@ bgp_cleanup_routes (void)  	  if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)  	      && ri->type == ZEBRA_ROUTE_BGP   	      && ri->sub_type == BGP_ROUTE_NORMAL) -	    bgp_zebra_withdraw (&rn->p, ri); +	    bgp_zebra_withdraw (&rn->p, ri,SAFI_UNICAST);      }  } diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index 76c519cb..baf76fb0 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -643,7 +643,7 @@ bgp_nexthop_set (union sockunion *local, union sockunion *remote,  }  void -bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp) +bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp, safi_t safi)  {    int flags;    u_char distance; @@ -678,6 +678,7 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp)        api.type = ZEBRA_ROUTE_BGP;        api.message = 0; +      api.safi = safi;        SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);        api.nexthop_num = 1;        api.nexthop = &nexthop; @@ -778,7 +779,7 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp)  }  void -bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info) +bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info, safi_t safi)  {    int flags;    struct peer *peer; @@ -812,6 +813,7 @@ bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info)        api.type = ZEBRA_ROUTE_BGP;        api.message = 0; +      api.safi = safi;        SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);        api.nexthop_num = 1;        api.nexthop = &nexthop; diff --git a/bgpd/bgp_zebra.h b/bgpd/bgp_zebra.h index bd953864..1351333f 100644 --- a/bgpd/bgp_zebra.h +++ b/bgpd/bgp_zebra.h @@ -25,8 +25,8 @@ extern void bgp_zebra_init (void);  extern int bgp_if_update_all (void);  extern int bgp_config_write_redistribute (struct vty *, struct bgp *, afi_t, safi_t,  				   int *); -extern void bgp_zebra_announce (struct prefix *, struct bgp_info *, struct bgp *); -extern void bgp_zebra_withdraw (struct prefix *, struct bgp_info *); +extern void bgp_zebra_announce (struct prefix *, struct bgp_info *, struct bgp *, safi_t); +extern void bgp_zebra_withdraw (struct prefix *, struct bgp_info *, safi_t);  extern int bgp_redistribute_set (struct bgp *, afi_t, int);  extern int bgp_redistribute_rmap_set (struct bgp *, afi_t, int, const char *); diff --git a/lib/zclient.c b/lib/zclient.c index 12d113e7..0c3461e7 100644 --- a/lib/zclient.c +++ b/lib/zclient.c @@ -476,6 +476,7 @@ zapi_ipv4_route (u_char cmd, struct zclient *zclient, struct prefix_ipv4 *p,    stream_putc (s, api->type);    stream_putc (s, api->flags);    stream_putc (s, api->message); +  stream_putw (s, api->safi);    /* Put prefix information. */    psize = PSIZE (p->prefixlen); diff --git a/lib/zclient.h b/lib/zclient.h index 5c3db382..8b3e71af 100644 --- a/lib/zclient.h +++ b/lib/zclient.h @@ -108,6 +108,8 @@ struct zapi_ipv4    u_char message; +  safi_t safi; +    u_char nexthop_num;    struct in_addr **nexthop; | 
