]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/zapi_msg.c
zebra: optimize zserv_process_messages
[mirror_frr.git] / zebra / zapi_msg.c
index 2c19f31c763f7aad2fb6a9683cdd030e0e30ac7e..f1d75f50b2d3f74329b77866cae48149797cf9ee 100644 (file)
@@ -3017,14 +3017,27 @@ void (*zserv_handlers[])(ZAPI_HANDLER_ARGS) = {
        [ZEBRA_IPTABLE_DELETE] = zread_iptable,
 };
 
-void zserv_handle_commands(struct zserv *client, struct zmsghdr *hdr,
-                          struct stream *msg, struct zebra_vrf *zvrf)
+void zserv_handle_commands(struct zserv *client, struct stream *msg)
 {
-       if (hdr->command > array_size(zserv_handlers)
-           || zserv_handlers[hdr->command] == NULL)
-               zlog_info("Zebra received unknown command %d", hdr->command);
-       else
-               zserv_handlers[hdr->command](client, hdr, msg, zvrf);
+       struct zmsghdr hdr;
+       struct zebra_vrf *zvrf;
+
+       zapi_parse_header(msg, &hdr);
 
-       stream_free(msg);
+       hdr.length -= ZEBRA_HEADER_SIZE;
+
+       /* lookup vrf */
+       zvrf = zebra_vrf_lookup_by_id(hdr.vrf_id);
+       if (!zvrf) {
+               if (IS_ZEBRA_DEBUG_PACKET && IS_ZEBRA_DEBUG_RECV)
+                       zlog_warn("ZAPI message specifies unknown VRF: %d",
+                                 hdr.vrf_id);
+               return;
+       }
+
+       if (hdr.command > array_size(zserv_handlers)
+           || zserv_handlers[hdr.command] == NULL)
+               zlog_info("Zebra received unknown command %d", hdr.command);
+       else
+               zserv_handlers[hdr.command](client, &hdr, msg, zvrf);
 }