diff --git a/code/anolisos-8.6/linux-4.19.91/include/net/prip.h b/code/anolisos-8.6/linux-4.19.91/include/net/prip.h index a4556e09eaa74e4371f51b56ed3b4e91b4205ab0..1cebaef5a80c5447cbd3f3569cf78505eb702bcf 100644 --- a/code/anolisos-8.6/linux-4.19.91/include/net/prip.h +++ b/code/anolisos-8.6/linux-4.19.91/include/net/prip.h @@ -75,33 +75,4 @@ struct prip_priv{ struct timer_list timer; }; -// extern int set_prip_mode(struct sock *sk, int mode); -// extern __u32 master_to_slave(__u32 master_ip); -// extern __u32 slave_to_master(__u32 slave_ip); -// extern void set_slave_stat(struct prip_priv *q , __u32 stat); -// extern void set_master_stat(struct prip_priv *q , __u32 stat); -// extern __u32 get_master_or_slave(int flag); -// extern void master_send_inc(struct prip_priv *q); -// extern void master_recv_inc(struct prip_priv *q); -// extern void slave_send_inc(struct prip_priv *q); -// extern void slave_recv_inc(struct prip_priv *q); -// extern int get_prip_alarm(void); -// extern void prip_priv_put(struct prip_priv *q); -// extern void prip_priv_timeout(struct timer_list *t); -// extern struct prip_priv *prip_priv_find(__u32 localip, __u32 peerip); -// extern struct prip_priv *prip_priv_only_find(__u32 localip, __u32 peerip); -// extern PRIP_CONFIG_T prip_config; -// extern bool prip_isinited; -// extern atomic_t prip_alarm; -// extern struct proc_dir_entry *dir_prip; -// extern struct proc_dir_entry *prip_config_entry; -// extern struct proc_dir_entry *prip_status_entry; -// extern struct proc_dir_entry *prip_alarm_entry; - -// extern struct prip_hash_list prip_hash[PRIP_HASHSZ]; -// extern struct prip_hash_list prip_single_list; -// extern int prip_check(u16 seq, int isdup, struct prip_priv *priv, unsigned long start); -// extern u16 get_pripid(struct prip_priv *priv, unsigned long *snd_start); -// extern int check_prip_net(__u32 addr); - #endif diff --git a/code/anolisos-8.6/linux-4.19.91/net/prip/prip.c b/code/anolisos-8.6/linux-4.19.91/net/prip/prip.c index efe670dd8615a2733bb9985e37f3022b199daf57..b69f067c086e69413a024ed8feaf916f1b8dff00 100644 --- a/code/anolisos-8.6/linux-4.19.91/net/prip/prip.c +++ b/code/anolisos-8.6/linux-4.19.91/net/prip/prip.c @@ -37,8 +37,6 @@ #include #include #include -//#include -//#include #include #define BUFF_SIZE 1024 @@ -48,11 +46,7 @@ struct prip_hash_list prip_hash[PRIP_HASHSZ]; atomic_t prip_cache_timeout; atomic_t prip_netmask; EXPORT_SYMBOL(prip_netmask); - struct proc_dir_entry * dir_prip; - struct proc_dir_entry * prip_config_entry; - struct proc_dir_entry * prip_status_entry; - struct proc_dir_entry * prip_alarm_entry; - struct proc_dir_entry * prip_cache_timeout_entry; + static char config_buff[BUFF_SIZE]; static u32 jhash_prip_initval __read_mostly; unsigned long prip_reboot; @@ -270,6 +264,251 @@ static struct prip_priv * prip_priv_create(__u32 localip,__u32 peerip,int hash){ } +* + * + *localip and peerip :net byte order + * + */ +struct prip_priv * prip_priv_find(__u32 localip, __u32 peerip){ + int hash; + struct prip_priv * q; + hash=prip_hashfn(localip,peerip); + read_lock_bh(&prip_hash[hash].rwlock); + hlist_for_each_entry(q,&prip_hash[hash].head,hash_list){ + if((q->peerip == peerip) && (q->localip == localip)){ + atomic_inc(&q->refcnt); + spin_lock(&q->timer_lock); + mod_timer_pending(&q->timer,jiffies+atomic_read(&prip_cache_timeout)*60*HZ); + spin_unlock(&q->timer_lock); + read_unlock_bh(&prip_hash[hash].rwlock); + return q; + } + } + read_unlock_bh(&prip_hash[hash].rwlock); + return prip_priv_create(localip,peerip,hash); +} +EXPORT_SYMBOL(prip_priv_find); +struct prip_priv * prip_priv_only_find(__u32 localip, __u32 peerip){ + int hash; + struct prip_priv * q; + hash=prip_hashfn(localip,peerip); + read_lock_bh(&prip_hash[hash].rwlock); + hlist_for_each_entry(q,&prip_hash[hash].head,hash_list){ + if((q->peerip == peerip) && (q->localip == localip)){ + atomic_inc(&q->refcnt); + spin_lock(&q->timer_lock); + mod_timer_pending(&q->timer,jiffies+atomic_read(&prip_cache_timeout)*60*HZ); + spin_unlock(&q->timer_lock); + read_unlock_bh(&prip_hash[hash].rwlock); + return q; + } + } + read_unlock_bh(&prip_hash[hash].rwlock); + return NULL; +} +EXPORT_SYMBOL(prip_priv_only_find); + +int set_prip_mode(struct sock * sk,int mode) +{ + struct inet_sock *inet; + if(unlikely(!sk)) + return -1; + read_lock_bh(&prip_config.rwlock); + if(prip_config.valid <= 0){ + read_unlock_bh(&prip_config.rwlock); + return -1; + } + read_unlock_bh(&prip_config.rwlock); + inet=inet_sk(sk); + if(mode){ + if(inet->inet_rcv_saddr && !ipv4_is_multicast(inet->inet_rcv_saddr)){ + write_lock_bh(&prip_config.rwlock); + if((ntohl(inet->inet_rcv_saddr) & prip_config.mask)!=prip_config.net_one){ + if((ntohl(inet->inet_rcv_saddr) & prip_config.mask)!=prip_config.net_two){ + write_unlock_bh(&prip_config.rwlock); + return -1; + } + } + }else{ + write_lock_bh(&prip_config.rwlock); + } + atomic_inc(&prip_config.reference); + write_unlock_bh(&prip_config.rwlock); + }else{ + write_lock_bh(&prip_config.rwlock); + if(atomic_read(&prip_config.reference)==0){ + write_unlock_bh(&prip_config.rwlock); + return -1; + } + atomic_dec(&prip_config.reference); +#ifdef CONFIG_PRIP + if(sk->priv){ + prip_priv_put(sk->priv); + sk->priv=NULL; + } +#endif + write_unlock_bh(&prip_config.rwlock); + } + return 0; +} +EXPORT_SYMBOL(set_prip_mode); +/* + *@flag : 1: get master network + * 0: get slave network + * + * retrun: master or slave network.(net byte order). + * if prip_config.reference==0 or prip_config.master==0,return 0. + * */ + __u32 get_master_or_slave(int flag){ + __u32 d_addr=0; + read_lock_bh(&prip_config.rwlock); + if(prip_config.valid <= 0||(atomic_read(&prip_config.reference)<=0)){ + read_unlock_bh(&prip_config.rwlock); + return 0; + }else{ + if(atomic_read(&prip_config.reference) > 0){ + if(flag){ + if(prip_config.net_one_flag){ + d_addr=prip_config.net_one; + read_unlock_bh(&prip_config.rwlock); + return htonl(d_addr); + }else{ + d_addr=prip_config.net_two; + read_unlock_bh(&prip_config.rwlock); + return htonl(d_addr); + } + }else{ + if(prip_config.net_one_flag){ + d_addr=prip_config.net_two; + read_unlock_bh(&prip_config.rwlock); + return htonl(d_addr); + }else{ + d_addr=prip_config.net_one; + read_unlock_bh(&prip_config.rwlock); + return htonl(d_addr); + } + } + } + } + read_unlock_bh(&prip_config.rwlock); + return htonl(d_addr); + +} +EXPORT_SYMBOL(get_master_or_slave); +/* + *saddr is net byte order ip. + *flag :1:master to slave. 0 :slave to master. + * the return value: + * 0 :ip unmatched or prip_config not set. + * >0: slave ip(net byte order). + * */ +//unsigned int master_to_slave(unsigned int master_ip){ +static __u32 __ip_addr_trans(__u32 s_addr){ + __u32 d_addr=0; + __u32 tmp_ip= 0; + + if(ipv4_is_multicast(s_addr)) + return s_addr; + + tmp_ip= ntohl(s_addr); + read_lock_bh(&prip_config.rwlock); + if(prip_config.valid <= 0){ + read_unlock_bh(&prip_config.rwlock); + return 0; + }else{ + if((tmp_ip & prip_config.mask)==prip_config.net_one){ + d_addr = prip_config.net_two | (tmp_ip & (~prip_config.mask)); + read_unlock_bh(&prip_config.rwlock); + return htonl(d_addr); + } + else if((tmp_ip & prip_config.mask)==prip_config.net_two) + { + d_addr = prip_config.net_one | (tmp_ip & (~prip_config.mask)); + read_unlock_bh(&prip_config.rwlock); + return htonl(d_addr); + }else{ + read_unlock_bh(&prip_config.rwlock); + return 0; + } + } +} +/* + *master_ip is net byte order + * the return value: + * 0 :ip unmatched or prip_config not set. + * >0: slave ip(net byte order). + * */ +__u32 master_to_slave(__u32 master_ip){ + return __ip_addr_trans(master_ip); +} +EXPORT_SYMBOL(master_to_slave); +/* + * slave_ip is net byte order + * the return value: + * 0 :ip unmatched or prip_config not set. + * >0: master ip(net byte order). + * */ +__u32 slave_to_master(__u32 slave_ip){ + return __ip_addr_trans(slave_ip); +} +EXPORT_SYMBOL(slave_to_master); +/* + *stat : 1 to up ;0 to down + * */ +void set_master_stat(struct prip_priv *q,__u32 stat){ + if(stat > 0) + atomic_set(&q->master_status,1); + else + atomic_set(&q->master_status,0); +} +EXPORT_SYMBOL(set_master_stat); +/* + *stat : 1 to up ;0 to down + * */ +void set_slave_stat(struct prip_priv *q,__u32 stat){ + if(stat > 0) + atomic_set(&q->slave_status,1); + else + atomic_set(&q->slave_status,0); +} +EXPORT_SYMBOL(set_slave_stat); +void master_send_inc(struct prip_priv *q){ + atomic64_inc(&q->master_send_num); + if(atomic64_read(&q->master_send_num)==0){ + atomic64_set(&q->master_recv_num,0); + atomic64_set(&q->slave_send_num,0); + atomic64_set(&q->slave_recv_num,0); + } +} +EXPORT_SYMBOL(master_send_inc); +void master_recv_inc(struct prip_priv *q){ + atomic64_inc(&q->master_recv_num); + if(atomic64_read(&q->master_recv_num)==0){ + atomic64_set(&q->master_send_num,0); + atomic64_set(&q->slave_send_num,0); + atomic64_set(&q->slave_recv_num,0); + } +} +EXPORT_SYMBOL(master_recv_inc); +void slave_send_inc(struct prip_priv *q){ + atomic64_inc(&q->slave_send_num); + if(atomic64_read(&q->slave_send_num)==0){ + atomic64_set(&q->master_send_num,0); + atomic64_set(&q->master_recv_num,0); + atomic64_set(&q->slave_recv_num,0); + } +} +EXPORT_SYMBOL(slave_send_inc); +void slave_recv_inc(struct prip_priv *q){ + atomic64_inc(&q->slave_recv_num); + if(atomic64_read(&q->slave_recv_num)==0){ + atomic64_set(&q->master_send_num,0); + atomic64_set(&q->slave_send_num,0); + atomic64_set(&q->master_recv_num,0); + } +} +EXPORT_SYMBOL(slave_recv_inc); + static int __init init_prip(void) { int err;