loader-logo

Troubleshoot AP Joining Issues – Cisco Mobility Express

Troubleshooting AP joining issues aren’t as difficult as long as you know where to look for the correct log messages.

Configuring Cisco Mobility Express

Imagine being tasked with deploying a few Cisco Mobility Express access points only to find out they aren’t joining the mobility express controller, requiring you to troubleshoot AP joining issues.

Staring at the Cisco access point, the LEDs cycle between green, red, and amber. That’s an indication of a discovery or join in progress but it continues to cycle through those LED colors.

There could be an issue with the access point not finding the controller or attempting to join the controller on the wrong VLAN.

Here are some commands to help find out what the issue could be.

One thing to note is if you’re consoled into the controller you can switch between AP and controller level commands.

To get to AP level from controller type in the following command:

apciscoshell

To get back to controller command line from the AP cisco shell you must log out.

AP>logout

This is useful for displaying debug messages from the controller or from the access point.

Cisco Mobility Express Controller Debug Messages

To get basic CAPWAP events such as discovery requests from access points enable the following command:

debug capwap events enable

Here’s example output from an access point with IP address 192.168.1.2 trying to discovery a controller.

(Cisco Controller) >spamApTask0: Aug 18 06:29:11.142: 18:18:18:18:18:18 Discovery Request from 192.168.1.2:5256

It’s very basic output and it doesn’t say whether or not it was successful.

To see more detail you can enable the following command:

debug capwap detail enable

For access points unable to join a controller it would be beneficial to see if any errors occur. Use the following command to enable debug errors:

debug capwap errors enable

Here’s some example output from this command:

spamApTask0: Aug 18 06:37:42.982: 18:18:18:18:18:18 Discovery Request received on wrong VLAN '0' on interface '1', management VLAN = ‘10', AP Manager VLAN = ’10’, dropping the packet

spamApTask0: Aug 18 06:37:42.982: 18:8b:45:08:b0:20 State machine handler: Failed to process  msg type = 1 state = 0 from 192.168.1.10:5248

spamApTask0: Aug 18 06:37:42.982: 00:00:00:00:00:00 Failed to parse CAPWAP packet from 192.168.1.10:5248

The amount of detail is enough to show why my access point is unable to join the controller. The discovery request was received on the wrong VLAN, the native VLAN, while my controller management and AP manager sit on VLAN 10. The controller drops the packet and we have an error.

The fix was to place the access point on the correct VLAN on the switch port. An example configuration for that switch port:

switch(config-if)#switchport trunk native vlan 10
switch(config-if)#switchport mode trunk

For more information, here is the Cisco Mobility Express Deployment Guide – Release 8.3.102.0

In summary, to troubleshoot AP joining issues we must start with the basics. Ensure the AP has IP connectivity and can reach the controller. If more troubleshooting is required, utilize available debug commands to find out the reason for the AP not being able to join the controller.


Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.


[gravityforms id=16 title=false description=false]
<script type="text/javascript">if(!gform){document.addEventListener("gform_main_scripts_loaded",function(){gform.scriptsLoaded=!0}),window.addEventListener("DOMContentLoaded",function(){gform.domLoaded=!0});var gform={domLoaded:!1,scriptsLoaded:!1,initializeOnLoaded:function(o){gform.domLoaded&&gform.scriptsLoaded?o():!gform.domLoaded&&gform.scriptsLoaded?window.addEventListener("DOMContentLoaded",o):document.addEventListener("gform_main_scripts_loaded",o)},hooks:{action:{},filter:{}},addAction:function(o,n,r,t){gform.addHook("action",o,n,r,t)},addFilter:function(o,n,r,t){gform.addHook("filter",o,n,r,t)},doAction:function(o){gform.doHook("action",o,arguments)},applyFilters:function(o){return gform.doHook("filter",o,arguments)},removeAction:function(o,n){gform.removeHook("action",o,n)},removeFilter:function(o,n,r){gform.removeHook("filter",o,n,r)},addHook:function(o,n,r,t,i){null==gform.hooks[o][n]&&(gform.hooks[o][n]=[]);var e=gform.hooks[o][n];null==i&&(i=n+"_"+e.length),null==t&&(t=10),gform.hooks[o][n].push({tag:i,callable:r,priority:t})},doHook:function(o,n,r){if(r=Array.prototype.slice.call(r,1),null!=gform.hooks[o][n]){var t,i=gform.hooks[o][n];i.sort(function(o,n){return o.priority-n.priority});for(var e=0;e<i.length;e++)"function"!=typeof(t=i[e].callable)&&(t=window[t]),"action"==o?t.apply(null,r):r[0]=t.apply(null,r)}if("filter"==o)return r[0]},removeHook:function(o,n,r,t){if(null!=gform.hooks[o][n])for(var i=gform.hooks[o][n],e=i.length-1;0<=e;e--)null!=t&&t!=i[e].tag||null!=r&&r!=i[e].priority||i.splice(e,1)}}}</script> <div class='gf_browser_safari gf_browser_iphone gform_wrapper gravity-theme' id='gform_wrapper_16' ><form method='post' enctype='multipart/form-data' id='gform_16' action='/troubleshoot-ap-joining-issues-cisco-mobility-express/' > <div class='gform_body gform-body'><div id='gform_fields_16' class='gform_fields top_label form_sublabel_below description_below'><fieldset id="field_16_1" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" ><legend class='gfield_label gfield_label_before_complex' >Name<span class="gfield_required"><span class="gfield_required gfield_required_text">(Required)</span></span></legend><div class='ginput_complex ginput_container no_prefix has_first_name no_middle_name no_last_name no_suffix gf_name_has_1 ginput_container_name' id='input_16_1'> <span id='input_16_1_3_container' class='name_first' > <input type='text' name='input_1.3' id='input_16_1_3' value='' aria-label='First name' aria-required='true' placeholder='First Name' /> <label for='input_16_1_3' >First</label> </span> </div></fieldset><div id="field_16_2" class="gfield gfield--width-full gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" ><label class='gfield_label' for='input_16_2' >Email<span class="gfield_required"><span class="gfield_required gfield_required_text">(Required)</span></span></label><div class='ginput_container ginput_container_email'> <input name='input_2' id='input_16_2' type='text' value='' class='large' placeholder='Business email address' aria-required="true" aria-invalid="false" /> </div></div><fieldset id="field_16_3" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" ><legend class='gfield_label gfield_label_before_complex' >Consent<span class="gfield_required"><span class="gfield_required gfield_required_text">(Required)</span></span></legend><div class='ginput_container ginput_container_checkbox'><div class='gfield_checkbox' id='input_16_3'><div class='gchoice gchoice_16_3_1'> <input class='gfield-choice-input' name='input_3.1' type='checkbox' value='I consent to the processing and sharing with partners of the personal data that I provide Packet 6 for this activity in accordance with and as described in the &lt;a href=&quot;https://packet6.com/privacy-policy&quot; target=&quot;_new&quot;&gt;Privacy Policy&lt;/a&gt;' id='choice_16_3_1' /> <label for='choice_16_3_1' id='label_16_3_1'>I consent to the processing and sharing with partners of the personal data that I provide Packet 6 for this activity in accordance with and as described in the <a href="https://packet6.com/privacy-policy" target="_new">Privacy Policy</a></label> </div></div></div></fieldset><div id="field_16_4" class="gfield gform_validation_container field_sublabel_below field_description_below gfield_visibility_visible" ><label class='gfield_label' for='input_16_4' >Comments</label><div class='ginput_container'><input name='input_4' id='input_16_4' type='text' value='' /></div><div class='gfield_description' id='gfield_description_16_4'>This field is for validation purposes and should be left unchanged.</div></div></div></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_16' class='gform_button button' value='Get the report' onclick='if(window["gf_submitting_16"]){return false;} window["gf_submitting_16"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_16"]){return false;} window["gf_submitting_16"]=true; jQuery("#gform_16").trigger("submit",[true]); }' /> <input type='hidden' class='gform_hidden' name='is_submit_16' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='16' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_16' value='WyJbXSIsImY4MGVlNTA5MGVjMWYzYzU5NzUyOGFhOWE3ZGFiMzRlIl0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_16' id='gform_target_page_number_16' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_16' id='gform_source_page_number_16' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div>