예제 #1
0
    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)
예제 #2
0
    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)
예제 #3
0
    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)
예제 #4
0
    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
예제 #5
0
 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)
예제 #6
0
 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)
예제 #7
0
    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)
예제 #8
0
    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)
예제 #9
0
    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)
예제 #10
0
    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))
예제 #11
0
    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)
예제 #12
0
    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)
예제 #13
0
    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)
예제 #14
0
    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)
예제 #15
0
    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)
예제 #16
0
    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)
예제 #17
0
    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)
예제 #18
0
    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
예제 #19
0
    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")