Skip to content

Commit

Permalink
closes #4 and #1. Revert Key to (src,dst) only.
Browse files Browse the repository at this point in the history
Reverts keys to src and dst only. By using a 32-bit register for each, instead of a 64-bit for both, solves the problem with reading values from the controller.

This commit includes some variable renaming to allow for a more intuitive read.
  • Loading branch information
gon1995matos committed Mar 4, 2021
1 parent da7a7b7 commit 72bf1b9
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 117 deletions.
56 changes: 22 additions & 34 deletions p4/controller/controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,21 +59,21 @@ def decode_registers(self):

def read_registers(self):
self.registers = []
self.registers.append(self.controller.register_read("sketch_flag")) #0
self.registers.append(self.controller.register_read("sketch_key0")) #1 src and dst ips
self.registers.append(self.controller.register_read("sketch_key1")) #2 sport, dport and proto
self.registers.append(self.controller.register_read("sketch_flag")) #0 flag
self.registers.append(self.controller.register_read("srcAddr")) #1 src ips
self.registers.append(self.controller.register_read("dstAddr")) #2 dst ips
if (self.registers[0][0] == 0): #choose error sketch
self.registers.append(self.controller.register_read("error_sketch1")) #3 error sketch
self.registers.append(self.controller.register_read("error_sketch_f1")) #3 error sketch
else:
self.registers.append(self.controller.register_read("error_sketch0")) #3 error sketch
self.registers.append(self.controller.register_read("error_sketch_f0")) #3 error sketch


def detect_change(self,depth):
splited = []
epoch = len(self.registers[3])/depth
for i in range(0,depth):
splited.append(self.registers[3][i*epoch:((i+1)*epoch)-1])
return splited, [self.registers[1],self.registers[2]]
return splited, self.registers[1], self.registers[2]

if __name__ == "__main__":
import argparse
Expand All @@ -92,44 +92,32 @@ def detect_change(self,depth):
if args.option == "detect":
while(True):
controller.decode_registers()
error, raw_keys = controller.detect_change(args.depth)
error, raw_src, raw_dst = controller.detect_change(args.depth)
error_sketch = KAry_Sketch(len(error),len(error[0]))
error_sketch.sketch = error
print(". Sketch Flag: " + str(controller.registers[0][0]))
print(". Error Sketch:")
error_sketch.SHOW()
print(".")

str_keys0 = []
for key in raw_keys[0]:
if key > 0:
strkey = []
numKey = []
binkey = "{0:64b}".format(key).replace(" ","0")
strkey.append(str(int(binkey[32:40],2))+"."+str(int(binkey[40:48],2))+"."+str(int(binkey[48:56],2))+"."+str(int(binkey[56:64],2)-1)) #get src ip
strkey.append(str(int(binkey[0:8],2))+"."+str(int(binkey[8:16],2))+"."+str(int(binkey[16:24],2))+"."+str(int(binkey[24:32],2)+1)) #get dst ip

str_keys0.append(strkey)
str_src = []
for src in raw_src:
if src > 0:
binsrc = "{:032b}".format(src)
str_src.append(str(int(binsrc[0:8],2))+"."+str(int(binsrc[8:16],2))+"."+str(int(binsrc[16:24],2))+"."+str(int(binsrc[24:32],2))) #get dst ip
else:
str_keys0.append(["None"])

str_keys1 = []
for key in raw_keys[1]:
if key > 0:
binkey = "{0:b}".format(key)
strkey = []
strkey.append(str(int(binkey[-16:],2)-1)) #get the src port
strkey.append(str(int(binkey[-32:-16],2))) #get the dst port
strkey.append(str(int(binkey[-40:-32],2)+1)) #get protocol

str_keys1.append(strkey)
str_src.append(["0"])

str_dst = []
for dst in raw_dst:
if dst > 0:
bindst = "{:032b}".format(dst)
str_dst.append(str(int(bindst[0:8],2))+"."+str(int(bindst[8:16],2))+"."+str(int(bindst[16:24],2))+"."+str(int(bindst[24:32],2))) #get dst ip
else:
str_keys1.append(["None"])
str_dst.append(["0"])

keys = []
for i in range(0,len(raw_keys[0])):
keys.append(str_keys0[i] + str_keys1[i])
print("Key " + str(i) + ": " + str(str_keys0[i] + str_keys1[i]))
for i in range(0,len(str_dst)):
print("Key " + str(i) + ": " + str(str_src[i]) + "," + str(str_dst[i]))

print(".")
print(".^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.")
Expand Down
8 changes: 4 additions & 4 deletions p4/p4_src/includes/headers.p4
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ struct metadata {
bit<32> hash0;
bit<32> hash1;
bit<32> hash2;
bit<64> flowkey1;
bit<64> flowkey2;
bit<64> tempkey1;
bit<64> tempkey2;
bit<64> key;
bit<64> flowkey;
bit<32> tempsrc;
bit<32> tempdst;
int<32> tempcount;
int<32> tempsum;
bit<1> repass;
Expand Down
38 changes: 23 additions & 15 deletions p4/p4_src/includes/registers.p4
Original file line number Diff line number Diff line change
@@ -1,18 +1,26 @@
//key fields (MV SKETCH)
register<bit<64>>(SKETCH_WIDTH) sketch_key0; //src, dst
register<bit<64>>(SKETCH_WIDTH) sketch_key1; //sport, dport, proto
//*------------------------------------------------------------------*//
//*-----------------------------MV Sketch----------------------------*//
//*------------------------------------------------------------------*//

//count fields (MV SKETCH)
register<int<32>>(SKETCH_WIDTH) sketch_count; //count for the mjrty
register<bit<32>>(SKETCH_WIDTH) srcAddr; //key field: src
register<bit<32>>(SKETCH_WIDTH) dstAddr; //key_field: dst

//control-aux registers
register<bit<1>>(1) sketch_flag; // 1 bit flag for forecasting sketch selection
register<bit<32>>(SKETCH_DEPTH) extra_op_counter; // counter for extra operation
register<bit<48>>(1) epoch; //timestamps require bit<48>
register<bit<1>>(SKETCH_WIDTH*SKETCH_DEPTH) control_flag; // 1 bit flag sketch
register<int<32>>(SKETCH_WIDTH) sketch_count; //count field for the mjrty

//error and forecast sketches
register<int<32>>(SKETCH_WIDTH*SKETCH_DEPTH) forecast_sketch0;
register<int<32>>(SKETCH_WIDTH*SKETCH_DEPTH) forecast_sketch1;
register<int<32>>(SKETCH_WIDTH*SKETCH_DEPTH) error_sketch0;
register<int<32>>(SKETCH_WIDTH*SKETCH_DEPTH) error_sketch1;
//*------------------------------------------------------------------*//
//*---------------------------K-Ary Sketch---------------------------*//
//*------------------------------------------------------------------*//

register<bit<1>>(1) sketch_flag; // 1 bit flag for forecast sketch selection
register<int<32>>(SKETCH_WIDTH*SKETCH_DEPTH) forecast_sketch_f0; //forecast sketch used when the sketch flag is 0
register<int<32>>(SKETCH_WIDTH*SKETCH_DEPTH) forecast_sketch_f1; //forecast sketch used when the sketch flag is 1
register<int<32>>(SKETCH_WIDTH*SKETCH_DEPTH) error_sketch_f0; //error sketch used when the sketch flag is 0
register<int<32>>(SKETCH_WIDTH*SKETCH_DEPTH) error_sketch_f1; //error sketch used when the sketch flag is 1
register<bit<1>>(SKETCH_WIDTH*SKETCH_DEPTH) control_flag; // 1 bit control-flag sketch

//*------------------------------------------------------------------*//
//*-----------------------Application Registers----------------------*//
//*------------------------------------------------------------------*//

register<bit<48>>(1) epoch; //timestamps require bit<48>
register<bit<32>>(SKETCH_DEPTH) extra_op_counter; // counter for extra operation
118 changes: 56 additions & 62 deletions p4/p4_src/kary.p4
Original file line number Diff line number Diff line change
Expand Up @@ -33,48 +33,48 @@ void UpdateRow(int num, inout metadata meta) {
if (meta.ctrl != meta.flag) { //If equals, copy forecast_sketch
control_flag.write(meta.hash,1);

forecast_sketch0.read(meta.forecast,meta.hash);
forecast_sketch_f1.read(meta.forecast,meta.hash);

//update error
meta.new_err = 10 - meta.forecast;
error_sketch1.write(meta.hash,meta.new_err);
error_sketch_f1.write(meta.hash,meta.new_err);

//update forecast
meta.obs = 10 >> 1; //division by 2
meta.aux_forecast = meta.forecast >> 1; //division by 2

meta.new_forecast = meta.obs + meta.aux_forecast;

forecast_sketch1.write(meta.hash,meta.new_forecast);
forecast_sketch_f0.write(meta.hash,meta.new_forecast);

} else { //else, only update with observed
//update error
error_sketch1.read(meta.err,meta.hash);
error_sketch_f1.read(meta.err,meta.hash);
meta.new_err = meta.err + 10;
error_sketch1.write(meta.hash,meta.new_err);
error_sketch_f1.write(meta.hash,meta.new_err);

//update forecast
forecast_sketch1.read(meta.forecast,meta.hash);
forecast_sketch_f0.read(meta.forecast,meta.hash);
meta.obs = 10 >> 1; //division by 2
meta.new_forecast = meta.obs + meta.forecast;

forecast_sketch1.write(meta.hash,meta.new_forecast);
forecast_sketch_f0.write(meta.hash,meta.new_forecast);

//compute one extra op
extra_op_counter.read(meta.counter,num);
if (meta.counter < SKETCH_WIDTH) {
control_flag.read(meta.ctrl,meta.counter+meta.offset);
if (meta.ctrl != meta.flag) { //If diff, copy forecast_sketch
control_flag.write(meta.counter+meta.offset,1);
forecast_sketch0.read(meta.forecast,meta.counter+meta.offset);
forecast_sketch_f1.read(meta.forecast,meta.counter+meta.offset);

//update error
meta.new_err = -meta.forecast; //negative
error_sketch1.write(meta.counter+meta.offset,meta.new_err);
error_sketch_f1.write(meta.counter+meta.offset,meta.new_err);

//update forecast
meta.new_forecast = meta.forecast >> 1; //division by 2
forecast_sketch1.write(meta.counter+meta.offset,meta.new_forecast);
forecast_sketch_f0.write(meta.counter+meta.offset,meta.new_forecast);
}
extra_op_counter.write(num,meta.counter+1);
}
Expand All @@ -84,48 +84,48 @@ void UpdateRow(int num, inout metadata meta) {
if (meta.ctrl != meta.flag) { //If equals, copy forecast_sketch
control_flag.write(meta.hash,0);

forecast_sketch1.read(meta.forecast,meta.hash);
forecast_sketch_f0.read(meta.forecast,meta.hash);

//update error
meta.new_err = 10 - meta.forecast;
error_sketch0.write(meta.hash,meta.new_err);
error_sketch_f0.write(meta.hash,meta.new_err);

//update forecast
meta.obs = 10 >> 1; //division by 2
meta.aux_forecast = meta.forecast >> 1; //division by 2

meta.new_forecast = meta.obs + meta.aux_forecast;

forecast_sketch0.write(meta.hash,meta.new_forecast);
forecast_sketch_f1.write(meta.hash,meta.new_forecast);

} else { //else, only update with observed
//update error
error_sketch0.read(meta.err,meta.hash);
error_sketch_f0.read(meta.err,meta.hash);
meta.new_err = meta.err + 10;
error_sketch0.write(meta.hash,meta.new_err);
error_sketch_f0.write(meta.hash,meta.new_err);

//update forecast
forecast_sketch0.read(meta.forecast,meta.hash);
forecast_sketch_f1.read(meta.forecast,meta.hash);
meta.obs = 10 >> 1; //division by 2
meta.new_forecast = meta.obs + meta.forecast;

forecast_sketch0.write(meta.hash,meta.new_forecast);
forecast_sketch_f1.write(meta.hash,meta.new_forecast);

//compute one extra op
extra_op_counter.read(meta.counter,num);
if (meta.counter >= 0) {
control_flag.read(meta.ctrl,meta.counter+meta.offset);
if (meta.ctrl != meta.flag) { //If diff, copy forecast_sketch
control_flag.write(meta.counter+meta.offset,0);
forecast_sketch1.read(meta.forecast,meta.counter+meta.offset);
forecast_sketch_f0.read(meta.forecast,meta.counter+meta.offset);

//update error
meta.new_err = -meta.forecast; //negative
error_sketch0.write(meta.counter+meta.offset,meta.new_err);
error_sketch_f0.write(meta.counter+meta.offset,meta.new_err);

//update forecast
meta.new_forecast = meta.forecast >> 1; //division by 2
forecast_sketch0.write(meta.counter+meta.offset,meta.new_forecast);
forecast_sketch_f1.write(meta.counter+meta.offset,meta.new_forecast);
}
if (meta.counter != 0) {
extra_op_counter.write(num,meta.counter-1);
Expand Down Expand Up @@ -154,26 +154,26 @@ control MyIngress(inout headers hdr,
//action: calculate hash functions
//store hash index of each packet in metadata
action cal_hash() {
hash(meta.hash0, HashAlgorithm.crc32_custom, 32w0, {meta.flowkey1, meta.flowkey2}, SKETCH_WIDTH); //hash for first row
hash(meta.hash1, HashAlgorithm.crc32_custom, 32w0, {meta.flowkey1, meta.flowkey2}, SKETCH_WIDTH); //hash for second row
hash(meta.hash2, HashAlgorithm.crc32_custom, 32w0, {meta.flowkey1, meta.flowkey2}, SKETCH_WIDTH); //hash for third row
hash(meta.hash0, HashAlgorithm.crc32_custom, 32w0, {meta.flowkey}, SKETCH_WIDTH); //hash for first row
hash(meta.hash1, HashAlgorithm.crc32_custom, 32w0, {meta.flowkey}, SKETCH_WIDTH); //hash for second row
hash(meta.hash2, HashAlgorithm.crc32_custom, 32w0, {meta.flowkey}, SKETCH_WIDTH); //hash for third row
}


action copy_key_tcp() {
meta.flowkey1[31:0] = hdr.ipv4.srcAddr;
meta.flowkey1[63:32] = hdr.ipv4.dstAddr;
meta.flowkey2[15:0] = hdr.tcp.srcPort;
meta.flowkey2[31:16] = hdr.tcp.dstPort;
meta.flowkey2[39:32] = hdr.ipv4.protocol;
meta.flowkey[31:0] = hdr.ipv4.srcAddr;
meta.flowkey[63:32] = hdr.ipv4.dstAddr;
//meta.flowkey2[15:0] = hdr.tcp.srcPort;
//meta.flowkey2[31:16] = hdr.tcp.dstPort;
//meta.flowkey2[39:32] = hdr.ipv4.protocol;
}

action copy_key_udp() {
meta.flowkey1[31:0] = hdr.ipv4.srcAddr;
meta.flowkey1[63:32] = hdr.ipv4.dstAddr;
meta.flowkey2[15:0] = hdr.udp.srcPort;
meta.flowkey2[31:16] = hdr.udp.dstPort;
meta.flowkey2[39:32] = hdr.ipv4.protocol;
meta.flowkey[31:0] = hdr.ipv4.srcAddr;
meta.flowkey[63:32] = hdr.ipv4.dstAddr;
//meta.flowkey2[15:0] = hdr.udp.srcPort;
//meta.flowkey2[31:16] = hdr.udp.dstPort;
//meta.flowkey2[39:32] = hdr.ipv4.protocol;
}

table forward {
Expand Down Expand Up @@ -208,6 +208,9 @@ control MyIngress(inout headers hdr,
//calculate hash value
cal_hash();

/********************************************************/
/***************** EPOCH VERIFICATION *******************/

//check if new packet is inside current epoch or in the next one
epoch.read(meta.epoch,0);
if (standard_metadata.ingress_global_timestamp > meta.epoch) { //start new epoch
Expand All @@ -229,6 +232,9 @@ control MyIngress(inout headers hdr,
}
}

/********************************************************/
/******************* UPDATE "CYCLE" *********************/

//compute offset for first row, update first row
meta.hash = meta.hash0;
meta.offset = 0;
Expand All @@ -245,40 +251,28 @@ control MyIngress(inout headers hdr,
UpdateRow(2,meta);


//MAJORITY VOTE ALGORITHM (MJRTY)
/********************************************************/
/*********** MAJORITY VOTE ALGORITHM (MJRTY) ************/

//compare candidate flow key with current flow key
meta.flag = 0;
sketch_key0.read(meta.tempkey1, meta.hash0);
if (meta.tempkey1 != meta.flowkey1) {
meta.flag = 1;
}
sketch_key1.read(meta.tempkey2, meta.hash0);
if (meta.tempkey2 != meta.flowkey2) {
meta.flag = 1;
}

srcAddr.read(meta.tempsrc, meta.hash0);
dstAddr.read(meta.tempdst, meta.hash0);
sketch_count.read(meta.tempcount, meta.hash0);
if (meta.flag == 1 && meta.tempcount == 0) {
meta.repass = 1;
}
if (meta.flag == 0) {
if (meta.tempsrc!= meta.flowkey[31:0] || meta.tempdst != meta.flowkey[63:32]) { //if keys are different check counter
if (meta.tempcount == 0){ //if counter is zero, add new key and compute absolute value of the resulting subtraction 1 - count
srcAddr.write(meta.hash0, meta.flowkey[31:0]);
dstAddr.write(meta.hash0, meta.flowkey[63:32]);
meta.tempcount = 1;
sketch_count.write(meta.hash0, meta.tempcount);
} else if (meta.tempcount > 0) { //if counter is not zero decrement counter by 1
meta.tempcount = meta.tempcount - 1;
sketch_count.write(meta.hash0, meta.tempcount);
}
} else { // if keys are equal increment counter by 1
meta.tempcount = meta.tempcount + 1;
} else if (meta.tempcount > 0){
meta.tempcount = meta.tempcount - 1;
}
sketch_count.write(meta.hash0, meta.tempcount);

if (meta.repass == 1) {
resubmit({meta.repass, meta.flowkey1, meta.flowkey2, meta.hash0});
sketch_count.write(meta.hash0, meta.tempcount);
}

} else { //second pass
//update keys
sketch_key0.write(meta.hash0, meta.flowkey1);
sketch_key1.write(meta.hash0, meta.flowkey2);
sketch_count.read(meta.tempcount, meta.hash0);
meta.tempcount = 1 - meta.tempcount;
sketch_count.write(meta.hash0, meta.tempcount);
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions p4/send.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
print("Usage: ./send.py [Trace path]")
else:
count=0
pkts=rdpcap(sys.argv[1])
pkts=PcapReader(sys.argv[1])
for pkt in pkts:
#input("Enter")
input("Enter")
sendp(pkt, iface="veth2")
count+=1
print(count)

0 comments on commit 72bf1b9

Please sign in to comment.