View difference between Paste ID: igP7255S and hi1DKjLV
SHOW: | | - or go back to the newest paste.
1
2
struct shortTvlv {
3
        uint8_t type;
4
        uint8_t version;
5
        uint8_t length;
6
};
7
8
struct longTvlv {
9
        uint8_t type;
10
        uint8_t version;
11
        uint16_t length;
12
};
13
14
15
16
17
struct batadv_shortTvlv_node {
18
        struct hlist_node tlist;
19
        struct rcu_head rcu;
20
        struct shortTvlv *sTvlv;
21
};
22
23
struct batadv_longTvlv_node {
24
        struct hlist_node tlist;
25
        struct longTvlv *tvlv;
26
        struct rcu_head rcu;
27
};
28
29
void registerTvlv(       uint8_t type,
30
                          uint8_t version,
31
                          uint8_t length,/*i'm not sure we need the length it should be calculable from the value*/
32
                          uint8_t *value,
33
                          struct batadv_priv *bat_priv,
34
                          struct batadv_ogm_packet *ogm);
35
36
37
void addTvlvNode(struct batadv_priv *bat_priv,struct shortTvlv *tvlv){
38
		struct batadv_shortTvlv_node *tvlv_node=0;
39
        if(!bat_priv || !tvlv)
40
        goto end;
41
        
42
        tvlv_node=kmalloc(sizeof(struct batadv_shortTvlv_node), GFP_KERNEL);
43
        printk("New node allocated\n");
44
        
45
		if (!tvlv_node)
46
                return;
47
                
48
        INIT_HLIST_NODE(&tvlv_node->tlist);
49
       printk("New node inited\n");
50
      
51
        spin_lock_bh(&bat_priv->tvlv_list_lock);
52
         tvlv_node->sTvlv=tvlv;
53
          printk("New node assigned\n");
54
         
55
         
56
        hlist_add_head_rcu(&tvlv_node->tlist, &bat_priv->tvlv_list);
57
         printk("New node put in list\n");
58
         
59
        spin_unlock_bh(&bat_priv->tvlv_list_lock);
60
        
61
        end:return;
62
	}
63
64
65
66
void registerTvlv(uint8_t type,uint8_t version,uint8_t length,uint8_t *value,struct batadv_priv *bat_priv,struct batadv_ogm_packet *ogm){
67
	
68
	if(!type || !version || !length || !value || !bat_priv ||!ogm)
69
	goto end;
70
	
71
		
72
	printk("Type %d version %d length %d \n",type,version,length);
73
	
74
	
75
	struct batadv_shortTvlv_node *shortTvlv_node=0;
76
	struct hlist_node *listnode=0;;
77
	int new=0;
78
	uint8_t *val=0;
79
80
81
	rcu_read_lock();
82
		
83
		hlist_for_each_entry_rcu(shortTvlv_node,listnode,&bat_priv->tvlv_list,tlist){
84
	
85
		 
86
		 if(shortTvlv_node->sTvlv->type!=type )
87
		 continue;
88
		
89
		 goto update;
90
		
91
		 }
92
93
new: 
94
printk("Constructing new tlv\n");
95
struct shortTvlv *tvlv=0;
96
tvlv=kmalloc(sizeof(struct shortTvlv)+sizeof(uint8_t),GFP_KERNEL);
97
		printk("passed malloc checking for new memory validity\n");
98
		if(!tvlv)goto end;
99
		printk("mem valid puting tvl \n");
100
	 tvlv->length=length;
101
	 tvlv->version=version;
102
	 tvlv->type=type;
103
	 		printk("tvl filled\n");
104
	 ogm->nofAppendedTvlvs++;
105
	 		printk("tvl registered in the ogm\n");
106
	 memcpy(tvlv+sizeof(struct shortTvlv),value,length*sizeof(uint8_t));
107
	 		printk("value put in place\n");
108
	 addTvlvNode(bat_priv,tvlv);
109
	 		
110
	 printk("New Tvlv added: %d\n",ogm->nofAppendedTvlvs);
111
	 goto end;
112
update: 
113
	printk("updating existing one\n");
114
	val=value;
115
	struct shortTvlv *tmp;
116
	tmp=shortTvlv_node->sTvlv;
117
	memcpy(tmp+sizeof(struct shortTvlv),val,length*sizeof(uint8_t));
118
	
119
end:
120
	rcu_read_unlock();
121
	
122
		}