]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_aspath.c
Merge pull request #2677 from rtrlib/2018-07-18-master-bugfix
[mirror_frr.git] / bgpd / bgp_aspath.c
index caac385fb56d2a6f40942f43b37551a6af9aa704..d6ad52b3a6eb9e5799645e91de115a56151ae3f6 100644 (file)
@@ -80,8 +80,8 @@
  * NOT the internal representation!
  */
 struct assegment_header {
-       u_char type;
-       u_char length;
+       uint8_t type;
+       uint8_t length;
 };
 
 /* Hash for aspath.  This is the top level structure of AS path. */
@@ -109,7 +109,7 @@ const char *aspath_segment_type_str[] = {"as-invalid", "as-set", "as-sequence",
  * the caller should immediately assign data to the segment, as the segment
  * otherwise is not generally valid
  */
-static struct assegment *assegment_new(u_char type, u_short length)
+static struct assegment *assegment_new(uint8_t type, unsigned short length)
 {
        struct assegment *new;
 
@@ -214,16 +214,11 @@ static struct assegment *assegment_append_asns(struct assegment *seg,
        newas = XREALLOC(MTYPE_AS_SEG_DATA, seg->as,
                         ASSEGMENT_DATA_SIZE(seg->length + num, 1));
 
-       if (newas) {
-               seg->as = newas;
-               memcpy(seg->as + seg->length, asnos,
-                      ASSEGMENT_DATA_SIZE(num, 1));
-               seg->length += num;
-               return seg;
-       }
-
-       assegment_free_all(seg);
-       return NULL;
+       seg->as = newas;
+       memcpy(seg->as + seg->length, asnos,
+              ASSEGMENT_DATA_SIZE(num, 1));
+       seg->length += num;
+       return seg;
 }
 
 static int int_cmp(const void *p1, const void *p2)
@@ -345,7 +340,7 @@ void aspath_unintern(struct aspath **aspath)
 /* Return the start or end delimiters for a particular Segment type */
 #define AS_SEG_START 0
 #define AS_SEG_END 1
-static char aspath_delimiter_char(u_char type, u_char which)
+static char aspath_delimiter_char(uint8_t type, uint8_t which)
 {
        int i;
        struct {
@@ -498,7 +493,8 @@ static void aspath_make_str_count(struct aspath *as, bool make_json)
        if (!as->segments) {
                if (make_json) {
                        json_object_string_add(as->json, "string", "Local");
-                       json_object_object_add(as->json, "segments", jaspath_segments);
+                       json_object_object_add(as->json, "segments",
+                                              jaspath_segments);
                        json_object_int_add(as->json, "length", 0);
                }
                as->str = XMALLOC(MTYPE_AS_STR, 1);
@@ -575,8 +571,9 @@ static void aspath_make_str_count(struct aspath *as, bool make_json)
                /* write out the ASNs, with their seperators, bar the last one*/
                for (i = 0; i < seg->length; i++) {
                        if (make_json)
-                               json_object_array_add(jseg_list,
-                                                     json_object_new_int(seg->as[i]));
+                               json_object_array_add(
+                                       jseg_list,
+                                       json_object_new_int(seg->as[i]));
 
                        len += snprintf(str_buf + len, str_size - len, "%u",
                                        seg->as[i]);
@@ -588,8 +585,9 @@ static void aspath_make_str_count(struct aspath *as, bool make_json)
 
                if (make_json) {
                        jseg = json_object_new_object();
-                       json_object_string_add(jseg, "type",
-                                              aspath_segment_type_str[seg->type]);
+                       json_object_string_add(
+                               jseg, "type",
+                               aspath_segment_type_str[seg->type]);
                        json_object_object_add(jseg, "list", jseg_list);
                        json_object_array_add(jaspath_segments, jseg);
                }
@@ -861,7 +859,7 @@ static void assegment_data_put(struct stream *s, as_t *as, int num,
                }
 }
 
-static size_t assegment_header_put(struct stream *s, u_char type, int length)
+static size_t assegment_header_put(struct stream *s, uint8_t type, int length)
 {
        size_t lenp;
        assert(length <= AS_SEGMENT_MAX);
@@ -904,7 +902,8 @@ size_t aspath_put(struct stream *s, struct aspath *as, int use32bit)
                                assegment_data_put(s, seg->as, AS_SEGMENT_MAX,
                                                   use32bit);
                                written += AS_SEGMENT_MAX;
-                               bytes += ASSEGMENT_SIZE(AS_SEGMENT_MAX, use32bit);
+                               bytes += ASSEGMENT_SIZE(AS_SEGMENT_MAX,
+                                                       use32bit);
                        }
 
                        /* write the final segment, probably is also the first
@@ -958,7 +957,7 @@ size_t aspath_put(struct stream *s, struct aspath *as, int use32bit)
  * We have no way to manage the storage, so we use a static stream
  * wrapper around aspath_put.
  */
-u_char *aspath_snmp_pathseg(struct aspath *as, size_t *varlen)
+uint8_t *aspath_snmp_pathseg(struct aspath *as, size_t *varlen)
 {
 #define SNMP_PATHSEG_MAX 1024
 
@@ -1537,7 +1536,7 @@ struct aspath *aspath_filter_exclude(struct aspath *source,
 
 /* Add specified AS to the leftmost of aspath. */
 static struct aspath *aspath_add_asns(struct aspath *aspath, as_t asno,
-                                     u_char type, unsigned num)
+                                     uint8_t type, unsigned num)
 {
        struct assegment *assegment = aspath->segments;
        unsigned i;
@@ -1628,7 +1627,7 @@ struct aspath *aspath_reconcile_as4(struct aspath *aspath,
        struct aspath *newpath = NULL, *mergedpath;
        int hops, cpasns = 0;
 
-       if (!aspath)
+       if (!aspath || !as4path)
                return NULL;
 
        seg = aspath->segments;
@@ -1868,7 +1867,7 @@ enum as_token {
 
 /* Return next token and point for string parse. */
 static const char *aspath_gettoken(const char *buf, enum as_token *token,
-                                  u_long *asno)
+                                  unsigned long *asno)
 {
        const char *p = buf;
 
@@ -1933,8 +1932,8 @@ static const char *aspath_gettoken(const char *buf, enum as_token *token,
 struct aspath *aspath_str2aspath(const char *str)
 {
        enum as_token token = as_token_unknown;
-       u_short as_type;
-       u_long asno = 0;
+       unsigned short as_type;
+       unsigned long asno = 0;
        struct aspath *aspath;
        int needtype;
 
@@ -2032,9 +2031,7 @@ int aspath_cmp(const void *arg1, const void *arg2)
 /* AS path hash initialize. */
 void aspath_init(void)
 {
-       ashash = hash_create_size(32768,
-                                 aspath_key_make,
-                                 aspath_cmp,
+       ashash = hash_create_size(32768, aspath_key_make, aspath_cmp,
                                  "BGP AS Path");
 }