def __init__(self, vid, attrType, UpdateOpt=DONOT_UPDATE, notifyVendor=NOTIFY_OPTION_OFF, OutCtrlIds=[], attrValue=None): """ This functions create l2tpv3SampleVendorAvp object which inherites l2tpv3AVP. : param vid: Vendor ID of the AVP : param attrType: Attribute of the AVP. : param UpdateOpt: [DONOT_UPDATE/ALLOW_UPDATE] Control if attrValue of the AVP can be changed at runtime. : param notifyVendor: [NOTIFY_OPTION_OFF/NOTIFY_OPTION_ON/NOTIFY_OPTION_ON_WITH_CONFIRM] Control if Vendor wants to be notified if this AVP is in the received control packet. If notification is ON, whether to signal Vendor using HalNotification or HalConfig/HalConfigRsp mechanism : param OutCtrlIds: [] a list of RFC3931 message codes that this AVP should be included when L2TP sends out a Control packet. If the list is empty, then no inclusion. : return: """ if (attrType > MAX_ATTRIBUTE_VALUE or (attrType < 0) or not isinstance(attrType, int)) \ or (not isinstance(vid, int)): msg = "parameter type error (vid:%d attrType:%d)" % (vid, attrType) raise l2tpv3AVPerror(msg) if not isinstance(OutCtrlIds, list): msg = "parameter type error (outCtrlPkts must be a list)" raise l2tpv3AVPerror(msg) VendorID = vid AttrType = attrType self.updateOpt = UpdateOpt # buffer of AVP (attrValue) need to be updated at boot time. self.notifyVendorOpt = notifyVendor # If this AVP is in a packet sent from the other side, notify Vendor about it with attrValue self.OutCtrlIdList = OutCtrlIds if attrValue is None: value = 0 retStr = struct.pack("!H", value) else: retStr = attrValue if (len(retStr) > MAX_ATTRIBUTE_STR_LEN): msg = "Attribute buffer length is too long (%d > %d)" % ( self.length, MAX_ATTRIBUTE_STR_LEN) raise l2tpv3AVPerror(msg) super(l2tpv3SampleVendorAvp, self).__init__(AttrType=attrType, VendorID=vid, AttrValue=retStr, MustAvp=False, HidenAVP=False)
def __init__(self, value=""): if not isinstance(value, str): msg = "parameter type error, value type is %s, expected:str" % str(value) self.logger.warn(msg) raise l2tpv3AVPerror(msg) if len(value) != 8: msg = "Tie Breaker value length should be 8, real length:%d" % len(value) self.logger.warn(msg) raise l2tpv3AVPerror(msg) self.tieBreaker = value super( SessionTieBreakerCisco, self).__init__(AttrType=self.SessionTieBreakerCisco, VendorID=self.CiscoVendor, AttrValue=value, MustAvp=True, HidenAVP=False)
def __init__(self, value=(), attrValue=None): if not isinstance(value, tuple) or len(value) != 2: msg = "parameter type error" raise l2tpv3AVPerror(msg) src_ip, group_ip, = value grp_addrinfo = socket.getaddrinfo(group_ip, None)[0] src_addrinfo = socket.getaddrinfo(src_ip, None)[0] family = grp_addrinfo[0] self.src_ip = src_addrinfo[4][0] self.group_ip = grp_addrinfo[4][0] if attrValue is None: if family == socket.AF_INET: src_ip, = struct.unpack("!L", socket.inet_aton(self.src_ip)) group_ip, = struct.unpack("!L", socket.inet_aton(self.group_ip)) retStr = struct.pack("!H4L4L", 0, src_ip, 0, 0, 0, group_ip, 0, 0, 0) else: grp_bin = socket.inet_pton(grp_addrinfo[0], grp_addrinfo[4][0]) src_bin = socket.inet_pton(src_addrinfo[0], src_addrinfo[4][0]) retStr = struct.pack("!H", 0) + src_bin + grp_bin else: retStr = attrValue super(DepiRemoteMulticastLeave, self).__init__(AttrType=self.AttrType, VendorID=l2tpv3AVP.CableLabsVendor, AttrValue=retStr, MustAvp=True, HidenAVP=False)
def append_VspAvp(self, out_avps, ctrlPktNumber): """ This function blindly appends VSP AVPs to an outgoing control packet if the VSP AVPs have the ctrlPktNumber is in the list of outCtrlPktList. This function should be called before L2tpv3ControlPacket.L2tpv3ControlPacket() which builds the Control packet. : param out_avps: The list of avps which is used to build a L2tpv3ControlPacket. : param ctrlPktNumber: One of the values of L2tpv3RFC3931AVPs.ControlMessageAVP: SCCRQ, SCCRP, ICRQ, ICRP, etc. : return: None """ if not isinstance(out_avps, list): raise l2tpv3AVPerror("Outgoing AVP must be a list") avps = l2tpv3AVP.SubclassMapping.keys() for avp in avps: (vendorId, attrType) = avp if (vendorId == self.vID): vsp_avp = l2tpv3AVP.SubclassMapping[(vendorId, attrType)] if (None is not vsp_avp and isinstance(vsp_avp, l2tpv3SampleVendorAvp) and ctrlPktNumber in vsp_avp.OutCtrlIdList): self.logger.info( "append_VspAvp vid %d, attr %d, ctrl number %d" % (vendorId, attrType, ctrlPktNumber)) self.logger.info(vsp_avp) out_avps.append(vsp_avp) return
def decode(self, buf): if len(buf) != (self.length - STANDARD_AVP_HEADER_LEN): raise l2tpv3AVPerror("Invalid attribute len: %d %d" % (len(buf), self.length)) formatStr = str(self.length - STANDARD_AVP_HEADER_LEN) + "B" attrValue = str(struct.unpack(formatStr, buf)) return l2tpv3SampleVendorAvp(self.vendorID, self.attrType, self.updateOpt, self.notifyVendorOpt, self.OutCtrlIdList, attrValue=attrValue)
def decode(buf): # skip the reserved offset = 0 if len(buf) % 2 or not len(buf): msg = "parameter length error, expect 2xn current is %d" % len(buf) raise l2tpv3AVPerror(msg) ret = list() while offset < len(buf): phb, flow = struct.unpack("!BB", buf[offset:offset + 2]) offset += 2 phb = phb & 0x3f flow = flow & 0x03 ret.append((phb, flow)) return UpstreamFlow(value=tuple(ret), attrValue=buf)
def __init__(self, value=0, attrValue=None): if not isinstance(value, int) and not isinstance(value, long): msg = "parameter type error, value type: %s" % type(value) self.logger.warn(msg) raise l2tpv3AVPerror(msg) self.firmwareRevision = value if attrValue is None: retStr = struct.pack("!H", value) else: retStr = attrValue super( DraftAVPVersionCisco, self).__init__(AttrType=l2tpv3AVP.DraftAvpVersionCisco, VendorID=l2tpv3AVP.CiscoVendor, AttrValue=retStr, MustAvp=True, HidenAVP=False)
def __init__(self, value=0, attrValue=None): if value > DepiL2SpecificSublayerSubtype.MAX_SUBTYPE_VALUE: msg = "parameter type error" raise l2tpv3AVPerror(msg) self.pw_type = value if attrValue is None: retStr = struct.pack("!H", value) else: retStr = attrValue super(DepiL2SpecificSublayerSubtype, self).__init__(AttrType=self.AttrType, VendorID=l2tpv3AVP.CableLabsVendor, AttrValue=retStr, MustAvp=False, HidenAVP=False)
def __init__(self, value=0, attrValue=None): if not isinstance(value, int) and not isinstance(value, long): msg = "parameter type error" raise l2tpv3AVPerror(msg) self.localMTU = value if attrValue is None: retStr = struct.pack("!H", value) else: retStr = attrValue super(RemoteMTUCableLabs, self).__init__(AttrType=self.AttrType, VendorID=l2tpv3AVP.CableLabsVendor, AttrValue=retStr, MustAvp=True, HidenAVP=False)
def get_VspAvp(self, vsp_vid, vsp_attr): """ This functions returns the AVP in l2tpv3AVP.SubclassMapping[] using the (vsp_vid, vsp_attr) as key. : param vsp_vid: Vendor ID of the AVP the caller wants to find : param vsp_attr: Attribute of the AVP the caller wants to find. : return: matching AVP """ if (not isinstance(vsp_vid, int) or not isinstance(vsp_attr, int)): msg = "parameter is incorrect" print msg self.logger.warn(msg) raise l2tpv3AVPerror(msg) return l2tpv3AVP.SubclassMapping.get((vsp_vid, vsp_attr))
def __init__(self, value=(), attrValue=None): if not isinstance(value, tuple): msg = "parameter type error" raise l2tpv3AVPerror(msg) self.allocas = value # with PHB, Flow if attrValue is None: retStr = "" for phb, flowid in value: retStr += struct.pack("!BB", phb, flowid) else: retStr = attrValue super(UpstreamFlow, self).__init__(AttrType=self.AttrType, VendorID=l2tpv3AVP.CableLabsVendor, AttrValue=retStr, MustAvp=True, HidenAVP=False)
def decode(buf): if len(buf) != 34: msg = "parameter length error, expect 34 current is %d" % len(buf) raise l2tpv3AVPerror(msg) data = struct.unpack("!3L", buf[6:18]) data1 = struct.unpack("!3L", buf[22:40]) if data == data1 == (0, 0, 0): family = socket.AF_INET else: family = socket.AF_INET6 if family == socket.AF_INET: src_ip = socket.inet_ntop(family, buf[2:6]) group_ip = socket.inet_ntop(family, buf[18:22]) else: src_ip = socket.inet_ntop(family, buf[2:18]) group_ip = socket.inet_ntop(family, buf[18:40]) return DepiRemoteMulticastLeave(value=(src_ip, group_ip), attrValue=buf)
def __init__(self, value=True, attrValue=None): if not isinstance(value, bool): msg = "parameter type error" raise l2tpv3AVPerror(msg) self.mcast_capable = value if attrValue is None: data = 0x8000 if self.mcast_capable else 0 retStr = struct.pack("!H", data) else: retStr = attrValue super(DepiMulticastCapability, self).__init__(AttrType=self.AttrType, VendorID=l2tpv3AVP.CableLabsVendor, AttrValue=retStr, MustAvp=True, HidenAVP=False)
def __init__(self, value=0, mustAvp=False, hiddenAvp=False, attrValue=None): if (not isinstance(value, int) and not isinstance(value, long))\ or not isinstance(mustAvp, bool) or not isinstance(hiddenAvp, bool): msg = "parameter type error, value type: %s, mustAVP type:%s , hiddenAVP error:%s." % ( type(value), type(mustAvp), type(hiddenAvp) ) self.logger.warn(msg) raise l2tpv3AVPerror(msg) self.connectionID = value if attrValue is None: retStr = struct.pack("!I", value) else: retStr = attrValue super( AssignedConnectionIDCisco, self).__init__(AttrType=self.AttrType, VendorID=l2tpv3AVP.CiscoVendor, AttrValue=retStr, MustAvp=mustAvp, HidenAVP=hiddenAvp)
def __init__(self, value=(), mustAvp=False, hiddenAvp=False, attrValue=None): if not isinstance(value, tuple) or not isinstance(mustAvp, bool) or not isinstance(hiddenAvp, bool): msg = "parameter type error, value type: %s, mustAVP type:%s , hiddenAVP error:%s." % ( type(value), type(mustAvp), type(hiddenAvp) ) self.logger.warn(msg) raise l2tpv3AVPerror(msg) self.pseudowireList = value if attrValue is None: retStr = "" for cap in value: retStr += struct.pack("!H", cap) else: retStr = attrValue super( PseudowireCapListCisco, self).__init__(AttrType=self.AttrType, VendorID=l2tpv3AVP.CiscoVendor, AttrValue=retStr, MustAvp=mustAvp, HidenAVP=hiddenAvp)
def __init__(self, value=(), attrValue=None): if not isinstance(value, tuple): msg = "parameter type error" raise l2tpv3AVPerror(msg) self.pw_list = value if attrValue is None: retStr = "" for key in value: pw_type = key retStr += struct.pack("!H", pw_type) else: retStr = attrValue super(DepiPseudowireSubtypeCapList, self).__init__(AttrType=self.AttrType, VendorID=l2tpv3AVP.CableLabsVendor, AttrValue=retStr, MustAvp=True, HidenAVP=False)
def __init__(self, typeDef, version, value, attrValue=None): if not isinstance(value, str) \ or (not isinstance(typeDef, int) and not isinstance(typeDef, long))\ or (not isinstance(version, int) and not isinstance(version, long)): msg = "parameter type error" raise l2tpv3AVPerror(msg) self.type = typeDef self.version = version self.dataLen = len(value) self.data = value if attrValue is None: formatStr = "!BBB" + str(len(value)) + "s" retStr = struct.pack( formatStr, typeDef, version, len(value), value) else: retStr = attrValue super( DepiMcmtsSimplificationCisco, self).__init__(AttrType=self.AttrType, VendorID=l2tpv3AVP.CiscoVendor, AttrValue=retStr, MustAvp=False, HidenAVP=False)
def add_VspAvp(self, v_avp): """ This function adds single AVP which has Vendor ID = self.vID to the global l2tpv3AVP.SubclassMapping[] and the local vsp_avps[] dictionaries. The local vsp_avps[] dictionary may be used later for TBD purpose. : param v_avp: Vendor AVP the caller wants to add : return: """ if (not isinstance(v_avp, l2tpv3AVP)): msg = "AVPs is not a l2tpv3AVP type" self.logger.warn(msg) raise l2tpv3AVPerror(msg) if (v_avp.vendorID != self.vID): return """ Just replace if exist. Otherwise, add it """ l2tpv3AVP.SubclassMapping[(v_avp.vendorID, v_avp.attrType)] = v_avp l2tpv3VspAvps.vsp_avps[(v_avp.vendorID, v_avp.attrType)] = v_avp return
def update_VspAvp(self, cfg): """ This functions should be called when L2TP layer (L2tpv3Hal.py) receives: HalNotification.MsgTypeVspAvpExchange, with 'oper = VSP_AVP_OP_UPDATE'. It will update all AVPs in l2tpv3AVP.SubclassMapping[] which match (vendorId,attrType) and have 'updateOpt == ALLOW_UPDATE' : param cfg: the msg in HalConfig message which is sent from OpenRPD driver. : return: None """ try: rsp_avp = L2tpv3VspAvp_pb2.t_l2tpVspAvpMsg() rsp_avp.ParseFromString(cfg.CfgMsgPayload) cfgRsp = L2tpv3VspAvp_pb2.t_l2tpVspAvpMsg() cfgRsp.rspCode = L2tpv3VspAvp_pb2.t_l2tpVspAvpMsg( ).VSP_AVP_STATUS_SUCCESS cfgRsp.oper = L2tpv3VspAvp_pb2.t_l2tpVspAvpMsg().VSP_AVP_OP_UPDATE if rsp_avp.oper == L2tpv3VspAvp_pb2.t_l2tpVspAvpMsg( ).VSP_AVP_OP_UPDATE: vspAvpContent = rsp_avp.VspAvp for avp in vspAvpContent: self.logger.info( "update_VspAvp srcClientID: %s, op: %d, vid %d, attr %d, strVal %s" % (cfg.SrcClientID, rsp_avp.oper, avp.vendorId, avp.attrType, avp.attrValBuf)) vsp_avp = l2tpv3AVP.SubclassMapping[(avp.vendorId, avp.attrType)] # If any AVP retrieved from l2tpv3AVP.SubclassMapping not fulfills # the below conditions, break out and send a ConfigRsp with FAILURE status if (None is vsp_avp) or not isinstance( vsp_avp, l2tpv3SampleVendorAvp): continue if (vsp_avp.vendorID != self.vID) or (vsp_avp.updateOpt != ALLOW_UPDATE): cfgRsp.rspCode = L2tpv3VspAvp_pb2.t_l2tpVspAvpMsg( ).VSP_AVP_STATUS_FAILURE break vsp_avp.attrValue = str(avp.attrValBuf) vsp_avp.length = len( vsp_avp.attrValue) + STANDARD_AVP_HEADER_LEN self.logger.info("update_VspAvp: %s " % vsp_avp.attrValue) self.logger.info(vsp_avp) else: cfgRsp.rspCode = L2tpv3VspAvp_pb2.t_l2tpVspAvpMsg( ).VSP_AVP_STATUS_FAILURE return cfgRsp except Exception as e: self.logger.error( "Error happens when handle VSP AVP exchange msg: " + str(e)) raise l2tpv3AVPerror("cfg message MsgTypeVspAvpExchange rsp error")