Reply
Thread Tools
Posts: 567 | Thanked: 2,965 times | Joined on Oct 2009
#1
This post is doing to be a data dump of all my findings/research/etc on the N900 WiFi stack. I wont be covering anything in-kernel (since I am not a kernel guy), anything that's not N900/Maemo specific (e.g. wireless-tools) or that's not WiFi specific (e.g. icd2)

The following components are involved in the WiFi stack on the N900:
eapd (handles cryptographic stuff for connecting to secure
WiFi access points)
libicd_network_eap.so (provides EAP support in ICD2)
libicd_network_ipv4.so (provides ipv4 support in ICD2)
libicd_network_wlan.so (core ICD2 plugin for WiFi)
libicd_network_wps.so (provides WPS support in ICD2)
wlancond (main daemon that handles WiFi)
wl1251-cal (reads data from cal and sends it to the WiFi chip including MAC address and calibration data)

wlancond was made open source by Nokia.
wl1251-cal and libicd_network_wlan.so have since been cloned by the community and are now open source. The others (eapd, libicd_network_eap.so, libicd_network_ipv4.so and libicd_network_wps.so) remain closed source.

In the next post I will describe all the dbus interfaces that these components expose to the outside world (i.e. any method calls they expose for other components to call and any signals they sent to other components) as well as some stuff about who needs those dbus interfaces. After that I will describe any gconf keys or other things that these blobs deal with.
 

The Following 16 Users Say Thank You to jonwil For This Useful Post:
Posts: 567 | Thanked: 2,965 times | Joined on Oct 2009
#2
libicd_network_eap.so does not listen for any dbus signals, expose any dbus method calls or set any gconf keys. Therefore there is nothing exposed to the outside world by that library that needs to be exposed by any replacement.

libicd_network_ipv4.so does not listen for any dbus signals, expose any dbus method calls or set any gconf keys. Therefore there is nothing exposed to the outside world by that library that needs to be exposed by any replacement.

libicd_network_wlan.so does not listen for any dbus signals, expose any dbus method calls or set any gconf keys. Therefore there is nothing exposed to the outside world by that library that needs to be exposed by any replacement.

libicd_network_wps.so does not listen for any dbus signals, expose any dbus method calls or set any gconf keys. Therefore there is nothing exposed to the outside world by that library that needs to be exposed by any replacement.

wlancond exposes a dbus interface on com.nokia.wlancond.
Outside of the WiFi stack mentioned in the first post, the only user of that interface is libconnui_iapsettings.so which calls com.nokia.wlancond.request.scan and listens for com.nokia.wlancond.signal.scan_results wlancond does not set any gconf keys or expose any other external interface.

eapd exposes a dbus interface on com.nokia.eap. Outside of the WiFi stack mentioned in the first post, the only users of that interface is libiap_dialog_wps.so which listens for com.nokia.eap.signal.wps_success. eapd sets some gconf keys. eapd does not expose any other external interface.

The next post will document what gconf keys eapd sets.
 

The Following 6 Users Say Thank You to jonwil For This Useful Post:
Posts: 567 | Thanked: 2,965 times | Joined on Oct 2009
#3
Ok, it looks like libicd_network_ipv4 is not part of the WiFi stack after all and shouldn't be replaced as part of any replacement of that stack (since its also used by the GPRS stuff).

So the items considered part of the WiFi stack are:
eapd
wlancond
libicd_network_eap.so
libicd_network_wlan.so
libicd_network_wps.so

wl1251-cal is also part of the stack but we dont need to worry about it from the perspective of gconf or dbus stuff.

Last edited by jonwil; 2017-10-25 at 08:25.
 

The Following 3 Users Say Thank You to jonwil For This Useful Post:
Posts: 567 | Thanked: 2,965 times | Joined on Oct 2009
#4
Here is a full list of all the gconf keys that are referenced by the various parts of the WiFi stack:

libicd_network_eap
/system/osso/connectivity/IAP/%s/temporary
/system/osso/connectivity/IAP/%s/type
/system/osso/connectivity/IAP/%s/nai
/system/osso/connectivity/IAP/%s/wlan_security

libicd_network_wps
/system/osso/connectivity/IAP/%s/name
/system/osso/connectivity/IAP/%s/temporary
/system/osso/connectivity/IAP/%s/wlan_hidden
/system/osso/connectivity/IAP/%s/wlan_ssid
/system/osso/connectivity/IAP/%s/wlan_security
/system/osso/connectivity/IAP/wlan_tx_power

libicd_network_wlan
/system/osso/connectivity/IAP/%s/type
/system/osso/connectivity/IAP/%s/name
/system/osso/connectivity/IAP/%s/temporary
/system/osso/connectivity/IAP/%s/allow_wep_ciphers_in_WPA
/system/osso/connectivity/IAP/%s/EAP_wpa2_only_mode
/system/osso/connectivity/IAP/%s/powersave_after_scan
/system/osso/connectivity/IAP/%s/wlan_hidden
/system/osso/connectivity/IAP/%s/wlan_powersave
/system/osso/connectivity/IAP/%s/wlan_adhoc_channel
/system/osso/connectivity/IAP/%s/wlan_wepdefkey
/system/osso/connectivity/IAP/%s/wlan_ssid
/system/osso/connectivity/IAP/%s/wlan_wepkey1
/system/osso/connectivity/IAP/%s/wlan_wepkey2
/system/osso/connectivity/IAP/%s/wlan_wepkey3
/system/osso/connectivity/IAP/%s/wlan_wepkey4
/system/osso/connectivity/IAP/%s/wlan_security
/system/osso/connectivity/IAP/%s/
/system/osso/connectivity/IAP/wlan_tx_power

wlancond
/system/osso/connectivity/IAP/allow_wep_ciphers_in_WPA
/system/osso/connectivity/IAP/wlan_sleep_timeout
/system/osso/connectivity/IAP/inactive_wlan_sleep_timeout
/system/osso/connectivity/IAP/wlancond_debug_level

eapd
/system/osso/connectivity/IAP/%s/name
/system/osso/connectivity/IAP/%s/temporary
/system/osso/connectivity/IAP/%s/type
/system/osso/connectivity/IAP/%s/EAPOL_CORE_send_start_interval
/system/osso/connectivity/IAP/%s/EAPOL_CORE_starts_max_count
/system/osso/connectivity/IAP/%s/EAPOL_key_state_TEST_group_key_update
/system/osso/connectivity/IAP/%s/EAPOL_key_state_allow_missing_PMKID_in_message_1
/system/osso/connectivity/IAP/%s/EAPOL_key_state_allow_non_zero_mic_in_message_1
/system/osso/connectivity/IAP/%s/EAPOL_key_state_handshake_timeout
/system/osso/connectivity/IAP/%s/EAPOL_key_state_indicate_pmkid_to_lower_layer
/system/osso/connectivity/IAP/%s/EAPOL_key_state_pmksa_caching_timeout
/system/osso/connectivity/IAP/%s/EAPOL_key_state_retransmission_counter
/system/osso/connectivity/IAP/%s/EAPOL_key_state_retransmission_time
/system/osso/connectivity/IAP/%s/EAPOL_key_state_skip_PMKID_key_data_in_message_1
/system/osso/connectivity/IAP/%s/EAP_CORE_failure_received_timeout
/system/osso/connectivity/IAP/%s/EAP_CORE_process_EAP_Nak_immediately
/system/osso/connectivity/IAP/%s/EAP_CORE_remove_session_timeout
/system/osso/connectivity/IAP/%s/EAP_CORE_retransmission_counter
/system/osso/connectivity/IAP/%s/EAP_CORE_session_timeout
/system/osso/connectivity/IAP/%s/EAP_CORE_use_eap_expanded_type
/system/osso/connectivity/IAP/%s/EAP_CORE_wait_eap_request_type_timeout
/system/osso/connectivity/IAP/%s/EAP_FAST_send_piggypacked_eap_identity_request
/system/osso/connectivity/IAP/%s/EAP_GTC_identity
/system/osso/connectivity/IAP/%s/EAP_GTC_passcode
/system/osso/connectivity/IAP/%s/EAP_GTC_use_eap_expanded_type
/system/osso/connectivity/IAP/%s/EAP_MSCHAPV2_do_wrong_password_tests
/system/osso/connectivity/IAP/%s/EAP_MSCHAPV2_password
/system/osso/connectivity/IAP/%s/EAP_MSCHAPV2_password_prompt
/system/osso/connectivity/IAP/%s/EAP_MSCHAPV2_use_eap_expanded_type
/system/osso/connectivity/IAP/%s/EAP_MSCHAPV2_use_implicit_challenge
/system/osso/connectivity/IAP/%s/EAP_MSCHAPV2_username
/system/osso/connectivity/IAP/%s/EAP_SECURID_identity
/system/osso/connectivity/IAP/%s/EAP_SECURID_passcode
/system/osso/connectivity/IAP/%s/EAP_SECURID_use_eap_expanded_type
/system/osso/connectivity/IAP/%s/EAP_SESSION_use_reset_session
/system/osso/connectivity/IAP/%s/EAP_SIMPLE_CONFIG_check_identifier_of_eap_identity _response
/system/osso/connectivity/IAP/%s/EAP_SIMPLE_CONFIG_check_nai_realm
/system/osso/connectivity/IAP/%s/EAP_SIMPLE_CONFIG_device_password
/system/osso/connectivity/IAP/%s/EAP_SIMPLE_CONFIG_server_device_password
/system/osso/connectivity/IAP/%s/EAP_SIMPLE_CONFIG_test_version
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_accepted_PEAP_versions
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_check_identifier_of_eap_identity_resp onse
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_check_nai_realm
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_cipher_suite
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_client_certificate_file
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_manual_realm
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_manual_username
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_max_count_of_session_resumes
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_server_accepted_PEAP_versions
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_use_eap_expanded_type
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_use_manual_realm
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_use_manual_username
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_use_tppd_tls_peap
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_used_PEAP_version
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_wait_eap_success_packet
/system/osso/connectivity/IAP/%s/EAP_TLS_server_use_tppd_peapv1_acknowledge_hack
/system/osso/connectivity/IAP/%s/EAP_TLS_test_version
/system/osso/connectivity/IAP/%s/EAP_TLS_use_tppd_peapv1_acknowledge_hack
/system/osso/connectivity/IAP/%s/EAP_TRACE_activate_only_trace_masks_always_and_err or
/system/osso/connectivity/IAP/%s/EAP_TRACE_activate_trace_on_error
/system/osso/connectivity/IAP/%s/EAP_TRACE_disable_traces
/system/osso/connectivity/IAP/%s/EAP_TRACE_enable_message_data_traces
/system/osso/connectivity/IAP/%s/EAP_TRACE_enable_ok_return_traces
/system/osso/connectivity/IAP/%s/EAP_TRACE_enable_timer_queue_traces
/system/osso/connectivity/IAP/%s/EAP_TRACE_enable_timer_traces
/system/osso/connectivity/IAP/%s/EAP_certificate_password
/system/osso/connectivity/IAP/%s/EAP_default_type
/system/osso/connectivity/IAP/%s/EAP_disable_certificate_check
/system/osso/connectivity/IAP/%s/EAP_manual_username
/system/osso/connectivity/IAP/%s/EAP_outer_identity_decoration
/system/osso/connectivity/IAP/%s/EAP_outer_identity_routing
/system/osso/connectivity/IAP/%s/EAP_server_default_type
/system/osso/connectivity/IAP/%s/EAP_use_manual_username
/system/osso/connectivity/IAP/%s/EAP_wpa_preshared_key
/system/osso/connectivity/IAP/%s/EAP_wpa_preshared_passphrase
/system/osso/connectivity/IAP/%s/PEAP_accepted_tunneled_server_types
/system/osso/connectivity/IAP/%s/PEAP_allow_tunneled_session_resumption
/system/osso/connectivity/IAP/%s/PEAP_server_allow_tunneled_session_resumption
/system/osso/connectivity/IAP/%s/PEAP_tunneled_eap_type
/system/osso/connectivity/IAP/%s/PEAP_tunneled_types
/system/osso/connectivity/IAP/%s/PEAPv1_server_use_extensions_request
/system/osso/connectivity/IAP/%s/SIMPLE_CONFIG_error_message_received_timeout
/system/osso/connectivity/IAP/%s/TLS_client_allows_empty_certificate_authorities_li st
/system/osso/connectivity/IAP/%s/TLS_server_authenticates_client
/system/osso/connectivity/IAP/%s/TLS_server_authenticates_client_policy_in_client
/system/osso/connectivity/IAP/%s/TLS_server_authenticates_client_policy_in_server
/system/osso/connectivity/IAP/%s/TLS_server_offers_new_session_id
/system/osso/connectivity/IAP/%s/TLS_server_sends_empty_certificate_authorities_lis t
/system/osso/connectivity/IAP/%s/TLS_use_separate_tls_record
/system/osso/connectivity/IAP/%s/WPA_PSK
/system/osso/connectivity/IAP/%s/wlan_security
/system/osso/connectivity/IAP/%s/wlan_ssid
/system/osso/connectivity/IAP/%s/wlan_wepdefkey
/system/osso/connectivity/IAP/%s/wlan_wepkey1
/system/osso/connectivity/IAP/%s/wlan_wepkey2
/system/osso/connectivity/IAP/%s/wlan_wepkey3
/system/osso/connectivity/IAP/%s/wlan_wepkey4

The %s is replaced with the unique GUID for each iap that exists.

Next up I will document which of those keys are referenced by things other than the WiFi stack.
 

The Following 3 Users Say Thank You to jonwil For This Useful Post:
Posts: 567 | Thanked: 2,965 times | Joined on Oct 2009
#5
Turns out that libicd-network-ipv4.so isn't used by the GPRS plugin after all and can therefore be considered part of the WiFi stack.
It accesses the following gconf keys:
/system/osso/connectivity/IAP/%s/ipv4_autodns
/system/osso/connectivity/IAP/linklocal_wlan_infra
/system/osso/connectivity/IAP/%s/ipv4_dns1
/system/osso/connectivity/IAP/%s/ipv4_dns2
/system/osso/connectivity/IAP/%s/ipv4_dns3
/system/osso/connectivity/IAP/%s/ipv4_type
/system/osso/connectivity/IAP/%s/ipv4_address
/system/osso/connectivity/IAP/%s/ipv4_netmask
/system/osso/connectivity/IAP/%s/ipv4_gateway
 

The Following 3 Users Say Thank You to jonwil For This Useful Post:
Posts: 567 | Thanked: 2,965 times | Joined on Oct 2009
#6
icd2 references:
/system/osso/connectivity/IAP/%s/name
/system/osso/connectivity/IAP/%s/temporary
/system/osso/connectivity/IAP/%s/type
/system/osso/connectivity/IAP/%s/wlan_security

libconic.so.0.0.0 references:
/system/osso/connectivity/IAP/%s/name
/system/osso/connectivity/IAP/%s/temporary
/system/osso/connectivity/IAP/%s/type

More to come later when I investigate libconnsettings.so.0.0.0, libconnui.so.0.0.0, libconnui_iapsettings.so.0.0.0, libiap_wizard_wlan.so, libicd_policy_always_online.so, libicd_policy_any.so, libicd_settings.so.1.0.0, libinternetsettings.so, libqicdbearer.so, libQtNetwork.so.4.7.0 and anything I can find in extras-* that references this stuff (if any of the above libraries expose functions where the caller of the function determines which entry under /system/osso/connectivity/IAP to return obviously I will investigate any users of that function.
 

The Following 3 Users Say Thank You to jonwil For This Useful Post:
Posts: 567 | Thanked: 2,965 times | Joined on Oct 2009
#7
libconnsettings.so.0.0.0 exposes an API that is in turn used by libconninet.so.0.0.0. That is in turn used by libQtBearer.so.1.0.2.

libQtBearer.so.1.0.2 references the following gconf keys:
/system/osso/connectivity/IAP/%s/name
/system/osso/connectivity/IAP/%s/type
/system/osso/connectivity/IAP/%s/temporary
/system/osso/connectivity/IAP/%s/wlan_security
/system/osso/connectivity/IAP/%s/EAP_wpa2_only_mode
/system/osso/connectivity/IAP/%s/wlan_ssid

libconnui.so.0.0.0 references:
/system/osso/connectivity/IAP/%s/name
/system/osso/connectivity/IAP/%s/type
/system/osso/connectivity/IAP/%s/temporary
/system/osso/connectivity/IAP/%s/wlan_ssid
/system/osso/connectivity/IAP/wlan_tx_power

libconnui_iapsettings.so.0.0.0 references:
/system/osso/connectivity/IAP/%s/type
/system/osso/connectivity/IAP/%s/temporary
/system/osso/connectivity/IAP/wlan_tx_power
/system/osso/connectivity/IAP/%s/EAP_GTC_identity
/system/osso/connectivity/IAP/%s/EAP_MSCHAPV2_password
/system/osso/connectivity/IAP/%s/EAP_MSCHAPV2_username
/system/osso/connectivity/IAP/%s/EAP_TLS_PEAP_client_certificate_file
/system/osso/connectivity/IAP/%s/EAP_default_type
/system/osso/connectivity/IAP/%s/EAP_wpa_preshared_passphrase
/system/osso/connectivity/IAP/%s/PEAP_tunneled_eap_type
/system/osso/connectivity/IAP/%s/ipv4_address
/system/osso/connectivity/IAP/%s/ipv4_autodns
/system/osso/connectivity/IAP/%s/ipv4_dns1
/system/osso/connectivity/IAP/%s/ipv4_dns2
/system/osso/connectivity/IAP/%s/ipv4_gateway
/system/osso/connectivity/IAP/%s/ipv4_netmask
/system/osso/connectivity/IAP/%s/ipv4_type
/system/osso/connectivity/IAP/%s/wlan_security
/system/osso/connectivity/IAP/%s/wlan_ssid
/system/osso/connectivity/IAP/%s/wlan_hidden
/system/osso/connectivity/IAP/%s/wlan_wepkey1

libiap_dialog_password.so references:
/system/osso/connectivity/IAP/%s/type
/system/osso/connectivity/IAP/%s/EAP_MSCHAPV2_password_prompt
/system/osso/connectivity/IAP/%s/EAP_MSCHAPV2_password
/system/osso/connectivity/IAP/%s/EAP_MSCHAPV2_username

libiap_dialog_others.so references:
/system/osso/connectivity/IAP/%s/EAP_wpa_preshared_key
/system/osso/connectivity/IAP/%s/EAP_wpa_preshared_passphrase

libiap_dialog_wps.so references:
/system/osso/connectivity/IAP/%s/EAP_SIMPLE_CONFIG_device_password

libiap_wizard_wlan.so references:
/system/osso/connectivity/IAP/wlan_tx_power

libicd_policy_any.so references:
/system/osso/connectivity/IAP/%s/type

libicd_settings.so.1.0.0 references:
/system/osso/connectivity/IAP/%s/type

libqicdbearer.so references:
/system/osso/connectivity/IAP/%s/name
/system/osso/connectivity/IAP/%s/type
/system/osso/connectivity/IAP/%s/temporary
/system/osso/connectivity/IAP/%s/EAP_wpa2_only_mode
/system/osso/connectivity/IAP/%s/wlan_ssid
/system/osso/connectivity/IAP/%s/wlan_security

libQtNetwork.so.4.7.0 references:
/system/osso/connectivity/IAP/%s/name

Unless I missed something (which is entirely possible) that should be details of everything in gconf that might be relavent for replacing the WiFi stack.

Coming up next, some more dbus information:
 

The Following User Says Thank You to jonwil For This Useful Post:
Posts: 567 | Thanked: 2,965 times | Joined on Oct 2009
#8
This is a reference to the relavent dbus method calls and signals that are referenced in some way by the parts of the WiFi stack:

eapd references:
com.nokia.eap.request.wpa_ie_push
com.nokia.eap.request.disconnect
com.nokia.eap.request.status
com.nokia.eap.request.wpa_mic_failure
com.nokia.eap.request.disassociate
com.nokia.eap.request.associate
com.nokia.eap.request.interface
com.nokia.eap.request.check_pmksa_cache
com.nokia.eap.signal.disconnected
com.nokia.eap.signal.wps_fail
com.nokia.eap.signal.wps_success
com.nokia.eap.signal.auth_status
com.nokia.icd_ui.show_private_key_passwd_dlg
com.nokia.icd_ui.show_gtc_dlg
com.nokia.icd_ui.show_server_cert_dlg
com.nokia.icd_ui.show_mschap_change_dlg
com.nokia.icd_ui.show_passwd_dlg
com.nokia.icd_ui.passwd
com.nokia.icd_ui.mschap_change
com.nokia.icd_ui.gtc_response
com.nokia.icd_ui.private_key_passwd
com.nokia.icd_ui.server_cert
com.nokia.wlancond.request.set_powersave
com.nokia.wlancond.request.disassociate
com.nokia.wlancond.request.set_pmksa

wlancond references:
com.nokia.eap.request.check_pmksa_cache
com.nokia.eap.request.disassociate
com.nokia.eap.request.associate
com.nokia.eap.request.wpa_mic_failure
com.nokia.eap.request.wpa_ie_push
com.nokia.wlancond.request.settings_and_connect
com.nokia.wlancond.request.scan
com.nokia.wlancond.request.status
com.nokia.wlancond.request.interface
com.nokia.wlancond.request.connection_status
com.nokia.wlancond.request.set_pmksa
com.nokia.wlancond.request.set_powersave
com.nokia.wlancond.request.disconnect
com.nokia.wlancond.request.disassociate
com.nokia.wlancond.signal.registrar_error
com.nokia.wlancond.signal.disconnected
com.nokia.wlancond.signal.connected
com.nokia.wlancond.signal.scan_results

libicd_network_eap.so references:
com.nokia.eap.request.interface
com.nokia.eap.request.nai_update_req
com.nokia.eap.signal.auth_status
com.nokia.eap.signal.disconnected
com.nokia.eap.signal.wps_fail
com.nokia.eap.signal.wps_success

libicd_network_ipv4.so references:
com.nokia.icd.autoconf.autoconf_changed

libicd_network_wlan.so references:
com.nokia.wlancond.request.status
com.nokia.wlancond.request.disconnect
com.nokia.wlancond.request.set_powersave
com.nokia.wlancond.request.settings_and_connect
com.nokia.wlancond.signal.scan_results
com.nokia.wlancond.signal.connected
com.nokia.wlancond.signal.disconnected
com.nokia.wlancond.signal.registrar_error

libicd_network_wps.so references:
com.nokia.eap.signal.wps_success
com.nokia.wlancond.request.scan
com.nokia.wlancond.signal.scan_results
com.nokia.wps_ui.method_sig
com.nokia.wps_ui.show_select_method

Other users of those same dbus interfaces:
50_ipv4_network_setup (shell script) references:
com.nokia.icd.autoconf.autoconf_changed

libiap_dialog_wps.so references:
com.nokia.eap.signal.wps_success
com.nokia.wps_ui.method_sig
com.nokia.wps_ui.show_select_method

libconnui_iapsettings.so.0.0.0 references:
com.nokia.wlancond.request.scan
com.nokia.wlancond.signal.scan_results

libiap_dialog_gtc_challenge.so references:
com.nokia.icd_ui.show_gtc_dlg
com.nokia.icd_ui.gtc_response

libiap_dialog_mschap_change.so references:
com.nokia.icd_ui.show_mschap_change_dlg
com.nokia.icd_ui.mschap_change

libiap_dialog_password.so references:
com.nokia.icd_ui.show_passwd_dlg
com.nokia.icd_ui.passwd

libiap_dialog_private_key_pw.so references:
com.nokia.icd_ui.show_private_key_passwd_dlg
com.nokia.icd_ui.private_key_passwd

libiap_dialog_server_cert.so references:
com.nokia.icd_ui.show_server_cert_dlg
com.nokia.icd_ui.server_cert

And now that should be all the dbus and gconf and other information relavent to replacing the WiFi stack.
 

The Following 2 Users Say Thank You to jonwil For This Useful Post:
Reply

Thread Tools

 
Forum Jump


All times are GMT. The time now is 15:30.