Commit 72aed1a0 authored by Ondrej Zajicek's avatar Ondrej Zajicek
Browse files

Adds krt_source route attribute.

Thanks Jeremie Dimino for the original patch.
parent 89647357
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -1653,6 +1653,12 @@ are translated to appropriate system (and OS-specific) route attributes.
We support these attributes:

<descrip>
	<tag>int <cf/krt_source/</tag> The source of the imported
	kernel route.  The value is system-dependent. On Linux, it is
	a value of the protocol field of the route. See
	/etc/iproute2/rt_protos for common values.  On BSD, it is
	based on STATIC and PROTOx flags. The attribute is read-only.

	<tag>ip <cf/krt_prefsrc/</tag> (Linux) The preferred source address.
 	Used in source address selection for outgoing packets. Have to
 	be one of IP addresses of the router.
+8 −2
Original line number Diff line number Diff line
@@ -255,10 +255,11 @@ krt_read_rt(struct ks_msg *msg, struct krt_proto *p, int scan)
  ip_addr idst, igate, imask;
  void *body = (char *)msg->buf;
  int new = (msg->rtm.rtm_type == RTM_ADD);
  int src;
  char *errmsg = "KRT: Invalid route received";
  int flags = msg->rtm.rtm_flags;
  int addrs = msg->rtm.rtm_addrs;
  int src;
  byte src2;

  if (!(flags & RTF_UP) && scan)
    SKIP("not up in scan\n");
@@ -302,12 +303,17 @@ krt_read_rt(struct ks_msg *msg, struct krt_proto *p, int scan)
  u32 self_mask = RTF_PROTO1;
  u32 alien_mask = RTF_STATIC | RTF_PROTO1 | RTF_GATEWAY;

  src2 = (flags & RTF_STATIC) ? 1 : 0;
  src2 |= (flags & RTF_PROTO1) ? 2 : 0;

#ifdef RTF_PROTO2
  alien_mask |= RTF_PROTO2;
  src2 |= (flags & RTF_PROTO2) ? 4 : 0;
#endif

#ifdef RTF_PROTO3
  alien_mask |= RTF_PROTO3;
  src2 |= (flags & RTF_PROTO3) ? 8 : 0;
#endif

#ifdef RTF_REJECT
@@ -397,9 +403,9 @@ krt_read_rt(struct ks_msg *msg, struct krt_proto *p, int scan)
  e = rte_get_temp(&a);
  e->net = net;
  e->u.krt.src = src;
  e->u.krt.proto = src2;

  /* These are probably too Linux-specific */
  e->u.krt.proto = 0;
  e->u.krt.type = 0;
  e->u.krt.metric = 0;

+3 −1
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@ CF_DEFINES

CF_DECLS

CF_KEYWORDS(KERNEL, PERSIST, SCAN, TIME, LEARN, DEVICE, ROUTES)
CF_KEYWORDS(KERNEL, PERSIST, SCAN, TIME, LEARN, DEVICE, ROUTES, KRT_SOURCE)

CF_GRAMMAR

@@ -90,6 +90,8 @@ kif_item:
   }
 ;

CF_ADDTO(dynamic_attr, KRT_SOURCE { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_SOURCE); })

CF_CODE

CF_END
+23 −0
Original line number Diff line number Diff line
@@ -907,12 +907,29 @@ krt_shutdown(struct proto *P)
  return PS_DOWN;
}

struct ea_list *
krt_make_tmp_attrs(struct rte *rt, struct linpool *pool)
{
  struct ea_list *l = lp_alloc(pool, sizeof(struct ea_list) + 1 * sizeof(eattr));

  l->next = NULL;
  l->flags = EALF_SORTED;
  l->count = 1;
  l->attrs[0].id = EA_KRT_SOURCE;
  l->attrs[0].flags = 0;
  l->attrs[0].type = EAF_TYPE_INT | EAF_TEMP;
  l->attrs[0].u.data = rt->u.krt.proto;

  return l;
}

static struct proto *
krt_init(struct proto_config *c)
{
  struct krt_proto *p = proto_new(c, sizeof(struct krt_proto));

  p->p.accept_ra_types = RA_OPTIMAL;
  p->p.make_tmp_attrs = krt_make_tmp_attrs;
  p->p.import_control = krt_import_control;
  p->p.rt_notify = krt_notify;

@@ -952,12 +969,18 @@ krt_get_attr(eattr * a, byte * buf, int buflen UNUSED)
{
  switch (a->id)
  {
  case EA_KRT_SOURCE:
    bsprintf(buf, "source");
    return GA_NAME;

  case EA_KRT_PREFSRC:
    bsprintf(buf, "prefsrc");
    return GA_NAME;

  case EA_KRT_REALM:
    bsprintf(buf, "realm");
    return GA_NAME;

  default:
    return GA_UNKNOWN;
  }
+3 −2
Original line number Diff line number Diff line
@@ -28,8 +28,9 @@ struct kif_proto;
#define KRF_DELETE 3			/* Should be deleted */
#define KRF_IGNORE 4			/* To be ignored */

#define EA_KRT_PREFSRC EA_CODE(EAP_KRT, 0)
#define EA_KRT_REALM EA_CODE(EAP_KRT, 1)
#define EA_KRT_SOURCE	EA_CODE(EAP_KRT, 0)
#define EA_KRT_PREFSRC	EA_CODE(EAP_KRT, 1)
#define EA_KRT_REALM	EA_CODE(EAP_KRT, 2)

/* Whenever we recognize our own routes, we allow learing of foreign routes */

Loading