renaming batman_if
Hi,
due to popular request I'm proposing 2 patches to rename "batman_if" to "hard_iface". The former was rather confusing/misleading whereas the latter expresses its function clearly.
Note: As this struct is used all over the code it will create quite a rebase effort for everyone with external patches. Keep in mind that "sed" is your friend. ;-)
Cheers,
Marek
PATCH 1/2 batman-adv: rename global if_list to hardif_list
Batman-adv works with "hard interfaces" as well as "soft interfaces". The new name should better make clear which kind of interfaces this list stores.
--- batman-adv/hard-interface.c | 28 ++++++++++++++-------------- batman-adv/main.c | 6 +++--- batman-adv/main.h | 2 +- batman-adv/originator.c | 2 +- batman-adv/routing.c | 2 +- batman-adv/send.c | 4 ++-- 6 files changed, 22 insertions(+), 22 deletions(-)
batman-adv/hard-interface.c +14 -14
@@ -31,8 +31,8 @@#include <linux/if_arp.h> -/* protect update critical side of if_list - but not the content */ -static DEFINE_SPINLOCK (if_list_lock); +/* protect update critical side of hardif_list - but not the content */ +static DEFINE_SPINLOCK (hardif_list_lock); static int batman_skb_recv(struct sk_buff *skb,
@@ -54,7 +54,7 @@ struct batman_if *get_batman_if_by_netdev(struct net_device *net_dev)struct batman_if *batman_if;rcu_read_lock (); -list_for_each_entry_rcu (batman_if, &if_list, list) { +list_for_each_entry_rcu (batman_if, &hardif_list, list) {if (batman_if->net_dev == net_dev &&atomic_inc_not_zero (&batman_if->refcount)) goto out;
@@ -99,7 +99,7 @@ static struct batman_if *get_active_batman_if(struct net_device *soft_iface)struct batman_if *batman_if;rcu_read_lock (); -list_for_each_entry_rcu (batman_if, &if_list, list) { +list_for_each_entry_rcu (batman_if, &hardif_list, list) {if (batman_if->soft_iface != soft_iface)continue ;
@@ -179,7 +179,7 @@ static void check_known_mac_addr(struct net_device *net_dev)struct batman_if *batman_if;rcu_read_lock (); -list_for_each_entry_rcu (batman_if, &if_list, list) { +list_for_each_entry_rcu (batman_if, &hardif_list, list) {if ((batman_if->if_status !=IF_ACTIVE ) && (batman_if->if_status !=IF_TO_BE_ACTIVATED ))continue ;
@@ -212,7 +212,7 @@ int hardif_min_mtu(struct net_device *soft_iface) goto out;rcu_read_lock (); -list_for_each_entry_rcu (batman_if, &if_list, list) { +list_for_each_entry_rcu (batman_if, &hardif_list, list) {if ((batman_if->if_status !=IF_ACTIVE ) && (batman_if->if_status !=IF_TO_BE_ACTIVATED ))continue ;
@@ -449,9 +449,9 @@ static struct batman_if *hardif_add_interface(struct net_device *net_dev)check_known_mac_addr (batman_if->net_dev); -spin_lock (&if_list_lock); -list_add_tail_rcu (&batman_if->list, &if_list); -spin_unlock (&if_list_lock); +spin_lock (&hardif_list_lock); +list_add_tail_rcu (&batman_if->list, &hardif_list); +spin_unlock (&hardif_list_lock);return batman_if;
@@ -484,12 +484,12 @@ void hardif_remove_interfaces(void)INIT_LIST_HEAD (&if_queue); -spin_lock (&if_list_lock); -list_for_each_entry_safe (batman_if, batman_if_tmp, &if_list, list) { +spin_lock (&hardif_list_lock); +list_for_each_entry_safe (batman_if, batman_if_tmp, &hardif_list, list) {list_del_rcu (&batman_if->list);list_add_tail (&batman_if->list, &if_queue); } -spin_unlock (&if_list_lock); +spin_unlock (&hardif_list_lock);rtnl_lock ();list_for_each_entry_safe (batman_if, batman_if_tmp, &if_queue, list) {
@@ -520,9 +520,9 @@ static int hard_if_event(struct notifier_block *this,hardif_deactivate_interface (batman_if);break ;case NETDEV_UNREGISTER : -spin_lock (&if_list_lock); +spin_lock (&hardif_list_lock);list_del_rcu (&batman_if->list); -spin_unlock (&if_list_lock); +spin_unlock (&hardif_list_lock);hardif_remove_interface (batman_if);break ;
batman-adv/main.c +3 -3
@@ -33,7 +33,7 @@#include "vis.h" #include "hash.h" -struct list_head if_list; +struct list_head hardif_list;unsigned char broadcast_addr[] = {0xff ,0xff ,0xff ,0xff ,0xff ,0xff };
@@ -41,7 +41,7 @@ struct workqueue_struct *bat_event_workqueue;static int __init batman_init (void ) { -INIT_LIST_HEAD (&if_list); +INIT_LIST_HEAD (&hardif_list);/* the name should not be longer than 10 chars - see * http://lwn.net/Articles/23634/ */
@@ -156,7 +156,7 @@ int is_my_mac(uint8_t *addr)struct batman_if *batman_if;rcu_read_lock (); -list_for_each_entry_rcu (batman_if, &if_list, list) { +list_for_each_entry_rcu (batman_if, &hardif_list, list) {if (batman_if->if_status !=IF_ACTIVE )continue ;
batman-adv/main.h +1 -1
@@ -124,7 +124,7 @@#define REVISION_VERSION_STR " "REVISION_VERSION#endif -extern struct list_head if_list; +extern struct list_head hardif_list;extern unsigned char broadcast_addr[];extern struct workqueue_struct *bat_event_workqueue;
batman-adv/originator.c +1 -1
@@ -601,7 +601,7 @@ int orig_hash_del_if(struct batman_if *batman_if, int max_if_num)/* renumber remaining batman interfaces _inside_ of orig_hash_lock */ rcu_read_lock (); -list_for_each_entry_rcu (batman_if_tmp, &if_list, list) { +list_for_each_entry_rcu (batman_if_tmp, &hardif_list, list) {if (batman_if_tmp->if_status ==IF_NOT_IN_USE )continue ;
batman-adv/routing.c +1 -1
@@ -643,7 +643,7 @@ void receive_bat_packet(struct ethhdr *ethhdr, has_directlink_flag);rcu_read_lock (); -list_for_each_entry_rcu (batman_if, &if_list, list) { +list_for_each_entry_rcu (batman_if, &hardif_list, list) {if (batman_if->if_status !=IF_ACTIVE )continue ;
batman-adv/send.c +2 -2
@@ -204,7 +204,7 @@ static void send_packet(struct forw_packet *forw_packet)/* broadcast on every interface */ rcu_read_lock (); -list_for_each_entry_rcu (batman_if, &if_list, list) { +list_for_each_entry_rcu (batman_if, &hardif_list, list) {if (batman_if->soft_iface != soft_iface)continue ;
@@ -461,7 +461,7 @@ static void send_outstanding_bcast_packet(struct work_struct *work)/* rebroadcast packet */ rcu_read_lock (); -list_for_each_entry_rcu (batman_if, &if_list, list) { +list_for_each_entry_rcu (batman_if, &hardif_list, list) {if (batman_if->soft_iface != soft_iface)continue ;
Signature · 1 line
1.7.2.3
PATCH 2/2 batman-adv: rename batman_if struct to hard_iface
In reply to Marek Lindner--- batman-adv/aggregation.c | 8 +- batman-adv/aggregation.h | 4 +- batman-adv/bat_sysfs.c | 41 +++--- batman-adv/hard-interface.c | 353 ++++++++++++++++++++++--------------------- batman-adv/hard-interface.h | 12 +- batman-adv/main.c | 8 +- batman-adv/originator.c | 28 ++-- batman-adv/originator.h | 6 +- batman-adv/routing.c | 48 +++--- batman-adv/routing.h | 20 ++-- batman-adv/send.c | 101 ++++++------ batman-adv/send.h | 8 +- batman-adv/soft-interface.c | 2 +- batman-adv/soft-interface.h | 2 +- batman-adv/types.h | 8 +- batman-adv/unicast.c | 8 +- batman-adv/unicast.h | 2 +- batman-adv/vis.c | 6 +- 18 files changed, 335 insertions(+), 330 deletions(-)
batman-adv/aggregation.c +4 -4
@@ -35,7 +35,7 @@ static bool can_aggregate_with(struct batman_packet *new_batman_packet,int packet_len, unsigned long send_time, bool directlink, - struct batman_if *if_incoming, + struct hard_iface *if_incoming, struct forw_packet *forw_packet) { struct batman_packet *batman_packet =
@@ -99,7 +99,7 @@ static bool can_aggregate_with(struct batman_packet *new_batman_packet,/* create a new aggregated packet and add this packet to it */ static void new_aggregated_packet (unsigned char *packet_buff,int packet_len,unsigned long send_time,bool direct_link, -struct batman_if *if_incoming, +struct hard_iface *if_incoming,int own_packet) {struct bat_priv *bat_priv =netdev_priv (if_incoming->soft_iface);
@@ -188,7 +188,7 @@ static void aggregate(struct forw_packet *forw_packet_aggr,void add_bat_packet_to_list (struct bat_priv *bat_priv,unsigned char *packet_buff,int packet_len, -struct batman_if *if_incoming,char own_packet, +struct hard_iface *if_incoming,char own_packet,unsigned long send_time) {/**
@@ -247,7 +247,7 @@ void add_bat_packet_to_list(struct bat_priv *bat_priv,/* unpack the aggregated packets and process them one by one */ void receive_aggr_bat_packet (struct ethhdr *ethhdr,unsigned char *packet_buff, -int packet_len,struct batman_if *if_incoming) +int packet_len,struct hard_iface *if_incoming) {struct batman_packet *batman_packet;int buff_pos =0 ;
batman-adv/aggregation.h +2 -2
@@ -35,9 +35,9 @@ static inline int aggregated_packet(int buff_pos, int packet_len, int num_hna)void add_bat_packet_to_list (struct bat_priv *bat_priv,unsigned char *packet_buff,int packet_len, -struct batman_if *if_incoming,char own_packet, +struct hard_iface *if_incoming,char own_packet,unsigned long send_time);void receive_aggr_bat_packet (struct ethhdr *ethhdr,unsigned char *packet_buff, -int packet_len,struct batman_if *if_incoming); +int packet_len,struct hard_iface *if_incoming);#endif /* _NET_BATMAN_ADV_AGGREGATION_H_ */
batman-adv/bat_sysfs.c +22 -19
104 lines not on this page · raw message
batman-adv/hard-interface.c +177 -176
685 lines not on this page · raw message
batman-adv/hard-interface.h +6 -6
@@ -31,18 +31,18 @@extern struct notifier_block hard_if_notifier; -struct batman_if *get_batman_if_by_netdev (struct net_device *net_dev); -int hardif_enable_interface (struct batman_if *batman_if,char *iface_name); -void hardif_disable_interface (struct batman_if *batman_if); +struct hard_iface *hardif_get_by_netdev (struct net_device *net_dev); +int hardif_enable_interface (struct hard_iface *hard_iface,char *iface_name); +void hardif_disable_interface (struct hard_iface *hard_iface);void hardif_remove_interfaces (void );int hardif_min_mtu (struct net_device *soft_iface);void update_min_mtu (struct net_device *soft_iface);void hardif_free_rcu (struct rcu_head *rcu); -static inline void hardif_free_ref (struct batman_if *batman_if) +static inline void hardif_free_ref (struct hard_iface *hard_iface) { -if (atomic_dec_and_test (&batman_if->refcount)) -call_rcu (&batman_if->rcu, hardif_free_rcu); +if (atomic_dec_and_test (&hard_iface->refcount)) +call_rcu (&hard_iface->rcu, hardif_free_rcu); }#endif /* _NET_BATMAN_ADV_HARD_INTERFACE_H_ */
batman-adv/main.c +4 -4
@@ -153,14 +153,14 @@ void dec_module_count(void)int is_my_mac (uint8_t *addr) { -struct batman_if *batman_if; +struct hard_iface *hard_iface;rcu_read_lock (); -list_for_each_entry_rcu (batman_if, &hardif_list, list) { -if (batman_if->if_status !=IF_ACTIVE ) +list_for_each_entry_rcu (hard_iface, &hardif_list, list) { +if (hard_iface->if_status !=IF_ACTIVE )continue ; -if (compare_eth (batman_if->net_dev->dev_addr, addr)) { +if (compare_eth (hard_iface->net_dev->dev_addr, addr)) {rcu_read_unlock ();return 1 ; }
batman-adv/originator.c +14 -14
@@ -73,7 +73,7 @@ void neigh_node_free_ref(struct neigh_node *neigh_node)struct neigh_node *create_neighbor (struct orig_node *orig_node,struct orig_node *orig_neigh_node,uint8_t *neigh, -struct batman_if *if_incoming) +struct hard_iface *if_incoming) {struct bat_priv *bat_priv =netdev_priv (if_incoming->soft_iface);struct neigh_node *neigh_node;
@@ -486,9 +486,9 @@ static int orig_node_add_if(struct orig_node *orig_node, int max_if_num)return 0 ; } -int orig_hash_add_if (struct batman_if *batman_if,int max_if_num) +int orig_hash_add_if (struct hard_iface *hard_iface,int max_if_num) { -struct bat_priv *bat_priv =netdev_priv (batman_if->soft_iface); +struct bat_priv *bat_priv =netdev_priv (hard_iface->soft_iface);struct hashtable_t *hash = bat_priv->orig_hash;struct hlist_node *node;struct hlist_head *head;
@@ -571,13 +571,13 @@ free_own_sum:return 0 ; } -int orig_hash_del_if (struct batman_if *batman_if,int max_if_num) +int orig_hash_del_if (struct hard_iface *hard_iface,int max_if_num) { -struct bat_priv *bat_priv =netdev_priv (batman_if->soft_iface); +struct bat_priv *bat_priv =netdev_priv (hard_iface->soft_iface);struct hashtable_t *hash = bat_priv->orig_hash;struct hlist_node *node;struct hlist_head *head; -struct batman_if *batman_if_tmp; +struct hard_iface *hard_iface_tmp;struct orig_node *orig_node;int i, ret;
@@ -590,7 +590,7 @@ int orig_hash_del_if(struct batman_if *batman_if, int max_if_num)hlist_for_each_entry_rcu (orig_node, node, head, hash_entry) {spin_lock_bh (&orig_node->ogm_cnt_lock); ret =orig_node_del_if (orig_node, max_if_num, - batman_if->if_num); + hard_iface->if_num);spin_unlock_bh (&orig_node->ogm_cnt_lock);if (ret ==-1 )
@@ -601,22 +601,22 @@ int orig_hash_del_if(struct batman_if *batman_if, int max_if_num)/* renumber remaining batman interfaces _inside_ of orig_hash_lock */ rcu_read_lock (); -list_for_each_entry_rcu (batman_if_tmp, &hardif_list, list) { -if (batman_if_tmp->if_status ==IF_NOT_IN_USE ) +list_for_each_entry_rcu (hard_iface_tmp, &hardif_list, list) { +if (hard_iface_tmp->if_status ==IF_NOT_IN_USE )continue ; -if (batman_if == batman_if_tmp) +if (hard_iface == hard_iface_tmp)continue ; -if (batman_if->soft_iface != batman_if_tmp->soft_iface) +if (hard_iface->soft_iface != hard_iface_tmp->soft_iface)continue ; -if (batman_if_tmp->if_num > batman_if->if_num) - batman_if_tmp->if_num--; +if (hard_iface_tmp->if_num > hard_iface->if_num) + hard_iface_tmp->if_num--; }rcu_read_unlock (); - batman_if->if_num =-1 ; + hard_iface->if_num =-1 ;return 0 ; err:
batman-adv/originator.h +3 -3
@@ -32,11 +32,11 @@ struct orig_node *get_orig_node(struct bat_priv *bat_priv, uint8_t *addr);struct neigh_node *create_neighbor (struct orig_node *orig_node,struct orig_node *orig_neigh_node,uint8_t *neigh, -struct batman_if *if_incoming); +struct hard_iface *if_incoming);void neigh_node_free_ref (struct neigh_node *neigh_node);int orig_seq_print_text (struct seq_file *seq,void *offset); -int orig_hash_add_if (struct batman_if *batman_if,int max_if_num); -int orig_hash_del_if (struct batman_if *batman_if,int max_if_num); +int orig_hash_add_if (struct hard_iface *hard_iface,int max_if_num); +int orig_hash_del_if (struct hard_iface *hard_iface,int max_if_num);/* returns 1 if they are the same originator */
batman-adv/routing.c +24 -24
161 lines not on this page · raw message
batman-adv/routing.h +10 -10
@@ -22,25 +22,25 @@#ifndef _NET_BATMAN_ADV_ROUTING_H_#define _NET_BATMAN_ADV_ROUTING_H_ -void slide_own_bcast_window (struct batman_if *batman_if); +void slide_own_bcast_window (struct hard_iface *hard_iface);void receive_bat_packet (struct ethhdr *ethhdr,struct batman_packet *batman_packet,unsigned char *hna_buff,int hna_buff_len, -struct batman_if *if_incoming); +struct hard_iface *if_incoming);void update_routes (struct bat_priv *bat_priv,struct orig_node *orig_node,struct neigh_node *neigh_node,unsigned char *hna_buff,int hna_buff_len); -int route_unicast_packet (struct sk_buff *skb,struct batman_if *recv_if, +int route_unicast_packet (struct sk_buff *skb,struct hard_iface *recv_if,int hdr_size); -int recv_icmp_packet (struct sk_buff *skb,struct batman_if *recv_if); -int recv_unicast_packet (struct sk_buff *skb,struct batman_if *recv_if); -int recv_ucast_frag_packet (struct sk_buff *skb,struct batman_if *recv_if); -int recv_bcast_packet (struct sk_buff *skb,struct batman_if *recv_if); -int recv_vis_packet (struct sk_buff *skb,struct batman_if *recv_if); -int recv_bat_packet (struct sk_buff *skb,struct batman_if *recv_if); +int recv_icmp_packet (struct sk_buff *skb,struct hard_iface *recv_if); +int recv_unicast_packet (struct sk_buff *skb,struct hard_iface *recv_if); +int recv_ucast_frag_packet (struct sk_buff *skb,struct hard_iface *recv_if); +int recv_bcast_packet (struct sk_buff *skb,struct hard_iface *recv_if); +int recv_vis_packet (struct sk_buff *skb,struct hard_iface *recv_if); +int recv_bat_packet (struct sk_buff *skb,struct hard_iface *recv_if);struct neigh_node *find_router (struct bat_priv *bat_priv,struct orig_node *orig_node, -struct batman_if *recv_if); +struct hard_iface *recv_if);void bonding_candidate_del (struct orig_node *orig_node,struct neigh_node *neigh_node);
batman-adv/send.c +51 -50
276 lines not on this page · raw message
batman-adv/send.h +4 -4
@@ -23,17 +23,17 @@#define _NET_BATMAN_ADV_SEND_H_int send_skb_packet (struct sk_buff *skb, -struct batman_if *batman_if, +struct hard_iface *hard_iface,uint8_t *dst_addr); -void schedule_own_packet (struct batman_if *batman_if); +void schedule_own_packet (struct hard_iface *hard_iface);void schedule_forward_packet (struct orig_node *orig_node,struct ethhdr *ethhdr,struct batman_packet *batman_packet,uint8_t directlink,int hna_buff_len, -struct batman_if *if_outgoing); +struct hard_iface *if_outgoing);int add_bcast_packet_to_list (struct bat_priv *bat_priv,struct sk_buff *skb);void send_outstanding_bat_packet (struct work_struct *work);void purge_outstanding_packets (struct bat_priv *bat_priv, -struct batman_if *batman_if); +struct hard_iface *hard_iface);#endif /* _NET_BATMAN_ADV_SEND_H_ */
batman-adv/soft-interface.c +1 -1
@@ -436,7 +436,7 @@ end: }void interface_rx (struct net_device *soft_iface, -struct sk_buff *skb,struct batman_if *recv_if, +struct sk_buff *skb,struct hard_iface *recv_if,int hdr_size) {struct bat_priv *bat_priv =netdev_priv (soft_iface);
batman-adv/soft-interface.h +1 -1
@@ -27,7 +27,7 @@ int softif_neigh_seq_print_text(struct seq_file *seq, void *offset);void softif_neigh_purge (struct bat_priv *bat_priv);int interface_tx (struct sk_buff *skb,struct net_device *soft_iface);void interface_rx (struct net_device *soft_iface, -struct sk_buff *skb,struct batman_if *recv_if, +struct sk_buff *skb,struct hard_iface *recv_if,int hdr_size);struct net_device *softif_create (char *name);void softif_destroy (struct net_device *soft_iface);
batman-adv/types.h +4 -4
@@ -33,7 +33,7 @@ sizeof(struct bcast_packet)))) -struct batman_if { +struct hard_iface { struct list_head list; int16_t if_num; char if_status;
@@ -124,7 +124,7 @@ struct neigh_node {atomic_t refcount;struct rcu_head rcu;struct orig_node *orig_node; -struct batman_if *if_incoming; +struct hard_iface *if_incoming; };
@@ -148,7 +148,7 @@ struct bat_priv {struct hlist_head softif_neigh_list;struct softif_neigh *softif_neigh;struct debug_log *debug_log; -struct batman_if *primary_if; +struct hard_iface *primary_if;struct kobject *mesh_obj;struct dentry *debug_dir;struct hlist_head forw_bat_list;
@@ -217,7 +217,7 @@ struct forw_packet {uint32_t direct_link_flags;uint8_t num_packets;struct delayed_work delayed_work; -struct batman_if *if_incoming; +struct hard_iface *if_incoming; };/* While scanning for vis-entries of a particular vis-originator
batman-adv/unicast.c +4 -4
@@ -218,7 +218,7 @@ out: }int frag_send_skb (struct sk_buff *skb,struct bat_priv *bat_priv, -struct batman_if *batman_if,uint8_t dstaddr[]) +struct hard_iface *hard_iface,uint8_t dstaddr[]) {struct unicast_packet tmp_uc, *unicast_packet;struct sk_buff *frag_skb;
@@ -263,12 +263,12 @@ int frag_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv, frag1->flags =UNI_FRAG_HEAD | large_tail; frag2->flags = large_tail; - seqno =atomic_add_return (2 , &batman_if->frag_seqno); + seqno =atomic_add_return (2 , &hard_iface->frag_seqno); frag1->seqno =htons (seqno -1 ); frag2->seqno =htons (seqno); -send_skb_packet (skb, batman_if, dstaddr); -send_skb_packet (frag_skb, batman_if, dstaddr); +send_skb_packet (skb, hard_iface, dstaddr); +send_skb_packet (frag_skb, hard_iface, dstaddr);return NET_RX_SUCCESS ; drop_frag:
batman-adv/unicast.h +1 -1
@@ -32,7 +32,7 @@ int frag_reassemble_skb(struct sk_buff *skb, struct bat_priv *bat_priv,void frag_list_free (struct list_head *head);int unicast_send_skb (struct sk_buff *skb,struct bat_priv *bat_priv);int frag_send_skb (struct sk_buff *skb,struct bat_priv *bat_priv, -struct batman_if *batman_if,uint8_t dstaddr[]); +struct hard_iface *hard_iface,uint8_t dstaddr[]);static inline int frag_can_reassemble (struct sk_buff *skb,int mtu) {
batman-adv/vis.c +3 -3
@@ -731,7 +731,7 @@ static void broadcast_vis_packet(struct bat_priv *bat_priv,struct orig_node *orig_node;struct vis_packet *packet;struct sk_buff *skb; -struct batman_if *batman_if; +struct hard_iface *hard_iface;uint8_t dstaddr[ETH_ALEN ];int i;
@@ -756,12 +756,12 @@ static void broadcast_vis_packet(struct bat_priv *bat_priv,continue ;memcpy (packet->target_orig, orig_node->orig,ETH_ALEN ); - batman_if = orig_node->router->if_incoming; + hard_iface = orig_node->router->if_incoming;memcpy (dstaddr, orig_node->router->addr,ETH_ALEN ); skb =skb_clone (info->skb_packet,GFP_ATOMIC );if (skb) -send_skb_packet (skb, batman_if, dstaddr); +send_skb_packet (skb, hard_iface, dstaddr); }rcu_read_unlock ();
Signature · 1 line
1.7.2.3
Marek Lindner
AppliedQuoted 7 lines · On Monday 14 February 2011 14:35:27 Marek Lindner wrote:
due to popular request I'm proposing 2 patches to rename "
batman_if" to "hard_iface". The former was rather confusing/misleading whereas the latter expresses its function clearly.Note: As this struct is used all over the code it will create quite a rebase effort for everyone with external patches. Keep in mind that "sed" is your friend. ;-)
Applied in revision 1951-1952.
Regards,
Marek