Compare commits
	
		
			2 Commits
		
	
	
		
			752d9ce8b5
			...
			84ec123c75
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | 84ec123c75 | |
|  | 0c295a6827 | 
							
								
								
									
										30
									
								
								trie/trie.c
								
								
								
								
							
							
						
						
									
										30
									
								
								trie/trie.c
								
								
								
								
							|  | @ -2,7 +2,7 @@ | |||
| 
 | ||||
| #define INPUT_FILE "../data/routing-data" | ||||
| #define READ_MODE "r" | ||||
| #define GET_BIT(key, bit) (( key[ bit / (sizeof(unsigned) * 8) ] & (1 << ((sizeof(unsigned) * 8 - 1) - (bit % (sizeof(unsigned) * 8)))) ) != 0 ) | ||||
| #define GET_BIT(key, bit) ( ( key.l[ bit / 64 ] & (1ul << (63 - bit % 64)) ) != 0 ) | ||||
| 
 | ||||
| 
 | ||||
| trie_node_t create_node() { | ||||
|  | @ -17,7 +17,7 @@ trie_holder_t create_holder() { | |||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| int trie_insert(trie_holder_t t, const unsigned key[4], int val, int mask) { | ||||
| int trie_insert(trie_holder_t t, ipv6_t key, int val, int mask) { | ||||
|     trie_node_t iter = t->_root; | ||||
|     trie_node_t* next = &t->_root; | ||||
|     int i = 0; | ||||
|  | @ -30,7 +30,10 @@ int trie_insert(trie_holder_t t, const unsigned key[4], int val, int mask) { | |||
|     } | ||||
|      | ||||
|     if (iter->_rule_valid == VALID_RULE) { | ||||
|         printf("WARNING: conflicting rule %x:%x:%x:%x", key[0], key[1], key[2], key[3]); | ||||
|         printf("WARNING: conflicting rule %x:%x:%x:%x:%x:%x:%x:%x",  | ||||
|             key.s[0], key.s[1], key.s[2], key.s[3], | ||||
|             key.s[4], key.s[5], key.s[6], key.s[7]); | ||||
|          | ||||
|         printf("/%d %d\n", mask, val); | ||||
|         return 0; | ||||
|     } | ||||
|  | @ -38,12 +41,10 @@ int trie_insert(trie_holder_t t, const unsigned key[4], int val, int mask) { | |||
|     iter->_rule_valid = VALID_RULE; | ||||
|     iter->_rule = val; | ||||
| 
 | ||||
|     /* printf("inserted rule: %x:%x:%x:%x", key[0], key[1], key[2], key[3]); */ | ||||
|     /* printf("/%d %d\n", mask, val); */ | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| int trie_search(trie_holder_t t, const unsigned key[4]) { | ||||
| int trie_search(trie_holder_t t, ipv6_t key) { | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
|  | @ -51,27 +52,24 @@ int trie_search(trie_holder_t t, const unsigned key[4]) { | |||
| /*------------------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| int parse_line(unsigned key[4], int* val, int* mask, FILE* f) { /*! assumes only good input */ | ||||
| int parse_line(ipv6_t* key, int* val, int* mask, FILE* f) { /*! assumes only good input */ | ||||
|     memset(key, 0, sizeof(ipv6_t)); | ||||
| 
 | ||||
|     unsigned short* tmp = (unsigned short*)key; | ||||
|     memset(tmp, 0, sizeof(short[8])); | ||||
|     fscanf(f, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx",  | ||||
|         &key->s[0], &key->s[1], &key->s[2], &key->s[3], &key->s[4], | ||||
|         &key->s[5], &key->s[6], &key->s[7]); | ||||
| 
 | ||||
|     fscanf(f, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx", &tmp[0], &tmp[1], &tmp[2], &tmp[3], &tmp[4], &tmp[5], &tmp[6], &tmp[7]); | ||||
|     if (feof(f)) return 0; /* ends with newline */ | ||||
|     while (fgetc(f) != '/'); | ||||
|      | ||||
|     fscanf(f, "%d %d", mask, val); | ||||
| 
 | ||||
|     /* printf("Loaded address: %x:%x:%x:%x", key[0], key[1], key[2], key[3]); */ | ||||
|     /* printf("/%d %d\n", *mask, *val); */ | ||||
| 
 | ||||
|     return !feof(f); | ||||
| } | ||||
| 
 | ||||
| int load_input(trie_holder_t t) { | ||||
|     int val; | ||||
|     int mask; | ||||
|     unsigned key[4]; | ||||
|     ipv6_t key; | ||||
| 
 | ||||
|     FILE* f; | ||||
|     int cnt = 0; | ||||
|  | @ -79,7 +77,7 @@ int load_input(trie_holder_t t) { | |||
|     if (!(f = fopen(INPUT_FILE, READ_MODE))) | ||||
|         perror("cant open input file"); | ||||
|      | ||||
|     while (parse_line(key, &val, &mask, f)) { | ||||
|     while (parse_line(&key, &val, &mask, f)) { | ||||
|         trie_insert(t, key, val, mask); | ||||
|         ++cnt; | ||||
|     } | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ | |||
| 
 | ||||
| union ipv6 { | ||||
|     unsigned short s[8]; | ||||
|     unsigned int   i[4]; | ||||
|     unsigned long  l[2]; | ||||
| }; | ||||
| 
 | ||||
|  | @ -36,8 +37,8 @@ struct trie_node* create_node(); | |||
| int destory_holder(struct trie_holder*); | ||||
| int destory_node(struct trie_node*); | ||||
| 
 | ||||
| int trie_insert(struct trie_holder*, const unsigned key[4], int val, int mask); | ||||
| rule_t trie_search(struct trie_holder*, const unsigned key[4]); | ||||
| int trie_insert(struct trie_holder*, ipv6_t key, int val, int mask); | ||||
| rule_t trie_search(struct trie_holder*, ipv6_t key); | ||||
| 
 | ||||
| 
 | ||||
|   | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue