ovsdb-server: Refactoring and clean up remote status reporting.
[cascardo/ovs.git] / tests / test-sflow.c
index 3e3c450..8f9ccf4 100644 (file)
@@ -63,6 +63,7 @@ static unixctl_cb_func test_sflow_exit;
 #define SFLOW_TAG_PKT_TUNNEL4_IN 1024
 #define SFLOW_TAG_PKT_TUNNEL_VNI_OUT 1029
 #define SFLOW_TAG_PKT_TUNNEL_VNI_IN 1030
+#define SFLOW_TAG_PKT_MPLS 1006
 
 /* string sizes */
 #define SFL_MAX_PORTNAME_LEN 255
@@ -113,6 +114,7 @@ struct sflow_xdr {
        uint32_t TUNNEL4_IN;
        uint32_t TUNNEL_VNI_OUT;
        uint32_t TUNNEL_VNI_IN;
+       uint32_t MPLS;
         uint32_t IFCOUNTERS;
        uint32_t LACPCOUNTERS;
        uint32_t OPENFLOWPORT;
@@ -239,7 +241,7 @@ process_counter_sample(struct sflow_xdr *x)
         printf("\n");
     }
     if (x->offset.LACPCOUNTERS) {
-       uint8_t *mac;
+       struct eth_addr *mac;
        union {
            ovs_be32 all;
            struct {
@@ -252,11 +254,11 @@ process_counter_sample(struct sflow_xdr *x)
 
         sflowxdr_setc(x, x->offset.LACPCOUNTERS);
         printf("LACPCOUNTERS");
-       mac = (uint8_t *)sflowxdr_str(x);
-       printf(" sysID="ETH_ADDR_FMT, ETH_ADDR_ARGS(mac));
+       mac = (void *)sflowxdr_str(x);
+       printf(" sysID="ETH_ADDR_FMT, ETH_ADDR_ARGS(*mac));
        sflowxdr_skip(x, 2);
-       mac = (uint8_t *)sflowxdr_str(x);
-       printf(" partnerID="ETH_ADDR_FMT, ETH_ADDR_ARGS(mac));
+       mac = (void *)sflowxdr_str(x);
+       printf(" partnerID="ETH_ADDR_FMT, ETH_ADDR_ARGS(*mac));
        sflowxdr_skip(x, 2);
        printf(" aggID=%"PRIu32, sflowxdr_next(x));
        state.all = sflowxdr_next_n(x);
@@ -264,12 +266,12 @@ process_counter_sample(struct sflow_xdr *x)
        printf(" actorOper=0x%"PRIx32, state.v.actorOper);
        printf(" partnerAdmin=0x%"PRIx32, state.v.partnerAdmin);
        printf(" partnerOper=0x%"PRIx32, state.v.partnerOper);
-       printf(" LACPUDsRx=%"PRIu32, sflowxdr_next(x));
+       printf(" LACPDUsRx=%"PRIu32, sflowxdr_next(x));
        printf(" markerPDUsRx=%"PRIu32, sflowxdr_next(x));
        printf(" markerRespPDUsRx=%"PRIu32, sflowxdr_next(x));
        printf(" unknownRx=%"PRIu32, sflowxdr_next(x));
        printf(" illegalRx=%"PRIu32, sflowxdr_next(x));
-       printf(" LACPUDsTx=%"PRIu32, sflowxdr_next(x));
+       printf(" LACPDUsTx=%"PRIu32, sflowxdr_next(x));
        printf(" markerPDUsTx=%"PRIu32, sflowxdr_next(x));
        printf(" markerRespPDUsTx=%"PRIu32, sflowxdr_next(x));
         printf("\n");
@@ -379,6 +381,32 @@ process_flow_sample(struct sflow_xdr *x)
            printf( " tunnel_out_vni=%"PRIu32, sflowxdr_next(x));
         }
 
+        if (x->offset.MPLS) {
+            uint32_t addr_type, stack_depth, ii;
+            ovs_be32 mpls_lse;
+            sflowxdr_setc(x, x->offset.MPLS);
+            /* OVS only sets the out_stack. The rest will be blank. */
+            /* skip next hop address */
+            addr_type = sflowxdr_next(x);
+            sflowxdr_skip(x, addr_type == SFLOW_ADDRTYPE_IP6 ? 4 : 1);
+            /* skip in_stack */
+            stack_depth = sflowxdr_next(x);
+            sflowxdr_skip(x, stack_depth);
+            /* print out_stack */
+            stack_depth = sflowxdr_next(x);
+            for(ii = 0; ii < stack_depth; ii++) {
+                mpls_lse=sflowxdr_next_n(x);
+                printf(" mpls_label_%"PRIu32"=%"PRIu32,
+                       ii, mpls_lse_to_label(mpls_lse));
+                printf(" mpls_tc_%"PRIu32"=%"PRIu32,
+                       ii, mpls_lse_to_tc(mpls_lse));
+                printf(" mpls_ttl_%"PRIu32"=%"PRIu32,
+                       ii, mpls_lse_to_ttl(mpls_lse));
+                printf(" mpls_bos_%"PRIu32"=%"PRIu32,
+                       ii, mpls_lse_to_bos(mpls_lse));
+            }
+        }
+
         if (x->offset.SWITCH) {
             sflowxdr_setc(x, x->offset.SWITCH);
             printf(" in_vlan=%"PRIu32, sflowxdr_next(x));
@@ -578,6 +606,10 @@ process_datagram(struct sflow_xdr *x)
                     sflowxdr_mark_unique(x, &x->offset.TUNNEL_VNI_IN);
                     break;
 
+               case SFLOW_TAG_PKT_MPLS:
+                    sflowxdr_mark_unique(x, &x->offset.MPLS);
+                    break;
+
                     /* Add others here... */
                 }
 
@@ -634,7 +666,7 @@ test_sflow_main(int argc, char *argv[])
     int error;
     int sock;
 
-    proctitle_init(argc, argv);
+    ovs_cmdl_proctitle_init(argc, argv);
     set_program_name(argv[0]);
     service_start(&argc, &argv);
     parse_options(argc, argv);
@@ -651,7 +683,7 @@ test_sflow_main(int argc, char *argv[])
     }
 
     daemon_save_fd(STDOUT_FILENO);
-    daemonize_start();
+    daemonize_start(false);
 
     error = unixctl_server_create(NULL, &server);
     if (error) {
@@ -685,6 +717,8 @@ test_sflow_main(int argc, char *argv[])
         unixctl_server_wait(server);
         poll_block();
     }
+    ofpbuf_uninit(&buf);
+    unixctl_server_destroy(server);
 }
 
 static void
@@ -701,7 +735,7 @@ parse_options(int argc, char *argv[])
         VLOG_LONG_OPTIONS,
         {NULL, 0, NULL, 0},
     };
-    char *short_options = long_options_to_short_options(long_options);
+    char *short_options = ovs_cmdl_long_options_to_short_options(long_options);
 
     for (;;) {
         int c = getopt_long(argc, argv, short_options, long_options, NULL);