lq plugins: explicit unsigned for LINK_COST_BROKEN and ROUTE_COST_BROKEN
[olsrd.git] / src / lq_plugin.h
index 0698615..3a7ddb9 100644 (file)
@@ -1,7 +1,7 @@
 
 /*
  * The olsr.org Optimized Link-State Routing daemon(olsrd)
- * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
+ * Copyright (c) 2008 Henning Rogge <rogge@fgan.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #include "link_set.h"
 #include "olsr_spf.h"
 #include "lq_packet.h"
+#include "packet.h"
 #include "common/avl.h"
 
-#define LINK_COST_BROKEN (0x00ffffff)
-#define ROUTE_COST_BROKEN (0xffffffff)
-#define ZERO_ROUTE_COST 0
+#define LINK_COST_BROKEN (1u<<22)
+#define ROUTE_COST_BROKEN (0xffffffffu)
+#define ZERO_ROUTE_COST 0u
 
 #define MINIMAL_USEFUL_LQ 0.1
 #define LQ_PLUGIN_RELEVANT_COSTCHANGE 16
 
-#define LQTEXT_MAXLENGTH 32
+#define LQ_QUICKSTART_STEPS 12
+#define LQ_QUICKSTART_AGING 0.25
 
-struct lq_linkdata_type {
-  const char *name;
-  size_t name_maxlen;
-  int32_t best, good, average, worst;
-};
-
-enum lq_linkdata_quality {
-  LQ_QUALITY_BEST,
-  LQ_QUALITY_GOOD,
-  LQ_QUALITY_AVERAGE,
-  LQ_QUALITY_BAD,
-  LQ_QUALITY_WORST
+struct lqtextbuffer {
+  char buf[16];
 };
 
 struct lq_handler {
-  const char *name;
-
   void (*initialize) (void);
-  void (*deinitialize) (void);
-
-  olsr_linkcost(*calc_link_entry_cost) (struct link_entry *);
-  olsr_linkcost(*calc_lq_hello_neighbor_cost) (struct lq_hello_neighbor *);
-  olsr_linkcost(*calc_tc_mpr_addr_cost) (struct tc_mpr_addr *);
-  olsr_linkcost(*calc_tc_edge_entry_cost) (struct tc_edge_entry *);
-
-  bool(*is_relevant_costchange) (olsr_linkcost c1, olsr_linkcost c2);
 
-  olsr_linkcost(*packet_loss_handler) (struct link_entry *, bool);
+  olsr_linkcost (*calc_hello_cost) (const void *lq);
+  olsr_linkcost (*calc_tc_cost) (const void *lq);
 
-  void (*memorize_foreign_hello) (struct link_entry *, struct lq_hello_neighbor *);
+  void (*packet_loss_handler) (struct link_entry * entry, void *lq, bool lost);
 
-  void (*copy_link_entry_lq_into_tc_mpr_addr) (struct tc_mpr_addr *, struct link_entry *);
-  void (*copy_link_entry_lq_into_tc_edge_entry) (struct tc_edge_entry *, struct link_entry *);
-  void (*copy_link_lq_into_neighbor) (struct lq_hello_neighbor *, struct link_entry *);
+  void (*memorize_foreign_hello) (void *local, void *foreign);
+  void (*copy_link_lq_into_neigh) (void *target, void *source);
+  void (*copy_link_lq_into_tc) (void *target, void *source);
+  void (*clear_hello) (void *target);
+  void (*clear_tc) (void *target);
 
-  void (*clear_link_entry) (struct link_entry *);
-  void (*clear_lq_hello_neighbor) (struct lq_hello_neighbor *);
-  void (*clear_tc_mpr_addr) (struct tc_mpr_addr *);
-  void (*clear_tc_edge_entry) (struct tc_edge_entry *);
+  int (*serialize_hello_lq) (unsigned char *buff, void *lq);
+  int (*serialize_tc_lq) (unsigned char *buff, void *lq);
+  void (*deserialize_hello_lq) (const uint8_t ** curr, void *lq);
+  void (*deserialize_tc_lq) (const uint8_t ** curr, void *lq);
 
-  int (*serialize_hello_lq) (unsigned char *, struct lq_hello_neighbor *);
-  int (*serialize_tc_lq) (unsigned char *, struct tc_mpr_addr *);
-  void (*deserialize_hello_lq) (uint8_t const **, struct lq_hello_neighbor *);
-  void (*deserialize_tc_lq) (uint8_t const **, struct tc_edge_entry *);
+  const char *(*print_hello_lq) (void *ptr, char separator, struct lqtextbuffer * buffer);
+  const char *(*print_tc_lq) (void *ptr, char separator, struct lqtextbuffer * buffer);
+  const char *(*print_cost) (olsr_linkcost cost, struct lqtextbuffer * buffer);
 
-  int (*get_link_entry_data) (struct link_entry *, int);
-
-  const char *(*print_cost) (olsr_linkcost cost, char *, size_t);
-  const char *(*print_link_entry_lq) (struct link_entry *, int, char *, size_t);
-
-  struct lq_linkdata_type *linkdata_hello;
-  int linkdata_hello_count;
+  size_t hello_lq_size;
+  size_t tc_lq_size;
+  size_t hello_lqdata_size;
+  size_t tc_lqdata_size;
+};
 
-  size_t size_tc_edge;
-  size_t size_tc_mpr_addr;
-  size_t size_lq_hello_neighbor;
-  size_t size_link_entry;
+struct lq_handler_node {
+  struct avl_node node;
+  struct lq_handler *handler;
+  char name[0];
+};
 
-  uint8_t messageid_hello;
-  uint8_t messageid_tc;
+AVLNODE2STRUCT(lq_handler_tree2lq_handler_node, struct lq_handler_node, node);
 
-  size_t serialized_lqhello_size;
-  size_t serialized_lqtc_size;
-};
+#define OLSR_FOR_ALL_LQ_HANDLERS(lq) \
+{ \
+  struct avl_node *lq_tree_node, *next_lq_tree_node; \
+  for (lq_tree_node = avl_walk_first(&lq_handler_tree); \
+    lq_tree_node; lq_tree_node = next_lq_tree_node) { \
+    next_lq_tree_node = avl_walk_next(lq_tree_node); \
+    lq = lq_handler_tree2lq_handler_node(lq_tree_node);
+#define OLSR_FOR_ALL_LQ_HANDLERS_END(tc) }}
 
-void init_lq_handler(void);
-void deinit_lq_handler(void);
+int avl_strcasecmp(const void *str1, const void *str2);
+void init_lq_handler_tree(void);
 
-olsr_linkcost olsr_calc_tc_cost(struct tc_edge_entry *);
-bool olsr_is_relevant_costchange(olsr_linkcost c1, olsr_linkcost c2);
+void register_lq_handler(struct lq_handler *handler, const char *name);
 
-int olsr_serialize_hello_lq_pair(unsigned char *, struct lq_hello_neighbor *);
-void olsr_deserialize_hello_lq_pair(const uint8_t **, struct lq_hello_neighbor *);
-int olsr_serialize_tc_lq_pair(unsigned char *, struct tc_mpr_addr *);
-void olsr_deserialize_tc_lq_pair(const uint8_t **, struct tc_edge_entry *);
+olsr_linkcost olsr_calc_tc_cost(const struct tc_edge_entry *);
 
-void olsr_update_packet_loss_worker(struct link_entry *, bool);
-void olsr_memorize_foreign_hello_lq(struct link_entry *, struct lq_hello_neighbor *);
+int olsr_serialize_hello_lq_pair(unsigned char *buff, struct lq_hello_neighbor *neigh);
+void olsr_deserialize_hello_lq_pair(const uint8_t ** curr, struct hello_neighbor *neigh);
+int olsr_serialize_tc_lq_pair(unsigned char *buff, struct tc_mpr_addr *neigh);
+void olsr_deserialize_tc_lq_pair(const uint8_t ** curr, struct tc_edge_entry *edge);
 
-const char *EXPORT(olsr_get_linkcost_text) (olsr_linkcost, bool, char *, size_t);
-const char *EXPORT(olsr_get_linkdata_text) (struct link_entry *, int, char *, size_t);
-const char *EXPORT(olsr_get_linklabel) (int);
-size_t EXPORT(olsr_get_linklabel_maxlength) (int);
-size_t EXPORT(olsr_get_linklabel_count) (void);
-enum lq_linkdata_quality EXPORT(olsr_get_linkdata_quality) (struct link_entry *, int);
+void olsr_update_packet_loss_worker(struct link_entry *entry, bool lost);
+void olsr_memorize_foreign_hello_lq(struct link_entry *local, struct hello_neighbor *foreign);
 
-void olsr_copy_hello_lq(struct lq_hello_neighbor *, struct link_entry *);
-void olsr_copylq_link_entry_2_tc_mpr_addr(struct tc_mpr_addr *, struct link_entry *);
-void olsr_copylq_link_entry_2_tc_edge_entry(struct tc_edge_entry *, struct link_entry *);
+const char *get_link_entry_text(struct link_entry *entry, char separator, struct lqtextbuffer *buffer);
+const char *get_tc_edge_entry_text(struct tc_edge_entry *entry, char separator, struct lqtextbuffer *buffer);
+const char *get_linkcost_text(olsr_linkcost cost, bool route, struct lqtextbuffer *buffer);
 
-struct tc_edge_entry *olsr_malloc_tc_edge_entry(void);
-struct tc_mpr_addr *olsr_malloc_tc_mpr_addr(void);
-struct lq_hello_neighbor *olsr_malloc_lq_hello_neighbor(void);
-struct link_entry *olsr_malloc_link_entry(void);
+void olsr_clear_hello_lq(struct link_entry */*link*/);
+void olsr_copy_hello_lq(struct lq_hello_neighbor *target, struct link_entry *source);
+void olsr_copylq_link_entry_2_tc_mpr_addr(struct tc_mpr_addr *target, struct link_entry *source);
+void olsr_copylq_link_entry_2_tc_edge_entry(struct tc_edge_entry *target, struct link_entry *source);
+void olsr_clear_tc_lq(struct tc_mpr_addr *target);
 
-void olsr_free_link_entry(struct link_entry *);
-void olsr_free_lq_hello_neighbor(struct lq_hello_neighbor *);
-void olsr_free_tc_edge_entry(struct tc_edge_entry *);
-void olsr_free_tc_mpr_addr(struct tc_mpr_addr *);
+struct hello_neighbor *olsr_malloc_hello_neighbor(const char *id);
+struct tc_mpr_addr *olsr_malloc_tc_mpr_addr(const char *id);
+struct lq_hello_neighbor *olsr_malloc_lq_hello_neighbor(const char *id);
+struct link_entry *olsr_malloc_link_entry(const char *id);
 
-uint8_t olsr_get_Hello_MessageId(void);
-uint8_t olsr_get_TC_MessageId(void);
+size_t olsr_sizeof_hello_lqdata(void);
+size_t olsr_sizeof_tc_lqdata(void);
 
-size_t olsr_sizeof_HelloLQ(void);
-size_t olsr_sizeof_TCLQ(void);
+void olsr_relevant_linkcost_change(void);
 
 /* Externals. */
-extern struct lq_handler *EXPORT(active_lq_handler);
+extern struct lq_handler *active_lq_handler;
 
-#endif /*LQPLUGIN_H_ */
+#endif /* LQPLUGIN_H_ */
 
 /*
  * Local Variables: