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 34d3a00c4121711cee39c58f1f2cb0bc1959596b..72bdf741187907f064f07422e5ce1e8e234e04c4 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 @@ -48,6 +48,7 @@ struct prip_hash_list prip_hash[PRIP_HASHSZ]; EXPORT_SYMBOL(prip_netmask); struct proc_dir_entry * dir_prip; struct proc_dir_entry * prip_config_entry; + struct proc_dir_entry *prip_status_entry; static char config_buff[BUFF_SIZE]; static u32 jhash_prip_initval __read_mostly; unsigned long prip_reboot; @@ -193,6 +194,102 @@ static int inet_ntoa(char *buff,__u32 ip){ return 1; } +static void * prip_status_seq_start (struct seq_file * fd,loff_t * pos){ + + if(*pos==0) + return &prip_single_list; + else + return NULL; +} +static void * prip_status_seq_next (struct seq_file * fd ,void * v,loff_t *pos){ + + (*pos)++; + return NULL; +} +static void prip_status_seq_stop (struct seq_file * fd ,void *v){ + + return; +} +static int prip_status_seq_show (struct seq_file *fd,void *v){ + int on=0; + char m_stat[6]; + char s_stat[6]; + int m_stat_flag=0; + int s_stat_flag=0; + unsigned int m_net=0; + unsigned int s_net=0; + char master_net[16]; + char slave_net[16]; + char local_net[16]; + struct prip_priv * q; + struct prip_hash_list * tmp = (struct prip_hash_list *)v; + + read_lock_bh(&prip_config.rwlock); + if(prip_config.valid <= 0){ + read_unlock_bh(&prip_config.rwlock); + return 0; + }else{ + if(atomic_read(&prip_config.reference)>0){ + on=1; + m_net=prip_config.net_one; + s_net=prip_config.net_two; + } + } + read_unlock_bh(&prip_config.rwlock); + if(!on){ + seq_printf(fd,"PRIP_ON/OFF \n"); + seq_printf(fd,"%8s\n","off"); + }else{ + inet_ntoa(master_net,m_net); + inet_ntoa(slave_net,s_net); + seq_printf(fd,"PRIP_ON/OFF \tPRIP_NET_ONE\tPRIP_NET_TWO\tPRIP_REFCNT \n"); + seq_printf(fd,"%8s \t%8s \t%8s \t%8u\n\n","on",master_net,slave_net,atomic_read(&prip_config.reference)); + } + + seq_printf(fd,"local_ip \trefcnt\tpeer_master_ip\tpeer_slave_ip\tmaster_state\tslave_state\tmaster_sent\tslave_sent\tmaster_recv\tslave_recv\t\n"); + read_lock_bh(&tmp->rwlock); + hlist_for_each_entry(q,&tmp->head,single_list){ + m_stat_flag=atomic_read(&q->master_status); + s_stat_flag=atomic_read(&q->slave_status); + if(m_stat_flag) + strcpy(m_stat,"up"); + else + strcpy(m_stat,"down"); + if(s_stat_flag) + strcpy(s_stat,"up"); + else + strcpy(s_stat,"down"); + inet_ntoa(master_net,ntohl(q->peerip)); + inet_ntoa(slave_net,ntohl(q->peer_slave_ip)); + inet_ntoa(local_net,ntohl(q->localip)); + + seq_printf(fd,"%8s\t%d \t%8s \t%8s \t%8s \t%8s \t%8lld \t%8lld \t%8lld \t%8lld \n", + local_net,atomic_read(&q->refcnt),master_net,slave_net,m_stat,s_stat,atomic64_read(&q->master_send_num),atomic64_read(&q->slave_send_num), + atomic64_read(&q->master_recv_num), + atomic64_read(&q->slave_recv_num)); + } + read_unlock_bh(&tmp->rwlock); + return 0; +} + +static struct seq_operations prip_status_seq_ops = { + .start = prip_status_seq_start, + .stop = prip_status_seq_stop, + .next = prip_status_seq_next, + .show = prip_status_seq_show, +}; + +static int prip_status_open (struct inode * inode, struct file *file){ + return seq_open(file,&prip_status_seq_ops); +} + +static struct file_operations prip_status_ops = { + .owner = THIS_MODULE, + .open = prip_status_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; void prip_priv_put(struct prip_priv *q){ atomic_dec(&q->refcnt); @@ -699,16 +796,26 @@ static int __init init_prip(void) goto err_2; } + prip_status_entry = proc_create("prip_state",S_IRUGO,dir_prip, &prip_status_ops); + if(!prip_status_entry){ + printk("PRIP ERROR: Cannot create /proc/prip/prip_state .\n"); + err = -1; + goto err_3; + } printk("PRIP modules insmod success.\n"); return 0; + + remove_proc_entry("prip_state",dir_prip); +err_3: + remove_proc_entry("prip_config",dir_prip); err_2: remove_proc_entry("prip",NULL); err_1: - return err; } static void __exit exit_prip(void){ + remove_proc_entry("prip_state",dir_prip); remove_proc_entry("prip_config",dir_prip); remove_proc_entry("prip",NULL); return;