Index: /branches/rel_avx_2_7_5/src/library/avxnet/avx_sriov.c
===================================================================
--- /branches/rel_avx_2_7_5/src/library/avxnet/avx_sriov.c	(revision 9193)
+++ /branches/rel_avx_2_7_5/src/library/avxnet/avx_sriov.c	(working copy)
@@ -30,6 +30,7 @@
 #define FUNC_OFF 0
 #define FUNC_ON 1
 #define I40E_KEY "i40e"
+#define PROMISC_CONFIG_BUFLEN 8192
 
 int avx_system_with_output(char *cmd, char *buf, int buf_len){
     FILE *fp = NULL;
@@ -203,7 +204,7 @@
         
         if(k == p_cnt || show_all){
             snprintf(port_str, sizeof(port_str), "port%d", k);
-            if(!is_i40e_port(port_str)){
+            if(port_list[i].driver != I40E){
                 k++;
                 continue;
             }
@@ -265,20 +266,6 @@
     return 0;
 }
 
-char *write_promisc_config(){
-    int len = 0;
-    char *buf = (char *)malloc(8192);
-    if(buf){
-        memset(buf, 0, 8192);
-        len = promisc_show_vf_func("all", "trust", buf, 8192);
-        promisc_show_vf_func("all", "vf", buf + len, 8192 - len);
-        
-    }
-
-    return buf;
-}
-
-
 int promisc_clear_vf_trust(){
     int len = 0, i = 0, j = 0;
     struct va_port* port_list = NULL;
@@ -765,5 +752,99 @@
     return 0;    
 }
 
+int get_promisc_config(char *prtbuf, int buf_len){
+    int i = 0, j = 0, k = 1;
+    int tmp_len_vf = 0;
+    int len = 0;
+    int tmp_len = 0;
+    struct va_port *port_list = NULL;
+    struct pci_root_port *rpt = NULL;
+    char exe_cmd[1024] = {0};
+    char outbuf[1024] = {0};
+    char *start_trust = NULL;
+    char *end_trust = NULL;
+    char *start_vf = NULL;
+    char *end_vf = NULL;
+    char port_str[16] = {0};
+    char prtbuf_vf[4196] = {0};
+    int trust_len = sizeof("trust") - 1;
+    int vf_len = sizeof("vf") -1 ;
+    if(prtbuf == NULL || buf_len <= 0){
+        return -1;
+    }
+    rpt = avxpci_module_init();
+    if(rpt == NULL) {
+	return -1;
+    }
+    port_list = get_va_port(rpt, &len);
+
+    for(i = 0; i < len; i++){
+        if(port_list[i].type != VPT_PORT){
+            continue;
+        }
+
+        snprintf(port_str, sizeof(port_str), "port%d", k);
+        if(port_list[i].driver != I40E){
+	    k++;
+	    continue;
+        }
+        memset(outbuf, 0, sizeof(outbuf));
+        sprintf(exe_cmd, "cat /sys/kernel/debug/i40e/0000:%02x:%02x.%x/command", port_list[i].bus, port_list[i].dev, port_list[i].func);
+        if(avx_system_with_output(exe_cmd, outbuf, sizeof(outbuf)) < 0){
+                syslog(LOG_ERR,"avx_system_with_output:%s error\n", exe_cmd);
+                printf("Internal error.\n");
+                goto cleanup;
+        }
+
+        /* output format enp3s0f0: ;trust:01000000;vf:00000000; */
+        start_trust = strstr(outbuf, "trust");
+        start_vf = strstr(outbuf, "vf");
+	if(start_trust == NULL || start_vf == NULL){
+             syslog(LOG_ERR,"avx_system_with_output:%s error output %s\n", exe_cmd, outbuf);
+             printf("Internal error.\n");
+             goto cleanup;
+        }
+        end_trust = strstr(start_trust, ";");
+        end_vf = strstr(start_vf, ";");
+        if(end_trust == NULL || end_vf == NULL){
+             syslog(LOG_ERR,"avx_system_with_output:%s error output %s\n", exe_cmd, outbuf);
+             printf("Internal error.\n");
+             goto cleanup;
+        }
+        for(j = 0; j < end_trust - start_trust - trust_len - 1; j ++){
+             if(start_trust[trust_len + j + 1] == '1'){
+                 tmp_len += snprintf(prtbuf + tmp_len, buf_len - tmp_len, "promisc trust port%d %d\n", k, j + 1);
+                 if(tmp_len >= buf_len) {
+                       break;
+                  }
+             }
+        }
+        for(j = 0; j < end_vf - start_vf - vf_len - 1; j ++){
+             if(start_vf[vf_len + j + 1] == '1'){
+                 tmp_len_vf += snprintf(prtbuf_vf + tmp_len_vf, sizeof(prtbuf_vf) - tmp_len_vf, "promisc vf port%d %d\n", k, j + 1);
+                    if(tmp_len_vf >= sizeof(prtbuf_vf)) {
+                         break;
+                    }
+              }
+        }
+      k++;
+    }
+    tmp_len += snprintf(prtbuf + tmp_len, buf_len - tmp_len, "%s", prtbuf_vf);
+cleanup:
+    free_va_port(port_list, len);
+    if (rpt) {
+	avxpci_module_exit(rpt);
+    }
+    return tmp_len;
+}
+
 
+char *write_promisc_config() {
+    char *buf = (char *)malloc(PROMISC_CONFIG_BUFLEN);
+    if(buf){
+        memset(buf, 0, PROMISC_CONFIG_BUFLEN);
+        get_promisc_config(buf, PROMISC_CONFIG_BUFLEN);
+    }
+    return buf;
+}
 
