GetParameterNames not supported by CPE - import data model manually?

Hi,

I have a CPE which reports Method 'cwmp:GetParameterNames' not implemented: method name or namespace not recognized right after the initial contact. The CPE gets added the ACS (based on the little data in the initial contact with BOOTSTRAP), but the ACS cannot do any further discovery of the data model and every further attempt ends with “400 Bad Request”.

This is clearly something with the device, all my other CPEs work properly. The question is, what can I do about it?

I have seen the discussion in another topic about if “GetParameterNames” is mandatory or not. I think it is not mandatory as section A.3.2.3 - GetParameterNames clearly states:

“This method MAY be used by an ACS to discover the Parameters accessible on a particular CPE.” And in this sense it is not relevant what table 21. say about NextLevel=true, as that part is only mandatory, if the “GetParameterNames” is implemented, which is optional (“this method MAY be used”).

Searching the forum yields multiple such issues around GetParameterNames, but no solution in sight.

My idea is to somehow load the data model into the ACS (I have it in an XML), is this at all possible? I see that an already discovered device data model can be downloaded, but I dont see a way of how to import one? The logic whould be that if I load the data model, the ACS does not need to send GetParameterNames as it will known the (full) data model already.

Yes its possible. If you are running the default GenieACS provision scripts, on 0 BOOTSTRAP the data model will be cleared. You will need to do extra work to figure out how to reconcile that. Keep in mind too internal caching in GenieACS could also present issues with trying to go around GenieACS to load the data model.

Is there a reason you have to support this device? Why don’t the vendor implement GPN?

Much appreciate your help!

Yes its possible.

Can you give me some clues where to look?

If you are running the default GenieACS provision scripts, on 0 BOOTSTRAP the data model will be cleared.

I assume you refer to this part, and I need to remove it so the ACS is not forcing a refresh which will not work without GetParameterNames anyway:

// Clear cached data model to force a refresh
clear("Device", now);
clear("InternetGatewayDevice", now);

?

Is there a reason you have to support this device? Why don’t the vendor implement GPN?

To be honest, my opinion is that the vendor does this completely intentionally to break compatibility with generic ACS products. I have worked with Sagemcom, Technicolor, AVM, Huawei, and old ALU CPEs, all of them supported GPN. Even this specific vendor’s other GPON CPEs do support GPN, only this femto type devices is not supporting it. Long story short: I think this is intentional.

If you know the OUI and serial of each device is going to report, then create the full document for the device. The ACS ID will be in the form of OUI-PRODUCT_CLASS-SERIAL_NUMBER.

If this vendor is a jerk, why not drop them? You have to many in the field? Which vendor, so I know who to avoid.

1 Like

Yes, but create it where? Normally the data model comes in the form of XML. I have that, but I found no way of importing it. OUI and serial numbers are also known.

“If this vendor is a jerk, why not drop them?”

Not my choice I can assure you. :upside_down_face: This device is not a simple CPE, there are 2-3 vendors who can do this, so not that easy to drop them. The vendor is N*kia.

lol. We have successfully been able to ward them off.

Probably the easiest way is to use mongoimport. You will need to touch up the _id, serial, mac, and potentially OUI before you insert the document.

The best part is that their GPON ONTs are working just fine, as with those they cannot do this shit that they try to rape the standard in a way that it makes them incompatible “enough” to buy their platform, as with that attitude they would not sell a single unit…

On the DB: ok I need to import the data model to the database directly. To where? Into db.devices I assume?

This is how single entry looks like from the little data that comes from the initial BOOTSTRAP message):

        AdditionalSoftwareVersion: {
          _object: false,
          _timestamp: ISODate('2025-05-31T17:19:02.157Z'),
          _type: 'xsd:string',
          _value: 'IPL=01.01.01-00000(T),Seed=0x0000'
        },

When I import the data model, I will not have the _value part as that will be generated when the ACS actually asks for the data itself, but do I need the _timestamp, or that is also only generated when the actual value is polled by the ACS?

Thanks again!

Any parameter that beings with an _ is one that GenieACS creates to track some sort of state information about that parameter.

As far as the importation process, I can offer no guidance. I’ve not had to traverse this path.

Yeah, but I assume at least the _object and the _type parameters needs to be there when I import the data model, no? I can imagine that the _timestamp and _value are created when the ACS pulls the actual value with GetParameterValue.

Or maybe it can be just like this:

        AdditionalSoftwareVersion: {
        },

and the rest is filled by the ACS?

I’m honestly not sure. I haven’t had a need to dive into that section of the code base.

Oki, no problem. What I did is this:

Added the most important (proprietary) objects the ACS keeps asking the femto with GetParameterName. It seem this was successful as the ACS is not asking for them any more. However, the ACS keeps asking for the Device.ManagementServer object with GPN even though now all the underlying parameters are there also visible from the webgui. My question is why the ACS tries to do this instead of just doing GPV for these parameters? Seems like this behavior is hard coded for the ManagementServer object during default prov?

Look in the inform provision script. If the second parameter of a declare is anything other than null, the arguments will be used to access if the path or parameter name should be refreshed from the CPE.

1 Like

More developments:

I commented out the complete “inform” part, as everything I want in the “Device.ManagementServer” object is already imported in with mongoimport. I noticed that by default the femto tries to use basic auth with fixed user and pass, so I added cwmp.auth with AUTH("username", "password") to the config part.

This way the ACS stopped asking GPN (Device.ManagementServer) from the femto, but when I try to issue a reboot, 9 out of 10 the ACS say “device is offline”, 1 out of 10 it say “Basic HTTP authentication not allowed”. In the same time the device seems online on the gui, it is also pingable on the ConnectionRequestURL. No faults recorded any more.

MOD: interesting part is every time I hit reboot, nothing is actually sent towards the femto at all. Shouldn’t I see at least some TCP activity towards the femto? Same for summon.

MOD2: ahh, sorry. Bad Wireshark filter… The femto does respond to summon with 401 unauthorized. ACS is not sending any credentials in ConnectionRequest, so some more reading is in order…

MOD3: ACS to CPE auth part is TODO

Just the docs are to do. ACS → CPE and CPE → ACS authentication works in v1.2.

The easiest way to do ACS → CPE auth is set the username/password on Device.ManagementServer and then GenieACS will do the rest. Thats most of of wha the default inform script does.

Oki, in a previous post you said I need to alter it in a way that the second parameter is null, as that way I can prevent GenieACS to do GPN on the ManagementServer object. So you mean this is how the inform prov should look like?

declare("Device.ManagementServer.ConnectionRequestUsername", null, {value: 'fixedusername'});
declare("Device.ManagementServer.ConnectionRequestPassword", null, {value: 'fixedpassword'});
declare("Device.ManagementServer.PeriodicInformEnable", null, {value: true});
declare("Device.ManagementServer.PeriodicInformInterval", null, {value: '600'});

To be honest we need to prevent the ACS to do any GPN on any objects, as that is not going to work with this crappy femto…

Yes, thats how your request should look.

Oki, so I put exactly that in the inform (the bootstrap and default prov’s content is commented out), and immediately I start getting “bad requests” right after the next inform arrives, as the ACS starts to do GPN again (for the ManagementServer object):

So it seems doing the null trick on the declare did not stopped the ACS to do GPN on the object.

This is how the ManagementServer object looks like for the device:

Device.ManagementServer
Device.ManagementServer.ConnectionRequestPassword fixedpass
Device.ManagementServer.ConnectionRequestURL http://10.3.0.1:7547/ConnectionRequest/001D4C-TNW200000000
Device.ManagementServer.ConnectionRequestUsername fixeduser
Device.ManagementServer.InformParameterNumberOfEntries
Device.ManagementServer.ParameterKey
Device.ManagementServer.Password fixedpass
Device.ManagementServer.PeriodicInformEnable true
Device.ManagementServer.PeriodicInformInterval 600
Device.ManagementServer.URL http://acsurl.com:7013/cwmpWeb/WGCPEMgt
Device.ManagementServer.Username fixeduser

Maybe I am missing something and that is why the ACS keeps asking for GPN?

There could be something internal to GenieACS which treats the ManagementServer parameter different. I’ve never had the need to dig into that part of the code so I can’t tell you more than that.

I am going to add zaidka , lets hope he has an idea.

ADMIN EDIT: No you are not. Do not tag people.