]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/zebra_ptm_redistribute.c
isisd: implement the 'lsp-too-large' notification
[mirror_frr.git] / zebra / zebra_ptm_redistribute.c
index d6902142a334cb67289afec498e8904cffd377ff..420105198b89634a4913fc7c145e15b525aeb727 100644 (file)
 #include "vty.h"
 #include "stream.h"
 #include "zebra/zserv.h"
+#include "zebra/zapi_msg.h"
+#include "zebra/zebra_ptm.h"
 #include "zebra/zebra_ptm_redistribute.h"
 #include "zebra/zebra_memory.h"
 
-static int
-zsend_interface_bfd_update (int cmd, struct zserv *client,
-                            struct interface *ifp, struct prefix *dp,
-                            struct prefix *sp, int status, vrf_id_t vrf_id)
+static int zsend_interface_bfd_update(int cmd, struct zserv *client,
+                                     struct interface *ifp, struct prefix *dp,
+                                     struct prefix *sp, int status,
+                                     vrf_id_t vrf_id)
 {
-  int blen;
-  struct stream *s;
-
-  /* Check this client need interface information. */
-  if (! client->ifinfo)
-    return 0;
-
-  s = client->obuf;
-  stream_reset (s);
-
-  zserv_create_header (s, cmd, vrf_id);
-  if (ifp)
-    stream_putl (s, ifp->ifindex);
-  else
-    stream_putl (s, 0);
-
-  /* BFD destination prefix information. */
-  stream_putc (s, dp->family);
-  blen = prefix_blen (dp);
-  stream_put (s, &dp->u.prefix, blen);
-  stream_putc (s, dp->prefixlen);
-
-  /* BFD status */
-  stream_putl(s, status);
-
-  /* BFD source prefix information. */
-  stream_putc (s, sp->family);
-  blen = prefix_blen (sp);
-  stream_put (s, &sp->u.prefix, blen);
-  stream_putc (s, sp->prefixlen);
-
-  /* Write packet size. */
-  stream_putw_at (s, 0, stream_get_endp (s));
-
-  client->if_bfd_cnt++;
-  return zebra_server_send_message(client);
+       int blen;
+       struct stream *s;
+
+       /* Check this client need interface information. */
+       if (!client->ifinfo)
+               return 0;
+
+       s = stream_new(ZEBRA_MAX_PACKET_SIZ);
+
+       zclient_create_header(s, cmd, vrf_id);
+       if (ifp)
+               stream_putl(s, ifp->ifindex);
+       else
+               stream_putl(s, 0);
+
+       /* BFD destination prefix information. */
+       stream_putc(s, dp->family);
+       blen = prefix_blen(dp);
+       stream_put(s, &dp->u.prefix, blen);
+       stream_putc(s, dp->prefixlen);
+
+       /* BFD status */
+       stream_putl(s, status);
+
+       /* BFD source prefix information. */
+       stream_putc(s, sp->family);
+       blen = prefix_blen(sp);
+       stream_put(s, &sp->u.prefix, blen);
+       stream_putc(s, sp->prefixlen);
+
+       /* Write packet size. */
+       stream_putw_at(s, 0, stream_get_endp(s));
+
+       client->if_bfd_cnt++;
+       return zserv_send_message(client, s);
 }
 
-void
-zebra_interface_bfd_update (struct interface *ifp, struct prefix *dp,
-                            struct prefix *sp, int status, vrf_id_t vrf_id)
+void zebra_interface_bfd_update(struct interface *ifp, struct prefix *dp,
+                               struct prefix *sp, int status, vrf_id_t vrf_id)
 {
-  struct listnode *node, *nnode;
-  struct zserv *client;
-
-  for (ALL_LIST_ELEMENTS (zebrad.client_list, node, nnode, client))
-    {
-      /* Supporting for OSPF, BGP and PIM */
-      if (client->proto != ZEBRA_ROUTE_OSPF && client->proto != ZEBRA_ROUTE_BGP
-          && client->proto != ZEBRA_ROUTE_OSPF6 && client->proto != ZEBRA_ROUTE_PIM)
-        continue;
-
-      /* Notify to the protocol daemons. */
-      zsend_interface_bfd_update (ZEBRA_INTERFACE_BFD_DEST_UPDATE, client, ifp,
-                                    dp, sp, status, vrf_id);
-    }
+       struct listnode *node, *nnode;
+       struct zserv *client;
+
+       for (ALL_LIST_ELEMENTS(zebrad.client_list, node, nnode, client)) {
+               if (!IS_BFD_ENABLED_PROTOCOL(client->proto))
+                       continue;
+
+               /* Notify to the protocol daemons. */
+               zsend_interface_bfd_update(ZEBRA_INTERFACE_BFD_DEST_UPDATE,
+                                          client, ifp, dp, sp, status, vrf_id);
+       }
 }
 
-static int
-zsend_bfd_peer_replay (int cmd, struct zserv *client)
+static int zsend_bfd_peer_replay(int cmd, struct zserv *client)
 {
-  struct stream *s;
+       struct stream *s;
 
-  s = client->obuf;
-  stream_reset (s);
+       s = stream_new(ZEBRA_MAX_PACKET_SIZ);
 
-  zserv_create_header (s, cmd, VRF_DEFAULT); //Pending: adjust when multi-vrf bfd work
+       zclient_create_header(s, cmd, VRF_DEFAULT);
 
-  /* Write packet size. */
-  stream_putw_at (s, 0, stream_get_endp (s));
+       /* Write packet size. */
+       stream_putw_at(s, 0, stream_get_endp(s));
 
-  client->bfd_peer_replay_cnt++;
-  return zebra_server_send_message(client);
+       client->bfd_peer_replay_cnt++;
+       return zserv_send_message(client, s);
 }
 
-void
-zebra_bfd_peer_replay_req (void)
+void zebra_bfd_peer_replay_req(void)
 {
-  struct listnode *node, *nnode;
-  struct zserv *client;
-
-  for (ALL_LIST_ELEMENTS (zebrad.client_list, node, nnode, client))
-    {
-      /* Supporting for BGP */
-      if ((client->proto != ZEBRA_ROUTE_BGP) &&
-          (client->proto != ZEBRA_ROUTE_OSPF) &&
-          (client->proto != ZEBRA_ROUTE_OSPF6) &&
-          (client->proto != ZEBRA_ROUTE_PIM))
-        continue;
-
-      /* Notify to the protocol daemons. */
-      zsend_bfd_peer_replay (ZEBRA_BFD_DEST_REPLAY, client);
-    }
+       struct listnode *node, *nnode;
+       struct zserv *client;
+
+       for (ALL_LIST_ELEMENTS(zebrad.client_list, node, nnode, client)) {
+               if (!IS_BFD_ENABLED_PROTOCOL(client->proto))
+                       continue;
+
+               /* Notify to the protocol daemons. */
+               zsend_bfd_peer_replay(ZEBRA_BFD_DEST_REPLAY, client);
+       }
 }