#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
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;
printf("\n");
}
if (x->offset.LACPCOUNTERS) {
- uint8_t *mac;
+ struct eth_addr *mac;
union {
ovs_be32 all;
struct {
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);
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");
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));
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... */
}
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);
}
daemon_save_fd(STDOUT_FILENO);
- daemonize_start();
+ daemonize_start(false);
error = unixctl_server_create(NULL, &server);
if (error) {
unixctl_server_wait(server);
poll_block();
}
+ ofpbuf_uninit(&buf);
+ unixctl_server_destroy(server);
}
static void
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);