diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c index 25a0bea9..d10df851 100644 --- a/proto/ospf/ospf.c +++ b/proto/ospf/ospf.c @@ -15,16 +15,138 @@ #include "nest/protocol.h" #include "nest/route.h" #include "conf/conf.h" +#include "lib/ip.h" +#include "lib/socket.h" +#include "lib/lists.h" #include "ospf.h" +int +ospf_rx_hook(sock *sk, int size) +{ + DBG(" RX_Hook_Called.\n"); + return(1); +} + +void +ospf_tx_hook(sock *sk) +{ + DBG(" TX_Hook_Called.\n"); +} + +void +ospf_err_hook(sock *sk, int err) +{ + DBG(" Err_Hook_Called.\n"); +} + +/* This will change ! */ +sock * +ospf_open_socket(struct proto *p, struct ospf_iface *ifa) +{ + sock *mcsk; + + /* No NBMA networks now */ + + if(ifa->iface->flags & IF_MULTICAST) + { + mcsk=sk_new(p->pool); + mcsk->type=SK_IP_MC; + mcsk->dport=OSPF_PROTO; + mcsk->saddr=AllSPFRouters; + mcsk->daddr=AllSPFRouters; + mcsk->ttl=1; + mcsk->rx_hook=ospf_rx_hook; + mcsk->tx_hook=ospf_tx_hook; + mcsk->err_hook=ospf_err_hook; + mcsk->iface=ifa->iface; + mcsk->rbsize=ifa->iface->mtu; + if(sk_open(mcsk)!=0) + { + DBG(" OSPF: SK_OPEN: failed\n"); + return(NULL); + } + return(mcsk); + } + else return(NULL); +} + +/* + * This will later decide, wheter use iface for OSPF or not + * depending on config + */ +int +is_good_iface(struct proto *p, struct iface *iface) +{ + return(iface->flags & IF_UP); +} + +/* Of course, it's NOT true now */ +byte +ospf_iface_clasify(struct iface *ifa) +{ + if((ifa->flags & (IF_MULTIACCESS|IF_MULTICAST))== + IF_MULTIACCESS|IF_MULTICAST) return OSPF_IM_MULTICAST; + if((ifa->flags & (IF_MULTIACCESS|IF_MULTICAST))== + IF_MULTIACCESS) return OSPF_IM_NBMA; + return OSPF_IM_PTP; +} + +void +ospf_iface_default(struct ospf_iface *ifa) +{ + int i; + + ifa->area=0; + ifa->cost=COST_D; + ifa->rxmtint=RXMTINT_D; + ifa->iftransdelay=IFTRANSDELAY_D; + ifa->priority=PRIORITY_D; + ifa->helloint=HELLOINT_D; + ifa->deadint=DEADINT_D; + ifa->autype=0; + for(i=0;i<8;i++) ifa->aukey[i]=0; + ifa->options=0; + ifa->dr=ipa_from_u32(0x00000000); + ifa->bdr=ipa_from_u32(0x00000000); + ifa->mode=ospf_iface_clasify(ifa->iface); +} + +void +ospf_if_notify(struct proto *p, unsigned flags, struct iface *new, struct iface *old) +{ + struct ospf_iface *ospf_iface; + + struct ospf_config *c; + c=(struct ospf_config *)(p->cf); + + + + DBG(" OSPF: If notify called\n"); + + if(((flags & IF_CHANGE_UP)==IF_CHANGE_UP) && is_good_iface(p, new)) + { + /* Latter I'll use config - this is incorrect */ + ospf_iface=mb_alloc(p->pool, sizeof(struct ospf_iface)); + ospf_iface->iface=new; + add_tail(&(c->iface_list), NODE ospf_iface); + ospf_iface_default(ospf_iface); + init_list(&(ospf_iface->sk_list)); + if(ospf_open_socket(p, ospf_iface)!=NULL) + { + add_tail(&(ospf_iface->sk_list),NODE ospf_iface); + } + } +} + static int ospf_start(struct proto *p) { - struct ospf_config *c = (void *) p->cf; - DBG(" OSPF: Start\n"); + + p->if_notify=ospf_if_notify; + return PS_UP; } @@ -53,6 +175,7 @@ static void ospf_preconfig(struct protocol *x, struct config *c) { DBG( " OSPF: preconfig\n" ); + init_list(&(((struct ospf_config *)c)->iface_list)); } static void diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h index 4e165f82..44a8e79f 100644 --- a/proto/ospf/ospf.h +++ b/proto/ospf/ospf.h @@ -9,9 +9,55 @@ #ifndef _BIRD_OSPF_H_ #define _BIRD_OSPF_H_ +#define OSPF_PROTO 89 +#define AllSPFRouters ipa_from_u32(0xe0000005) /* 224.0.0.5 */ +#define AllDRouters ipa_from_u32(0xe0000006) /* 224.0.0.6 */ + struct ospf_config { struct proto_config c; - ip_addr area; /* Area ID */ + ip_addr area; /* Area ID !!! This is wrong !!! */ + list iface_list; }; +struct ospf_iface { + node n; + list sk_list; /* List of active sockets */ + struct iface *iface; /* Nest's iface */ + u32 area; /* OSPF Area */ + u16 cost; /* Cost of iface */ + int rxmtint; /* number of seconds between LSA retransmissions */ + int iftransdelay; /* The estimated number of seconds it takes to + transmit a Link State Update Packet over this + interface. LSAs contained in the update */ + u8 priority; /* A router priority for DR election */ + u16 helloint; /* number of seconds between hello sending */ + u32 deadint; /* after "deadint" missing hellos is router dead */ + u16 autype; + u8 aukey[8]; + u8 options; + ip_addr dr; /* Designated router */ + ip_addr bdr; /* Backup DR */ + byte mode; +#define OSPF_IM_MULTICAST 0 +#define OSPF_IM_PTP 1 +#define OSPF_IM_NBMA 2 + +/* Default values for interface parameters */ +#define COST_D 10 +#define RXMTINT_D 5 +#define IFTRANSDELAY_D 1 +#define PRIORITY_D 0 +#define HELLOINT_D 10 +#define DEADINT_D 4 +}; + + +struct ospf_patt { + struct iface_patt i; + + u16 cost; + byte mode; +}; + + #endif /* _BIRD_OSPF_H_ */