remus: init sch_plug module based on kernel version

remus: init sch_plug module based on kernel version

sch_plug module, for network buffering, is available as part of linux
kernel (from 3.4 onwards), as opposed to an out-of-tree module.
The netlink message format to talk to the in-kernel module is different from
that of the old version.  So, before initializing the Plug Qdisc, check
the kernel version and use the appropriate message format.

Also change the names of the constants to reflect the format used by the mainline
module [CHECKPOINT -> BUFFER , RELEASE -> RELEASE_ONE ].

Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>
This commit is contained in:
Shriram Rajagopalan authored and Ian Jackson committed 2013-04-08 16:05:56 +01:00
1 parent 99b9ab0b3e
commit 5753fe1c92
2 files changed
+19 -8

No files matched your search

+2 -2
View File
@@ -332,12 +332,12 @@ class BufferedNIC(CheckpointedDevice):
if not self.installed:
self.install()
self._sendqmsg(qdisc.TC_PLUG_CHECKPOINT)
self._sendqmsg(qdisc.TC_PLUG_BUFFER)
def commit(self):
'''Called when checkpoint has been acknowledged by
the backup'''
self._sendqmsg(qdisc.TC_PLUG_RELEASE)
self._sendqmsg(qdisc.TC_PLUG_RELEASE_ONE)
# private
def _sendqmsg(self, action):
+17 -6
View File
@@ -1,6 +1,9 @@
import socket, struct
import netlink
import platform
kernelversion = platform.platform(terse=True).split("-")[1].split(".")
qdisc_kinds = {}
@@ -146,13 +149,18 @@ class CfifoQdisc(Qdisc):
qdisc_kinds['cfifo'] = CfifoQdisc
TC_PLUG_CHECKPOINT = 0
TC_PLUG_RELEASE = 1
TC_PLUG_BUFFER = 0
TC_PLUG_RELEASE_ONE = 1
class PlugQdisc(Qdisc):
fmt = 'I'
def __init__(self, qdict=None):
if int(kernelversion[0]) >= 3 and int(kernelversion[1]) >= 4:
self.fmt = 'iI'
self.limit = 10000
else:
self.fmt = 'I'
if not qdict:
qdict = {'kind': 'plug',
'handle': TC_H_ROOT}
@@ -161,7 +169,10 @@ class PlugQdisc(Qdisc):
self.action = 0
def pack(self):
return struct.pack(self.fmt, self.action)
if int(kernelversion[0]) >= 3 and int(kernelversion[1]) >= 4:
return struct.pack(self.fmt, self.action, self.limit)
else:
return struct.pack(self.fmt, self.action)
def parse(self, args):
if not args:
@@ -169,9 +180,9 @@ class PlugQdisc(Qdisc):
arg = args[0]
if arg == 'checkpoint':
self.action = TC_PLUG_CHECKPOINT
self.action = TC_PLUG_BUFFER
elif arg == 'release':
self.action = TC_PLUG_RELEASE
self.action = TC_PLUG_RELEASE_ONE
else:
raise QdiscException('unknown action')
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.