Unverified Commit 49152898 authored by Mike Roy's avatar Mike Roy Committed by GitHub
Browse files

Merge pull request #19 from idcc-dev/sp_sprint22_sidecar

performance improvements for tc sidecar rules application
parents 5909f4b3 48445ee0
Loading
Loading
Loading
Loading
+54 −56
Original line number Diff line number Diff line
@@ -81,6 +81,7 @@ var filters = map[string]string{}

var measurementsRunning = false
var flushRequired = false
var firstTimePass = true

// Run - MEEP Sidecar execution
func main() {
@@ -185,16 +186,15 @@ func processLbMsg(payload string) {

func refreshNetCharRules() {
	// Create shape rules
	_ = createIfbs()
	_ = initializeOnFirstPass()

	// Flush filters
	flushFilters()
	_ = createIfbs()

	// Create new filters (lower priority than the old one)
	_ = createFilters()

	// // Delete unused filters
	// deleteUnusedFilters()
	deleteUnusedFilters()

	// Delete unused ifbs
	deleteUnusedIfbs()
@@ -542,6 +542,7 @@ func createIfbsHandler(key string, fields map[string]string, userData interface{
	return nil
}

/*
func flushFilters() {

	// NOTE: Flush does not work on kernel version 4.4
@@ -558,7 +559,7 @@ func flushFilters() {
	}
	filters = map[string]string{}
}

*/
func createFilters() error {
	keyName := moduleTcEngine + ":" + typeNet + ":" + podName + ":filter*"
	err := DBForEachEntry(keyName, createFiltersHandler, nil)
@@ -571,21 +572,15 @@ func createFilters() error {
func createFiltersHandler(key string, fields map[string]string, userData interface{}) error {
	ifbNumber := fields["ifb_uniqueId"]

	// if filters[ifbNumber] == "" {
	if filters[ifbNumber] == "" {
		ipSrc := fields["srcIp"]
		ipSvcSrc := fields["srcSvcIp"]
		srcName := fields["srcName"]

	err := cmdCreateFilter(ifbNumber, ipSrc)
	if err != nil {
		return err
	}
		cmdCreateFilter(ifbNumber, ipSrc)

		if ipSvcSrc != "" {
		err := cmdCreateFilter(ifbNumber, ipSvcSrc)
		if err != nil {
			return err
		}
			cmdCreateFilter(ifbNumber, ipSvcSrc)
		}

		filters[ifbNumber] = ifbNumber
@@ -599,23 +594,22 @@ func createFiltersHandler(key string, fields map[string]string, userData interfa
				break
			}
		}
	// }
	}

	return nil
}

// func deleteUnusedFilters() error {
// 	for index, ifbNumber := range filters {
// 		keyName := moduleTcEngine + ":" + typeNet + ":" + podName + ":filter:" + ifbNumber
// 		if DBEntryExists(keyName) == false {
// 			log.Debug("filter removed: ", ifbNumber)
// 			// Remove old filter
// 			cmdDeleteFilter(ifbNumber)
// 			delete(filters, index)
// 		}
// 	}
// 	return nil
// }
func deleteUnusedFilters() {
	for index, ifbNumber := range filters {
		keyName := moduleTcEngine + ":" + typeNet + ":" + podName + ":filter:" + ifbNumber
		if !DBEntryExists(keyName) {
			log.Debug("filter removed: ", ifbNumber)
			// Remove old filter
			_ = cmdDeleteFilter(ifbNumber)
			delete(filters, index)
		}
	}
}

func deleteUnusedIfbs() {
	for index, ifbNumber := range ifbs {
@@ -650,14 +644,10 @@ func cmdExec(cli string) (string, error) {

func cmdCreateIfb(shape map[string]string) error {
	ifbNumber := shape["ifb_uniqueId"]
	_, err := cmdExec("tc qdisc replace dev eth0 root handle 1: netem")
	if err != nil {
		return err
	}

	//"ip link add $ifb$ifbnumber type ifb"
	str := "ip link add ifb" + ifbNumber + " type ifb"
	_, err = cmdExec(str)
	_, err := cmdExec(str)
	if err != nil {
		log.Info("ERROR ifb" + ifbNumber + " already exist in sidecar")
		return err
@@ -746,17 +736,26 @@ func cmdDeleteFilter(ifbNumber string) error {
	return nil
}

func cmdCreateFilter(ifbNumber string, ipSrc string) error {
func initializeOnFirstPass() error {

	if firstTimePass {
		_, err := cmdExec("tc qdisc replace dev eth0 root handle 1: netem")
		if err != nil {
			log.Info("Error: ", err)
			return err
		}

		_, err = cmdExec("tc qdisc replace dev eth0 handle ffff: ingress")
		if err != nil {
			log.Info("Error: ", err)
			return err
		}
		firstTimePass = false
	}
	return nil
}

func cmdCreateFilter(ifbNumber string, ipSrc string) {

	//"tc filter add dev eth0 parent ffff: protocol ip prio $ifbNumber u32 match ip src $ipsrc match u32 0 0 action mirred egress redirect dev $ifb$ifbnumber"
	str := "tc filter add dev eth0 parent ffff: protocol ip prio " + ifbNumber + " u32 match ip src " + ipSrc + " match u32 0 0 action mirred egress redirect dev ifb" + ifbNumber
@@ -764,12 +763,11 @@ func cmdCreateFilter(ifbNumber string, ipSrc string) error {
	//fonction must be a replace... a replace Adds if not there or replace if existing
	//"tc filter replace dev eth0 parent ffff: protocol ip prio $ifbNumber u32 match ip src $ipsrc match u32 0 0 action mirred egress redirect dev $ifb$ifbnumber"
	//str := "tc filter replace dev eth0 parent ffff: protocol ip prio " + ifbNumber + " handle 800::800 u32 match u32 0 0 action mirred egress redirect dev ifb" + ifbNumber
	_, err = cmdExec(str)
	_, err := cmdExec(str)
	if err != nil {
		return err
		log.Info("Error: ", err)
		return
	}

	return nil
}

func randSeq(n int) string {