From 1dcc3ed5ca075d0ebe53d2ffe565e6ea6badcc1b Mon Sep 17 00:00:00 2001 From: qzhanglinxinfocom Date: Thu, 27 Oct 2022 19:15:31 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=9C=A8/proc/prip=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E4=B8=AD=E5=A2=9E=E5=8A=A0prip=5Fstat=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E7=94=A8=E4=BA=8E=E6=9F=A5=E7=9C=8Bprip=E8=BD=AF?= =?UTF-8?q?=E4=BB=B6=E7=8A=B6=E6=80=81=E4=BB=A5=E5=8F=8Aprip=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E7=9A=84=E4=BF=A1=E6=81=AF=202.=20=E5=A2=9E=E5=8A=A0p?= =?UTF-8?q?rip=5Fstat=E6=93=8D=E4=BD=9C=E5=87=BD=E6=95=B0=EF=BC=8C?= =?UTF-8?q?=E5=8C=85=E6=8B=AC=E6=9F=A5=E7=9C=8B=E5=92=8C=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?prip=5Fstat=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../linux-4.19.91/net/prip/prip.c | 109 +++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-) 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 34d3a00c4..72bdf7411 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; -- Gitee