Skip to content

Commit

Permalink
Tilfa Adj sid printed in more comprehendable way
Browse files Browse the repository at this point in the history
  • Loading branch information
sachinites committed Jan 23, 2020
1 parent ab47ea7 commit 2881970
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 26 deletions.
2 changes: 2 additions & 0 deletions instanceconst.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ typedef char FLAG;
typedef char BYTE;
typedef unsigned int mpls_label_t;

#define NO_TAG 0xFFFFFFFF

/*Edge properties*/
typedef enum{
UNIDIRECTIONAL,
Expand Down
5 changes: 4 additions & 1 deletion spring_adjsid.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,5 +247,8 @@ get_adj_sid_minimum(node_t *node1, node_t *node2, LEVEL level){
metric = edge->metric[level];
}
}
return p2p_intf_adj_sid ? p2p_intf_adj_sid->sid.sid : 0;
return p2p_intf_adj_sid ?
(p2p_intf_adj_sid->sid.sid != 0 &&
p2p_intf_adj_sid->sid.sid != NO_TAG) ? \
p2p_intf_adj_sid->sid.sid : NO_TAG : NO_TAG;
}
65 changes: 42 additions & 23 deletions tilfa.c
Original file line number Diff line number Diff line change
Expand Up @@ -1112,25 +1112,24 @@ TILFA_GENSEGLST_FILL_OIF_GATEWAY_FROM_NXTHOP(
gen_segment_list->gw_ip[PREFIX_LEN] = '\0';
gen_segment_list->nxthop = nxthop_ptr->node;
if(nxthop_ptr->nh_type == LSPNH){
gen_segment_list->inet3_mpls_label_out[*stack_top].seg_type = TILFA_ADJ_SID;
gen_segment_list->inet3_mpls_label_out[*stack_top].u.adj_sid =
nxthop_ptr->mpls_label_out[0];

TILFA_SET_INET3_ACTUAL_ADJ_SID(gen_segment_list,
*stack_top, nxthop_ptr->mpls_label_out[0]);
gen_segment_list->inet3_stack_op[*stack_top] = PUSH;
gen_segment_list->mpls0_mpls_label_out[*stack_top].seg_type = TILFA_ADJ_SID;
gen_segment_list->mpls0_mpls_label_out[*stack_top].u.adj_sid =
nxthop_ptr->mpls_label_out[0];

TILFA_SET_MPLS0_ACTUAL_ADJ_SID(gen_segment_list,
*stack_top, nxthop_ptr->mpls_label_out[0]);
if(nxthop_ptr->node == dest)
gen_segment_list->mpls0_stack_op[*stack_top] = SWAP;
else
gen_segment_list->mpls0_stack_op[*stack_top] = PUSH;

(*stack_top)++;
gen_segment_list->is_fhs_rsvp_lsp = TRUE;
}
return TRUE;
}



static boolean
tilfa_attempt_connect_p_q_by_prefix_sid(node_t *spf_root,
node_t *p_node,
Expand Down Expand Up @@ -1234,13 +1233,17 @@ tilfa_compute_segment_list_connecting_p_q_nodes
if(q_node == p_node){

/*Push the Adj segment p_node --> p_node_next*/
gensegment_list->inet3_mpls_label_out[stack_top].seg_type = TILFA_ADJ_SID;
adj_sid = get_adj_sid_minimum(p_node,
GET_PRED_INFO_NODE_FROM_GLTHREAD(p_node_thread_temp->right), level);
gensegment_list->inet3_mpls_label_out[stack_top].u.adj_sid = adj_sid;
tilfa_set_adj_sid(gensegment_list, stack_top,
TRUE, FALSE, p_node,
GET_PRED_INFO_NODE_FROM_GLTHREAD(p_node_thread_temp->right),
level, NO_TAG);
gensegment_list->inet3_stack_op[stack_top] = PUSH;
gensegment_list->mpls0_mpls_label_out[stack_top].seg_type = TILFA_ADJ_SID;
gensegment_list->mpls0_mpls_label_out[stack_top].u.adj_sid = adj_sid;

tilfa_set_adj_sid(gensegment_list, stack_top,
FALSE, TRUE, p_node,
GET_PRED_INFO_NODE_FROM_GLTHREAD(p_node_thread_temp->right),
level, NO_TAG);

gensegment_list->mpls0_stack_op[stack_top] = PUSH;
stack_top++;
p_node_thread_temp = p_node_thread_temp->right;
Expand Down Expand Up @@ -2075,9 +2078,17 @@ tilfa_print_one_liner_segment_list(
}
break;
case TILFA_ADJ_SID:
if(TILFA_SEGLIST_IS_INET3_ADJ_SID_SET(gen_segment_list, i)){
rc += snprintf(buffer + rc, 1024, "%u(%s) ",
gen_segment_list->inet3_mpls_label_out[i].u.adj_sid,
gen_segment_list->inet3_mpls_label_out[i].u.adj_sid.adj_sid,
get_str_stackops(gen_segment_list->inet3_stack_op[i]));
}
else{
rc += snprintf(buffer + rc, 1024, "[%s-->%s](%s) ",
gen_segment_list->inet3_mpls_label_out[i].u.adj_sid.from_node->node_name,
gen_segment_list->inet3_mpls_label_out[i].u.adj_sid.to_node->node_name,
get_str_stackops(gen_segment_list->inet3_stack_op[i]));
}
break;
default:
;
Expand Down Expand Up @@ -2113,9 +2124,17 @@ tilfa_print_one_liner_segment_list(
}
break;
case TILFA_ADJ_SID:
rc += snprintf(buffer + rc, 1024, "%u(%s) ",
gen_segment_list->mpls0_mpls_label_out[i].u.adj_sid,
if(TILFA_SEGLIST_IS_MPLS0_ADJ_SID_SET(gen_segment_list, i)){
rc += snprintf(buffer + rc, 1024, "%u(%s) ",
gen_segment_list->mpls0_mpls_label_out[i].u.adj_sid.adj_sid,
get_str_stackops(gen_segment_list->mpls0_stack_op[i]));
}
else{
rc += snprintf(buffer + rc, 1024, "[%s-->%s](%s) ",
gen_segment_list->mpls0_mpls_label_out[i].u.adj_sid.from_node->node_name,
gen_segment_list->mpls0_mpls_label_out[i].u.adj_sid.to_node->node_name,
get_str_stackops(gen_segment_list->mpls0_stack_op[i]));
}
break;
default:
;
Expand Down Expand Up @@ -2200,8 +2219,8 @@ tilfa_fill_nxthop_from_segment_lst(routes_t *route,
for(; i >= 0; i--){
if(gensegment_lst->inet3_stack_op[i] == STACK_OPS_UNKNOWN)
continue;
if(gensegment_lst->inet3_mpls_label_out[i].seg_type == TILFA_ADJ_SID){
nxthop->mpls_label_out[j] = gensegment_lst->inet3_mpls_label_out[i].u.adj_sid;
if(TILFA_SEGLIST_IS_INET3_ADJ_SID_SET(gensegment_lst, i)){
nxthop->mpls_label_out[j] = TILFA_GET_INET3_ADJ_SID(gensegment_lst, i);
}
else if(gensegment_lst->inet3_mpls_label_out[i].seg_type == TILFA_PREFIX_SID_REFERENCE){

Expand All @@ -2212,7 +2231,7 @@ tilfa_fill_nxthop_from_segment_lst(routes_t *route,
gensegment_lst->inet3_mpls_label_out[i].u.node->srgb,
(prefix_t *)ROUTE_GET_BEST_PREFIX(route));
}
if(nxthop->mpls_label_out[j] == 0)
if(nxthop->mpls_label_out[j] == NO_TAG)
return FALSE;
nxthop->stack_op[j] = gensegment_lst->inet3_stack_op[i];
j++;
Expand All @@ -2222,8 +2241,8 @@ tilfa_fill_nxthop_from_segment_lst(routes_t *route,
for(; i >= 0; i--){
if(gensegment_lst->mpls0_stack_op[i] == STACK_OPS_UNKNOWN)
continue;
if(gensegment_lst->mpls0_mpls_label_out[i].seg_type == TILFA_ADJ_SID){
nxthop->mpls_label_out[j] = gensegment_lst->mpls0_mpls_label_out[i].u.adj_sid;
if(TILFA_SEGLIST_IS_MPLS0_ADJ_SID_SET(gensegment_lst, i)){
nxthop->mpls_label_out[j] = TILFA_GET_MPLS0_ADJ_SID(gensegment_lst, i);
}
else if(gensegment_lst->mpls0_mpls_label_out[i].seg_type == TILFA_PREFIX_SID_REFERENCE){

Expand All @@ -2234,7 +2253,7 @@ tilfa_fill_nxthop_from_segment_lst(routes_t *route,
gensegment_lst->mpls0_mpls_label_out[i].u.node->srgb,
(prefix_t *)ROUTE_GET_BEST_PREFIX(route));
}
if(nxthop->mpls_label_out[j] == 0)
if(nxthop->mpls_label_out[j] == NO_TAG)
return FALSE;
nxthop->stack_op[j] = gensegment_lst->mpls0_stack_op[i];
j++;
Expand Down
70 changes: 68 additions & 2 deletions tilfa.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,11 @@
#ifndef __TILFA__
#define __TILFA__

#include <stdint.h>
#include "instance.h"
#include "data_plane.h"
#include <stdint.h>
#include "complete_spf_path.h"
#include "spring_adjsid.h"

typedef struct edge_end_ interface_t;

Expand All @@ -53,7 +54,11 @@ typedef struct gen_segment_list_{
tilfa_seg_type seg_type;
union gen_segment_list_u_{
node_t *node;
mpls_label_t adj_sid;
struct {
mpls_label_t adj_sid;
node_t *from_node;
node_t *to_node;
}adj_sid;
}u;
};
struct s_t inet3_mpls_label_out[MPLS_STACK_OP_LIMIT_MAX];
Expand All @@ -64,6 +69,67 @@ typedef struct gen_segment_list_{
boolean is_fhs_rsvp_lsp;
} gen_segment_list_t;

static void
tilfa_set_adj_sid(gen_segment_list_t *gen_segment_list,
int stack_index,
boolean inet3,
boolean mpls0,
node_t *from_node,
node_t *to_node,
LEVEL level,
mpls_label_t adj_sid){

assert((inet3 && !mpls0) ||
(!inet3 && mpls0));

assert(((from_node && to_node) && (adj_sid == NO_TAG))||
((!from_node && !to_node) && (adj_sid != NO_TAG)));

if(inet3){
gen_segment_list->inet3_mpls_label_out[stack_index].seg_type
= TILFA_ADJ_SID;
gen_segment_list->inet3_mpls_label_out[stack_index].u.adj_sid.from_node = from_node;
gen_segment_list->inet3_mpls_label_out[stack_index].u.adj_sid.to_node = to_node;
gen_segment_list->inet3_mpls_label_out[stack_index].u.adj_sid.adj_sid =
(adj_sid == NO_TAG && from_node && to_node) ?
get_adj_sid_minimum(from_node, to_node, level):
adj_sid;
}
else if(mpls0){
gen_segment_list->mpls0_mpls_label_out[stack_index].seg_type
= TILFA_ADJ_SID;
gen_segment_list->mpls0_mpls_label_out[stack_index].u.adj_sid.from_node = from_node;
gen_segment_list->mpls0_mpls_label_out[stack_index].u.adj_sid.to_node = to_node;
gen_segment_list->mpls0_mpls_label_out[stack_index].u.adj_sid.adj_sid =
(adj_sid == NO_TAG && from_node && to_node) ?
get_adj_sid_minimum(from_node, to_node, level):
adj_sid;
}
}

#define TILFA_SET_INET3_ACTUAL_ADJ_SID(gen_segment_list_ptr, \
stack_index, adj_sid)\
(tilfa_set_adj_sid(gen_segment_list_ptr, stack_index,\
TRUE, FALSE, 0, 0, LEVEL_UNKNOWN, adj_sid))

#define TILFA_SET_MPLS0_ACTUAL_ADJ_SID(gen_segment_list_ptr, \
stack_index, adj_sid)\
(tilfa_set_adj_sid(gen_segment_list_ptr, stack_index,\
FALSE, TRUE, 0, 0, LEVEL_UNKNOWN, adj_sid))

#define TILFA_SEGLIST_IS_INET3_ADJ_SID_SET(gen_segment_list_ptr, stack_index) \
(gen_segment_list_ptr->inet3_mpls_label_out[stack_index].seg_type == TILFA_ADJ_SID && \
gen_segment_list_ptr->inet3_mpls_label_out[stack_index].u.adj_sid.adj_sid != NO_TAG)

#define TILFA_SEGLIST_IS_MPLS0_ADJ_SID_SET(gen_segment_list_ptr, stack_index) \
(gen_segment_list_ptr->mpls0_mpls_label_out[stack_index].seg_type == TILFA_ADJ_SID && \
gen_segment_list_ptr->mpls0_mpls_label_out[stack_index].u.adj_sid.adj_sid != NO_TAG)

#define TILFA_GET_INET3_ADJ_SID(gen_segment_list_ptr, stack_index) \
(gen_segment_list_ptr->inet3_mpls_label_out[stack_index].u.adj_sid.adj_sid)
#define TILFA_GET_MPLS0_ADJ_SID(gen_segment_list_ptr, stack_index) \
(gen_segment_list_ptr->mpls0_mpls_label_out[stack_index].u.adj_sid.adj_sid)

char *
tilfa_print_one_liner_segment_list(
gen_segment_list_t *gen_segment_list,
Expand Down

0 comments on commit 2881970

Please sign in to comment.