diff options
Diffstat (limited to 'lib/vrf.c')
| -rw-r--r-- | lib/vrf.c | 626 | 
1 files changed, 289 insertions, 337 deletions
@@ -30,19 +30,19 @@  #include "memory.h"  #include "command.h" -DEFINE_MTYPE_STATIC(LIB, VRF,        "VRF") +DEFINE_MTYPE_STATIC(LIB, VRF, "VRF")  DEFINE_MTYPE_STATIC(LIB, VRF_BITMAP, "VRF bit-map")  DEFINE_QOBJ_TYPE(vrf) -static __inline int vrf_id_compare (const struct vrf *, const struct vrf *); -static __inline int vrf_name_compare (const struct vrf *, const struct vrf *); +static __inline int vrf_id_compare(const struct vrf *, const struct vrf *); +static __inline int vrf_name_compare(const struct vrf *, const struct vrf *); -RB_GENERATE (vrf_id_head, vrf, id_entry, vrf_id_compare); -RB_GENERATE (vrf_name_head, vrf, name_entry, vrf_name_compare); +RB_GENERATE(vrf_id_head, vrf, id_entry, vrf_id_compare); +RB_GENERATE(vrf_name_head, vrf, name_entry, vrf_name_compare); -struct vrf_id_head vrfs_by_id = RB_INITIALIZER (&vrfs_by_id); -struct vrf_name_head vrfs_by_name = RB_INITIALIZER (&vrfs_by_name); +struct vrf_id_head vrfs_by_id = RB_INITIALIZER(&vrfs_by_id); +struct vrf_name_head vrfs_by_name = RB_INITIALIZER(&vrfs_by_name);  /*   * Turn on/off debug code @@ -51,36 +51,34 @@ struct vrf_name_head vrfs_by_name = RB_INITIALIZER (&vrfs_by_name);  int debug_vrf = 0;  /* Holding VRF hooks  */ -struct vrf_master -{ -  int (*vrf_new_hook) (struct vrf *); -  int (*vrf_delete_hook) (struct vrf *); -  int (*vrf_enable_hook) (struct vrf *); -  int (*vrf_disable_hook) (struct vrf *); -} vrf_master = {0,}; +struct vrf_master { +	int (*vrf_new_hook)(struct vrf *); +	int (*vrf_delete_hook)(struct vrf *); +	int (*vrf_enable_hook)(struct vrf *); +	int (*vrf_disable_hook)(struct vrf *); +} vrf_master = { +	0, +}; -static int vrf_is_enabled (struct vrf *vrf); -static void vrf_disable (struct vrf *vrf); +static int vrf_is_enabled(struct vrf *vrf); +static void vrf_disable(struct vrf *vrf);  /* VRF list existance check by name. */ -struct vrf * -vrf_lookup_by_name (const char *name) +struct vrf *vrf_lookup_by_name(const char *name)  { -  struct vrf vrf; -  strlcpy (vrf.name, name, sizeof (vrf.name)); -  return (RB_FIND (vrf_name_head, &vrfs_by_name, &vrf)); +	struct vrf vrf; +	strlcpy(vrf.name, name, sizeof(vrf.name)); +	return (RB_FIND(vrf_name_head, &vrfs_by_name, &vrf));  } -static __inline int -vrf_id_compare (const struct vrf *a, const struct vrf *b) +static __inline int vrf_id_compare(const struct vrf *a, const struct vrf *b)  { -  return (a->vrf_id - b->vrf_id); +	return (a->vrf_id - b->vrf_id);  } -static int -vrf_name_compare (const struct vrf *a, const struct vrf *b) +static int vrf_name_compare(const struct vrf *a, const struct vrf *b)  { -  return strcmp (a->name, b->name); +	return strcmp(a->name, b->name);  }  /* Get a VRF. If not found, create one. @@ -90,104 +88,95 @@ vrf_name_compare (const struct vrf *a, const struct vrf *b)   * Description: Please note that this routine can be called with just the name   * and 0 vrf-id   */ -struct vrf * -vrf_get (vrf_id_t vrf_id, const char *name) -{ -  struct vrf *vrf = NULL; -  int new = 0; - -  if (debug_vrf) -    zlog_debug ("VRF_GET: %s(%d)", name, vrf_id); - -  /* Nothing to see, move along here */ -  if (!name && vrf_id == VRF_UNKNOWN) -    return NULL; - -  /* Try to find VRF both by ID and name */ -  if (vrf_id != VRF_UNKNOWN) -    vrf = vrf_lookup_by_id (vrf_id); -  if (! vrf && name) -    vrf = vrf_lookup_by_name (name); - -  if (vrf == NULL) -    { -      vrf = XCALLOC (MTYPE_VRF, sizeof (struct vrf)); -      vrf->vrf_id = VRF_UNKNOWN; -      if_init (&vrf->iflist); -      QOBJ_REG (vrf, vrf); -      new = 1; - -      if (debug_vrf) -	zlog_debug ("VRF(%u) %s is created.", -		    vrf_id, (name) ? name : "(NULL)"); -    } - -  /* Set identifier */ -  if (vrf_id != VRF_UNKNOWN && vrf->vrf_id == VRF_UNKNOWN) -    { -      vrf->vrf_id = vrf_id; -      RB_INSERT (vrf_id_head, &vrfs_by_id, vrf); -    } - -  /* Set name */ -  if (name && vrf->name[0] != '\0' && strcmp (name, vrf->name)) -    { -      RB_REMOVE (vrf_name_head, &vrfs_by_name, vrf); -      strlcpy (vrf->name, name, sizeof (vrf->name)); -      RB_INSERT (vrf_name_head, &vrfs_by_name, vrf); -    } -  else if (name && vrf->name[0] == '\0') -    { -      strlcpy (vrf->name, name, sizeof (vrf->name)); -      RB_INSERT (vrf_name_head, &vrfs_by_name, vrf); -    } - -  if (new && vrf_master.vrf_new_hook) -    (*vrf_master.vrf_new_hook) (vrf); - -  return vrf; +struct vrf *vrf_get(vrf_id_t vrf_id, const char *name) +{ +	struct vrf *vrf = NULL; +	int new = 0; + +	if (debug_vrf) +		zlog_debug("VRF_GET: %s(%d)", name, vrf_id); + +	/* Nothing to see, move along here */ +	if (!name && vrf_id == VRF_UNKNOWN) +		return NULL; + +	/* Try to find VRF both by ID and name */ +	if (vrf_id != VRF_UNKNOWN) +		vrf = vrf_lookup_by_id(vrf_id); +	if (!vrf && name) +		vrf = vrf_lookup_by_name(name); + +	if (vrf == NULL) { +		vrf = XCALLOC(MTYPE_VRF, sizeof(struct vrf)); +		vrf->vrf_id = VRF_UNKNOWN; +		if_init(&vrf->iflist); +		QOBJ_REG(vrf, vrf); +		new = 1; + +		if (debug_vrf) +			zlog_debug("VRF(%u) %s is created.", vrf_id, +				   (name) ? name : "(NULL)"); +	} + +	/* Set identifier */ +	if (vrf_id != VRF_UNKNOWN && vrf->vrf_id == VRF_UNKNOWN) { +		vrf->vrf_id = vrf_id; +		RB_INSERT(vrf_id_head, &vrfs_by_id, vrf); +	} + +	/* Set name */ +	if (name && vrf->name[0] != '\0' && strcmp(name, vrf->name)) { +		RB_REMOVE(vrf_name_head, &vrfs_by_name, vrf); +		strlcpy(vrf->name, name, sizeof(vrf->name)); +		RB_INSERT(vrf_name_head, &vrfs_by_name, vrf); +	} else if (name && vrf->name[0] == '\0') { +		strlcpy(vrf->name, name, sizeof(vrf->name)); +		RB_INSERT(vrf_name_head, &vrfs_by_name, vrf); +	} + +	if (new &&vrf_master.vrf_new_hook) +		(*vrf_master.vrf_new_hook)(vrf); + +	return vrf;  }  /* Delete a VRF. This is called in vrf_terminate(). */ -void -vrf_delete (struct vrf *vrf) +void vrf_delete(struct vrf *vrf)  { -  if (debug_vrf) -    zlog_debug ("VRF %u is to be deleted.", vrf->vrf_id); +	if (debug_vrf) +		zlog_debug("VRF %u is to be deleted.", vrf->vrf_id); -  if (vrf_is_enabled (vrf)) -    vrf_disable (vrf); +	if (vrf_is_enabled(vrf)) +		vrf_disable(vrf); -  if (vrf_master.vrf_delete_hook) -    (*vrf_master.vrf_delete_hook) (vrf); +	if (vrf_master.vrf_delete_hook) +		(*vrf_master.vrf_delete_hook)(vrf); -  QOBJ_UNREG (vrf); -  if_terminate (&vrf->iflist); +	QOBJ_UNREG(vrf); +	if_terminate(&vrf->iflist); -  if (vrf->vrf_id != VRF_UNKNOWN) -    RB_REMOVE (vrf_id_head, &vrfs_by_id, vrf); -  if (vrf->name[0] != '\0') -    RB_REMOVE (vrf_name_head, &vrfs_by_name, vrf); +	if (vrf->vrf_id != VRF_UNKNOWN) +		RB_REMOVE(vrf_id_head, &vrfs_by_id, vrf); +	if (vrf->name[0] != '\0') +		RB_REMOVE(vrf_name_head, &vrfs_by_name, vrf); -  XFREE (MTYPE_VRF, vrf); +	XFREE(MTYPE_VRF, vrf);  }  /* Look up a VRF by identifier. */ -struct vrf * -vrf_lookup_by_id (vrf_id_t vrf_id) +struct vrf *vrf_lookup_by_id(vrf_id_t vrf_id)  { -  struct vrf vrf; -  vrf.vrf_id = vrf_id; -  return (RB_FIND (vrf_id_head, &vrfs_by_id, &vrf)); +	struct vrf vrf; +	vrf.vrf_id = vrf_id; +	return (RB_FIND(vrf_id_head, &vrfs_by_id, &vrf));  }  /*   * Check whether the VRF is enabled.   */ -static int -vrf_is_enabled (struct vrf *vrf) +static int vrf_is_enabled(struct vrf *vrf)  { -  return vrf && CHECK_FLAG (vrf->status, VRF_ACTIVE); +	return vrf && CHECK_FLAG(vrf->status, VRF_ACTIVE);  }  /* @@ -197,21 +186,20 @@ vrf_is_enabled (struct vrf *vrf)   *   * RETURN: 1 - enabled successfully; otherwise, 0.   */ -int -vrf_enable (struct vrf *vrf) +int vrf_enable(struct vrf *vrf)  { -  if (vrf_is_enabled (vrf)) -    return 1; +	if (vrf_is_enabled(vrf)) +		return 1; -  if (debug_vrf) -    zlog_debug ("VRF %u is enabled.", vrf->vrf_id); +	if (debug_vrf) +		zlog_debug("VRF %u is enabled.", vrf->vrf_id); -  SET_FLAG (vrf->status, VRF_ACTIVE); +	SET_FLAG(vrf->status, VRF_ACTIVE); -  if (vrf_master.vrf_enable_hook) -    (*vrf_master.vrf_enable_hook) (vrf); +	if (vrf_master.vrf_enable_hook) +		(*vrf_master.vrf_enable_hook)(vrf); -  return 1; +	return 1;  }  /* @@ -219,67 +207,62 @@ vrf_enable (struct vrf *vrf)   * The VRF_DELETE_HOOK callback will be called to inform   * that they must release the resources in the VRF.   */ -static void -vrf_disable (struct vrf *vrf) +static void vrf_disable(struct vrf *vrf)  { -  if (! vrf_is_enabled (vrf)) -    return; +	if (!vrf_is_enabled(vrf)) +		return; -  UNSET_FLAG (vrf->status, VRF_ACTIVE); +	UNSET_FLAG(vrf->status, VRF_ACTIVE); -  if (debug_vrf) -    zlog_debug ("VRF %u is to be disabled.", vrf->vrf_id); +	if (debug_vrf) +		zlog_debug("VRF %u is to be disabled.", vrf->vrf_id); -  /* Till now, nothing to be done for the default VRF. */ -  //Pending: see why this statement. +	/* Till now, nothing to be done for the default VRF. */ +	// Pending: see why this statement. -  if (vrf_master.vrf_disable_hook) -    (*vrf_master.vrf_disable_hook) (vrf); +	if (vrf_master.vrf_disable_hook) +		(*vrf_master.vrf_disable_hook)(vrf);  } -vrf_id_t -vrf_name_to_id (const char *name) +vrf_id_t vrf_name_to_id(const char *name)  { -  struct vrf *vrf; -  vrf_id_t vrf_id = VRF_DEFAULT; //Pending: need a way to return invalid id/ routine not used. +	struct vrf *vrf; +	vrf_id_t vrf_id = VRF_DEFAULT; // Pending: need a way to return invalid +				       // id/ routine not used. -  vrf = vrf_lookup_by_name (name); -  if (vrf) -    vrf_id = vrf->vrf_id; +	vrf = vrf_lookup_by_name(name); +	if (vrf) +		vrf_id = vrf->vrf_id; -  return vrf_id; +	return vrf_id;  }  /* Get the data pointer of the specified VRF. If not found, create one. */ -void * -vrf_info_get (vrf_id_t vrf_id) +void *vrf_info_get(vrf_id_t vrf_id)  { -  struct vrf *vrf = vrf_get (vrf_id, NULL); -  return vrf->info; +	struct vrf *vrf = vrf_get(vrf_id, NULL); +	return vrf->info;  }  /* Look up the data pointer of the specified VRF. */ -void * -vrf_info_lookup (vrf_id_t vrf_id) +void *vrf_info_lookup(vrf_id_t vrf_id)  { -  struct vrf *vrf = vrf_lookup_by_id (vrf_id); -  return vrf ? vrf->info : NULL; +	struct vrf *vrf = vrf_lookup_by_id(vrf_id); +	return vrf ? vrf->info : NULL;  }  /* Look up the interface list in a VRF. */ -struct list * -vrf_iflist (vrf_id_t vrf_id) +struct list *vrf_iflist(vrf_id_t vrf_id)  { -   struct vrf * vrf = vrf_lookup_by_id (vrf_id); -   return vrf ? vrf->iflist : NULL; +	struct vrf *vrf = vrf_lookup_by_id(vrf_id); +	return vrf ? vrf->iflist : NULL;  }  /* Get the interface list of the specified VRF. Create one if not find. */ -struct list * -vrf_iflist_get (vrf_id_t vrf_id) +struct list *vrf_iflist_get(vrf_id_t vrf_id)  { -   struct vrf * vrf = vrf_get (vrf_id, NULL); -   return vrf->iflist; +	struct vrf *vrf = vrf_get(vrf_id, NULL); +	return vrf->iflist;  }  /* @@ -287,177 +270,161 @@ vrf_iflist_get (vrf_id_t vrf_id)   */  #define VRF_BITMAP_NUM_OF_GROUPS            8 -#define VRF_BITMAP_NUM_OF_BITS_IN_GROUP \ -    (UINT16_MAX / VRF_BITMAP_NUM_OF_GROUPS) -#define VRF_BITMAP_NUM_OF_BYTES_IN_GROUP \ -    (VRF_BITMAP_NUM_OF_BITS_IN_GROUP / CHAR_BIT + 1) /* +1 for ensure */ - -#define VRF_BITMAP_GROUP(_id) \ -    ((_id) / VRF_BITMAP_NUM_OF_BITS_IN_GROUP) -#define VRF_BITMAP_BIT_OFFSET(_id) \ -    ((_id) % VRF_BITMAP_NUM_OF_BITS_IN_GROUP) - -#define VRF_BITMAP_INDEX_IN_GROUP(_bit_offset) \ -    ((_bit_offset) / CHAR_BIT) -#define VRF_BITMAP_FLAG(_bit_offset) \ -    (((u_char)1) << ((_bit_offset) % CHAR_BIT)) - -struct vrf_bitmap -{ -  u_char *groups[VRF_BITMAP_NUM_OF_GROUPS]; +#define VRF_BITMAP_NUM_OF_BITS_IN_GROUP (UINT16_MAX / VRF_BITMAP_NUM_OF_GROUPS) +#define VRF_BITMAP_NUM_OF_BYTES_IN_GROUP                                       \ +	(VRF_BITMAP_NUM_OF_BITS_IN_GROUP / CHAR_BIT + 1) /* +1 for ensure */ + +#define VRF_BITMAP_GROUP(_id) ((_id) / VRF_BITMAP_NUM_OF_BITS_IN_GROUP) +#define VRF_BITMAP_BIT_OFFSET(_id) ((_id) % VRF_BITMAP_NUM_OF_BITS_IN_GROUP) + +#define VRF_BITMAP_INDEX_IN_GROUP(_bit_offset) ((_bit_offset) / CHAR_BIT) +#define VRF_BITMAP_FLAG(_bit_offset) (((u_char)1) << ((_bit_offset) % CHAR_BIT)) + +struct vrf_bitmap { +	u_char *groups[VRF_BITMAP_NUM_OF_GROUPS];  }; -vrf_bitmap_t -vrf_bitmap_init (void) +vrf_bitmap_t vrf_bitmap_init(void)  { -  return (vrf_bitmap_t) XCALLOC (MTYPE_VRF_BITMAP, sizeof (struct vrf_bitmap)); +	return (vrf_bitmap_t)XCALLOC(MTYPE_VRF_BITMAP, +				     sizeof(struct vrf_bitmap));  } -void -vrf_bitmap_free (vrf_bitmap_t bmap) +void vrf_bitmap_free(vrf_bitmap_t bmap)  { -  struct vrf_bitmap *bm = (struct vrf_bitmap *) bmap; -  int i; +	struct vrf_bitmap *bm = (struct vrf_bitmap *)bmap; +	int i; -  if (bmap == VRF_BITMAP_NULL) -    return; +	if (bmap == VRF_BITMAP_NULL) +		return; -  for (i = 0; i < VRF_BITMAP_NUM_OF_GROUPS; i++) -    if (bm->groups[i]) -      XFREE (MTYPE_VRF_BITMAP, bm->groups[i]); +	for (i = 0; i < VRF_BITMAP_NUM_OF_GROUPS; i++) +		if (bm->groups[i]) +			XFREE(MTYPE_VRF_BITMAP, bm->groups[i]); -  XFREE (MTYPE_VRF_BITMAP, bm); +	XFREE(MTYPE_VRF_BITMAP, bm);  } -void -vrf_bitmap_set (vrf_bitmap_t bmap, vrf_id_t vrf_id) +void vrf_bitmap_set(vrf_bitmap_t bmap, vrf_id_t vrf_id)  { -  struct vrf_bitmap *bm = (struct vrf_bitmap *) bmap; -  u_char group = VRF_BITMAP_GROUP (vrf_id); -  u_char offset = VRF_BITMAP_BIT_OFFSET (vrf_id); +	struct vrf_bitmap *bm = (struct vrf_bitmap *)bmap; +	u_char group = VRF_BITMAP_GROUP(vrf_id); +	u_char offset = VRF_BITMAP_BIT_OFFSET(vrf_id); -  if (bmap == VRF_BITMAP_NULL || vrf_id == VRF_UNKNOWN) -    return; +	if (bmap == VRF_BITMAP_NULL || vrf_id == VRF_UNKNOWN) +		return; -  if (bm->groups[group] == NULL) -    bm->groups[group] = XCALLOC (MTYPE_VRF_BITMAP, -                                 VRF_BITMAP_NUM_OF_BYTES_IN_GROUP); +	if (bm->groups[group] == NULL) +		bm->groups[group] = XCALLOC(MTYPE_VRF_BITMAP, +					    VRF_BITMAP_NUM_OF_BYTES_IN_GROUP); -  SET_FLAG (bm->groups[group][VRF_BITMAP_INDEX_IN_GROUP (offset)], -            VRF_BITMAP_FLAG (offset)); +	SET_FLAG(bm->groups[group][VRF_BITMAP_INDEX_IN_GROUP(offset)], +		 VRF_BITMAP_FLAG(offset));  } -void -vrf_bitmap_unset (vrf_bitmap_t bmap, vrf_id_t vrf_id) +void vrf_bitmap_unset(vrf_bitmap_t bmap, vrf_id_t vrf_id)  { -  struct vrf_bitmap *bm = (struct vrf_bitmap *) bmap; -  u_char group = VRF_BITMAP_GROUP (vrf_id); -  u_char offset = VRF_BITMAP_BIT_OFFSET (vrf_id); +	struct vrf_bitmap *bm = (struct vrf_bitmap *)bmap; +	u_char group = VRF_BITMAP_GROUP(vrf_id); +	u_char offset = VRF_BITMAP_BIT_OFFSET(vrf_id); -  if (bmap == VRF_BITMAP_NULL || vrf_id == VRF_UNKNOWN || -      bm->groups[group] == NULL) -    return; +	if (bmap == VRF_BITMAP_NULL || vrf_id == VRF_UNKNOWN +	    || bm->groups[group] == NULL) +		return; -  UNSET_FLAG (bm->groups[group][VRF_BITMAP_INDEX_IN_GROUP (offset)], -              VRF_BITMAP_FLAG (offset)); +	UNSET_FLAG(bm->groups[group][VRF_BITMAP_INDEX_IN_GROUP(offset)], +		   VRF_BITMAP_FLAG(offset));  } -int -vrf_bitmap_check (vrf_bitmap_t bmap, vrf_id_t vrf_id) +int vrf_bitmap_check(vrf_bitmap_t bmap, vrf_id_t vrf_id)  { -  struct vrf_bitmap *bm = (struct vrf_bitmap *) bmap; -  u_char group = VRF_BITMAP_GROUP (vrf_id); -  u_char offset = VRF_BITMAP_BIT_OFFSET (vrf_id); +	struct vrf_bitmap *bm = (struct vrf_bitmap *)bmap; +	u_char group = VRF_BITMAP_GROUP(vrf_id); +	u_char offset = VRF_BITMAP_BIT_OFFSET(vrf_id); -  if (bmap == VRF_BITMAP_NULL || vrf_id == VRF_UNKNOWN || -      bm->groups[group] == NULL) -    return 0; +	if (bmap == VRF_BITMAP_NULL || vrf_id == VRF_UNKNOWN +	    || bm->groups[group] == NULL) +		return 0; -  return CHECK_FLAG (bm->groups[group][VRF_BITMAP_INDEX_IN_GROUP (offset)], -                     VRF_BITMAP_FLAG (offset)) ? 1 : 0; +	return CHECK_FLAG(bm->groups[group][VRF_BITMAP_INDEX_IN_GROUP(offset)], +			  VRF_BITMAP_FLAG(offset)) +		       ? 1 +		       : 0;  } -static void -vrf_autocomplete (vector comps, struct cmd_token *token) +static void vrf_autocomplete(vector comps, struct cmd_token *token)  { -  struct vrf *vrf = NULL; +	struct vrf *vrf = NULL; -  RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) -    { -      if (vrf->vrf_id != 0) -        vector_set (comps, XSTRDUP (MTYPE_COMPLETION, vrf->name)); -    } +	RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) +	{ +		if (vrf->vrf_id != 0) +			vector_set(comps, XSTRDUP(MTYPE_COMPLETION, vrf->name)); +	}  }  static const struct cmd_variable_handler vrf_var_handlers[] = { -  { -    .varname = "vrf", -    .completions = vrf_autocomplete, -  }, -  { -    .completions = NULL -  }, +	{ +		.varname = "vrf", +		.completions = vrf_autocomplete, +	}, +	{.completions = NULL},  };  /* Initialize VRF module. */ -void -vrf_init (int (*create)(struct vrf *), -	  int (*enable)(struct vrf *), -	  int (*disable)(struct vrf *), -	  int (*delete)(struct vrf *)) -{ -  struct vrf *default_vrf; - -  if (debug_vrf) -    zlog_debug ("%s: Initializing VRF subsystem", __PRETTY_FUNCTION__); - -  vrf_master.vrf_new_hook = create; -  vrf_master.vrf_enable_hook = enable; -  vrf_master.vrf_disable_hook = disable; -  vrf_master.vrf_delete_hook = delete; - -  /* The default VRF always exists. */ -  default_vrf = vrf_get (VRF_DEFAULT, VRF_DEFAULT_NAME); -  if (!default_vrf) -    { -      zlog_err ("vrf_init: failed to create the default VRF!"); -      exit (1); -    } - -  /* Enable the default VRF. */ -  if (!vrf_enable (default_vrf)) -    { -      zlog_err ("vrf_init: failed to enable the default VRF!"); -      exit (1); -    } - -  cmd_variable_handler_register (vrf_var_handlers); +void vrf_init(int (*create)(struct vrf *), int (*enable)(struct vrf *), +	      int (*disable)(struct vrf *), int (*delete)(struct vrf *)) +{ +	struct vrf *default_vrf; + +	if (debug_vrf) +		zlog_debug("%s: Initializing VRF subsystem", +			   __PRETTY_FUNCTION__); + +	vrf_master.vrf_new_hook = create; +	vrf_master.vrf_enable_hook = enable; +	vrf_master.vrf_disable_hook = disable; +	vrf_master.vrf_delete_hook = delete; + +	/* The default VRF always exists. */ +	default_vrf = vrf_get(VRF_DEFAULT, VRF_DEFAULT_NAME); +	if (!default_vrf) { +		zlog_err("vrf_init: failed to create the default VRF!"); +		exit(1); +	} + +	/* Enable the default VRF. */ +	if (!vrf_enable(default_vrf)) { +		zlog_err("vrf_init: failed to enable the default VRF!"); +		exit(1); +	} + +	cmd_variable_handler_register(vrf_var_handlers);  }  /* Terminate VRF module. */ -void -vrf_terminate (void) +void vrf_terminate(void)  { -  struct vrf *vrf; +	struct vrf *vrf; -  if (debug_vrf) -    zlog_debug ("%s: Shutting down vrf subsystem", __PRETTY_FUNCTION__); +	if (debug_vrf) +		zlog_debug("%s: Shutting down vrf subsystem", +			   __PRETTY_FUNCTION__); -  while ((vrf = RB_ROOT (vrf_id_head, &vrfs_by_id)) != NULL) -    vrf_delete (vrf); -  while ((vrf = RB_ROOT (vrf_name_head, &vrfs_by_name)) != NULL) -    vrf_delete (vrf); +	while ((vrf = RB_ROOT(vrf_id_head, &vrfs_by_id)) != NULL) +		vrf_delete(vrf); +	while ((vrf = RB_ROOT(vrf_name_head, &vrfs_by_name)) != NULL) +		vrf_delete(vrf);  }  /* Create a socket for the VRF. */ -int -vrf_socket (int domain, int type, int protocol, vrf_id_t vrf_id) +int vrf_socket(int domain, int type, int protocol, vrf_id_t vrf_id)  { -  int ret = -1; +	int ret = -1; -  ret = socket (domain, type, protocol); +	ret = socket(domain, type, protocol); -  return ret; +	return ret;  }  /* vrf CLI commands */ @@ -467,23 +434,23 @@ DEFUN_NOSH (vrf,         "Select a VRF to configure\n"         "VRF's name\n")  { -  int idx_name = 1; -  const char *vrfname = argv[idx_name]->arg; -  struct vrf *vrfp; +	int idx_name = 1; +	const char *vrfname = argv[idx_name]->arg; +	struct vrf *vrfp; -  if (strlen(vrfname) > VRF_NAMSIZ) -    { -      vty_out (vty, "%% VRF name %s is invalid: length exceeds " -                    "%d characters\n", -               vrfname, VRF_NAMSIZ); -      return CMD_WARNING_CONFIG_FAILED; -    } +	if (strlen(vrfname) > VRF_NAMSIZ) { +		vty_out(vty, +			"%% VRF name %s is invalid: length exceeds " +			"%d characters\n", +			vrfname, VRF_NAMSIZ); +		return CMD_WARNING_CONFIG_FAILED; +	} -  vrfp = vrf_get (VRF_UNKNOWN, vrfname); +	vrfp = vrf_get(VRF_UNKNOWN, vrfname); -  VTY_PUSH_CONTEXT (VRF_NODE, vrfp); +	VTY_PUSH_CONTEXT(VRF_NODE, vrfp); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN_NOSH (no_vrf, @@ -493,36 +460,29 @@ DEFUN_NOSH (no_vrf,             "Delete a pseudo VRF's configuration\n"             "VRF's name\n")  { -  const char *vrfname = argv[2]->arg; +	const char *vrfname = argv[2]->arg; -  struct vrf *vrfp; +	struct vrf *vrfp; -  vrfp = vrf_lookup_by_name (vrfname); +	vrfp = vrf_lookup_by_name(vrfname); -  if (vrfp == NULL) -    { -      vty_out (vty, "%% VRF %s does not exist\n", vrfname); -      return CMD_WARNING_CONFIG_FAILED; -    } +	if (vrfp == NULL) { +		vty_out(vty, "%% VRF %s does not exist\n", vrfname); +		return CMD_WARNING_CONFIG_FAILED; +	} -  if (CHECK_FLAG (vrfp->status, VRF_ACTIVE)) -    { -      vty_out (vty, "%% Only inactive VRFs can be deleted\n"); -      return CMD_WARNING_CONFIG_FAILED; -    } +	if (CHECK_FLAG(vrfp->status, VRF_ACTIVE)) { +		vty_out(vty, "%% Only inactive VRFs can be deleted\n"); +		return CMD_WARNING_CONFIG_FAILED; +	} -  vrf_delete(vrfp); +	vrf_delete(vrfp); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  } -struct cmd_node vrf_node = -{ -  VRF_NODE, -  "%s(config-vrf)# ", -  1 -}; +struct cmd_node vrf_node = {VRF_NODE, "%s(config-vrf)# ", 1};  /*   * Debug CLI for vrf's @@ -533,9 +493,9 @@ DEFUN (vrf_debug,        DEBUG_STR        "VRF Debugging\n")  { -  debug_vrf = 1; +	debug_vrf = 1; -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_vrf_debug, @@ -545,43 +505,35 @@ DEFUN (no_vrf_debug,        DEBUG_STR        "VRF Debugging\n")  { -  debug_vrf = 0; +	debug_vrf = 0; -  return CMD_SUCCESS; +	return CMD_SUCCESS;  } -static int -vrf_write_host (struct vty *vty) +static int vrf_write_host(struct vty *vty)  { -  if (debug_vrf) -    vty_out (vty, "debug vrf\n"); +	if (debug_vrf) +		vty_out(vty, "debug vrf\n"); -  return 1; +	return 1;  } -static struct cmd_node vrf_debug_node = -{ -  VRF_DEBUG_NODE, -  "", -  1 -}; +static struct cmd_node vrf_debug_node = {VRF_DEBUG_NODE, "", 1}; -void -vrf_install_commands (void) +void vrf_install_commands(void)  { -  install_node (&vrf_debug_node, vrf_write_host); +	install_node(&vrf_debug_node, vrf_write_host); -  install_element (CONFIG_NODE, &vrf_debug_cmd); -  install_element (ENABLE_NODE, &vrf_debug_cmd); -  install_element (CONFIG_NODE, &no_vrf_debug_cmd); -  install_element (ENABLE_NODE, &no_vrf_debug_cmd); +	install_element(CONFIG_NODE, &vrf_debug_cmd); +	install_element(ENABLE_NODE, &vrf_debug_cmd); +	install_element(CONFIG_NODE, &no_vrf_debug_cmd); +	install_element(ENABLE_NODE, &no_vrf_debug_cmd);  } -void -vrf_cmd_init (int (*writefunc)(struct vty *vty)) +void vrf_cmd_init(int (*writefunc)(struct vty *vty))  { -  install_element (CONFIG_NODE, &vrf_cmd); -  install_element (CONFIG_NODE, &no_vrf_cmd); -  install_node (&vrf_node, writefunc); -  install_default (VRF_NODE); +	install_element(CONFIG_NODE, &vrf_cmd); +	install_element(CONFIG_NODE, &no_vrf_cmd); +	install_node(&vrf_node, writefunc); +	install_default(VRF_NODE);  }  | 
