components/openvswitch/files/lib/util-solaris.c
changeset 7237 c378a893371d
parent 7000 22f549e6467a
child 7590 5461fab14904
equal deleted inserted replaced
7234:e1658d1c9c59 7237:c378a893371d
  3662 	for (i = 0; i < anamecnt; i++)
  3662 	for (i = 0; i < anamecnt; i++)
  3663 		adr_name_rele(anamearr[i]);
  3663 		adr_name_rele(anamearr[i]);
  3664 	free(anamearr);
  3664 	free(anamearr);
  3665 }
  3665 }
  3666 
  3666 
  3667 uint64_t
  3667 void
  3668 solaris_flow_walk(void *arg, struct ofpbuf *action, boolean_t no_default,
  3668 solaris_flow_walk(void *arg, struct ofpbuf *action,
  3669     void (*fn)(void *, const char *, boolean_t, struct flow *, struct flow *,
  3669     void (*fn)(void *, const char *, struct flow *, struct flow *,
  3670     struct ofpbuf *, uint64_t, uint64_t, uint64_t))
  3670     struct ofpbuf *, uint64_t, uint64_t, uint64_t))
  3671 {
  3671 {
  3672 	adr_name_t	**anamearr = NULL;
  3672 	adr_name_t	**anamearr = NULL;
  3673 	int		anamecnt = 0, i;
  3673 	int		anamecnt = 0, i;
  3674 	rc_err_t	rerr;
  3674 	rc_err_t	rerr;
  3675 	int		err = 0;
  3675 	int		err = 0;
  3676 	uint64_t	n_flows = 0;
       
  3677 
  3676 
  3678 	rerr = dlmgr_Flow__rad_list(rad_conn, B_FALSE, NS_GLOB, &anamearr,
  3677 	rerr = dlmgr_Flow__rad_list(rad_conn, B_FALSE, NS_GLOB, &anamearr,
  3679 	    &anamecnt, 0);
  3678 	    &anamecnt, 0);
  3680 	if (rerr != RCE_OK)
  3679 	if (rerr != RCE_OK)
  3681 		return (0);
  3680 		return;
  3682 
  3681 
  3683 	if (anamecnt == 0) {
  3682 	if (anamecnt == 0) {
  3684 		free(anamearr);
  3683 		free(anamearr);
  3685 		return (0);
  3684 		return;
  3686 	}
  3685 	}
  3687 
  3686 
  3688 	for (i = 0; i < anamecnt; i++) {
  3687 	for (i = 0; i < anamecnt; i++) {
  3689 		dlmgr__rad_dict_string_DLValue_t *flowinfo;
  3688 		dlmgr__rad_dict_string_DLValue_t *flowinfo;
  3690 		char			linkname[MAXLINKNAMELEN];
  3689 		char			linkname[MAXLINKNAMELEN];
  3694 		const char		*props[1];
  3693 		const char		*props[1];
  3695 		const char		*fields[1];
  3694 		const char		*fields[1];
  3696 		struct flow		f, m;
  3695 		struct flow		f, m;
  3697 		int			ndlist = 0;
  3696 		int			ndlist = 0;
  3698 		uint64_t		npackets, nbytes, lastused;
  3697 		uint64_t		npackets, nbytes, lastused;
  3699 		boolean_t		is_default;
       
  3700 		dlmgr_DatalinkError_t	*derrp = NULL;
  3698 		dlmgr_DatalinkError_t	*derrp = NULL;
  3701 
  3699 
  3702 		flowinfo = NULL;
  3700 		flowinfo = NULL;
  3703 		dlist = NULL;
  3701 		dlist = NULL;
  3704 		dlval = NULL;
  3702 		dlval = NULL;
  3705 		is_default = B_FALSE;
       
  3706 		if (strstr(adr_name_key(anamearr[i], "name"), "defflow") !=
  3703 		if (strstr(adr_name_key(anamearr[i], "name"), "defflow") !=
  3707 		    NULL) {
  3704 		    NULL) {
  3708 			if (no_default)
  3705 			continue;
  3709 				continue;
       
  3710 			else
       
  3711 				is_default = B_TRUE;
       
  3712 		} else if (strstr(adr_name_key(anamearr[i], "name"),
  3706 		} else if (strstr(adr_name_key(anamearr[i], "name"),
  3713 		    "sys.of") == NULL) {
  3707 		    "sys.of") == NULL) {
  3714 			continue;
  3708 			continue;
  3715 		}
  3709 		}
  3716 
  3710 
  3790 			    "failed for %s: %d", adr_name_key(anamearr[i],
  3784 			    "failed for %s: %d", adr_name_key(anamearr[i],
  3791 			    "name"), err);
  3785 			    "name"), err);
  3792 			goto done;
  3786 			goto done;
  3793 		}
  3787 		}
  3794 
  3788 
  3795 		if (action != NULL) {
  3789 		err = solaris_flowinfo2action(flowinfo, action);
  3796 			err = solaris_flowinfo2action(flowinfo, action);
  3790 		if (err != 0) {
  3797 			if (err != 0) {
  3791 			dpif_log(err, "solaris_flow_walk "
  3798 				dpif_log(err, "solaris_flow_walk "
  3792 			    "flowinfo2action failed for %s: %d",
  3799 				    "flowinfo2action failed for %s: %d",
  3793 			    adr_name_key(anamearr[i], "name"), err);
  3800 				    adr_name_key(anamearr[i], "name"), err);
  3794 			goto done;
  3801 				goto done;
  3795 		}
  3802 			}
  3796 
  3803 		}
  3797 		fn(arg, adr_name_key(anamearr[i], "name"), &f, &m, action,
  3804 
  3798 		    npackets, nbytes, lastused);
  3805 		if (fn != NULL) {
       
  3806 			fn(arg, adr_name_key(anamearr[i], "name"), is_default,
       
  3807 			    &f, &m, action, npackets, nbytes, lastused);
       
  3808 		}
       
  3809 		n_flows++;
       
  3810 done:
  3799 done:
  3811 		dlmgr__rad_dict_string_DLValue_free(flowinfo);
  3800 		dlmgr__rad_dict_string_DLValue_free(flowinfo);
  3812 		dlmgr_DLValue_free(dlval);
  3801 		dlmgr_DLValue_free(dlval);
  3813 		dlmgr_DLDict_array_free(dlist, ndlist);
  3802 		dlmgr_DLDict_array_free(dlist, ndlist);
  3814 	}
  3803 	}
  3815 
  3804 
  3816 	for (i = 0; i < anamecnt; i++)
  3805 	for (i = 0; i < anamecnt; i++)
  3817 		adr_name_rele(anamearr[i]);
  3806 		adr_name_rele(anamearr[i]);
  3818 	free(anamearr);
  3807 	free(anamearr);
  3819 
       
  3820 	return (n_flows);
       
  3821 }
  3808 }
  3822 
  3809 
  3823 int
  3810 int
  3824 solaris_dladm_status2error(dladm_status_t status)
  3811 solaris_dladm_status2error(dladm_status_t status)
  3825 {
  3812 {