网易邮箱显示附件上传不成功,请重试!(错误码:FR_INVALID_REQUEST) 的解决方法

本文介绍了解决网易邮箱在特定环境下上传附件时出现错误码FR_INVALID_REQUEST的问题。通过调整IE浏览器的设置,如更改URL编码方式或邮箱参数配置,可以有效避免此问题的发生。
部署运行你感兴趣的模型镜像

  近段时间,单位里的部分电脑使用网易邮箱出了问题:上传附件的过程中卡住,最后给出提示:

请重试!(错误码:FR_INVALID_REQUEST)

  单位里的电脑都在一个网域网里,通过同一条线共享上网的,怎么有些电脑就是闹别扭呢?

  研究后发现出问题的电脑有一个共同的特征,就是都装了360卫士,不过把360卫士的实时保护关闭后,问题并没有得到解决。

  把出问题的电脑重装了Windows系统,开始正常,再装了其它一些软件后,又出毛病了。

  总不能每次都重装系统罢,反复试验,发现1个起作用的方法。

  关闭所有IE窗口,进入控制面板,打开Internet选项,在“高级”选项卡里的“设置”中找到“始终以 UTF-8 发送 URL”选项,如果原来是钩上的就取消,如果原来没有钩上,那就钩上。确定,保存设置。

  还有1个没有证实过的方法:

  进入邮箱后,修改邮箱的 参数设置,将“发信后,已发送邮件:”项设置为 不保存。

  至于下面的方法,好像都没有用:

  1、删除IE的cookies和临时文件

  打开Internet选项,在“常规”选项卡上做删除internet临时文件和删除cookies的操作,保存,确定。

  2、降低安全级别。

  打开Internet选项,在“安全”选项卡上将安全级别调为中低。

  3、禁用第三方加载项。

  打开Internet选项,在“程序”选项卡,点击“管理加载项”,把所有非Windows系统自带的第三方加载项。

  4、重置IE设置。

  打开Internet选项,在“高级”选项卡中,点击“重置”。

  5、将杀毒软件、防火墙等软件禁用或关闭实时保护。

  6、安装IE7或IE8。

  7、登录邮箱时选择“简洁风格”。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

根据BAPI_ALM_ORDER_MAINTAIN源代码分析原因: FUNCTION bapi_alm_order_maintain. *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" VALUE(IV_MMSRV_EXTERNAL_MAINTENACE) TYPE BAPI_FLAG OPTIONAL *" TABLES *" IT_METHODS STRUCTURE BAPI_ALM_ORDER_METHOD *" IT_HEADER STRUCTURE BAPI_ALM_ORDER_HEADERS_I OPTIONAL *" IT_HEADER_UP STRUCTURE BAPI_ALM_ORDER_HEADERS_UP OPTIONAL *" IT_HEADER_SRV STRUCTURE BAPI_ALM_ORDER_SRVDAT_E OPTIONAL *" IT_HEADER_SRV_UP STRUCTURE BAPI_ALM_ORDER_SRVDAT_UP OPTIONAL *" IT_USERSTATUS STRUCTURE BAPI_ALM_ORDER_USRSTAT OPTIONAL *" IT_PARTNER STRUCTURE BAPI_ALM_ORDER_PARTN_MUL OPTIONAL *" IT_PARTNER_UP STRUCTURE BAPI_ALM_ORDER_PARTN_MUL_UP OPTIONAL *" IT_OPERATION STRUCTURE BAPI_ALM_ORDER_OPERATION OPTIONAL *" IT_OPERATION_UP STRUCTURE BAPI_ALM_ORDER_OPERATION_UP OPTIONAL *" IT_RELATION STRUCTURE BAPI_ALM_ORDER_RELATION OPTIONAL *" IT_RELATION_UP STRUCTURE BAPI_ALM_ORDER_RELATION_UP OPTIONAL *" IT_COMPONENT STRUCTURE BAPI_ALM_ORDER_COMPONENT OPTIONAL *" IT_COMPONENT_UP STRUCTURE BAPI_ALM_ORDER_COMPONENT_UP OPTIONAL *" IT_OBJECTLIST STRUCTURE BAPI_ALM_ORDER_OBJECTLIST OPTIONAL *" IT_OBJECTLIST_UP STRUCTURE BAPI_ALM_ORDER_OLIST_UP OPTIONAL *" IT_OLIST_RELATION STRUCTURE BAPI_ALM_OLIST_RELATION OPTIONAL *" IT_TEXT STRUCTURE BAPI_ALM_TEXT OPTIONAL *" IT_TEXT_LINES STRUCTURE BAPI_ALM_TEXT_LINES OPTIONAL *" IT_SRULE STRUCTURE BAPI_ALM_ORDER_SRULE OPTIONAL *" IT_SRULE_UP STRUCTURE BAPI_ALM_ORDER_SRULE_UP OPTIONAL *" IT_TASKLISTS STRUCTURE BAPI_ALM_ORDER_TASKLISTS_I OPTIONAL *" EXTENSION_IN STRUCTURE BAPIPAREX OPTIONAL *" RETURN STRUCTURE BAPIRET2 OPTIONAL *" ET_NUMBERS STRUCTURE BAPI_ALM_NUMBERS OPTIONAL *" IT_REFORDER_ITEM STRUCTURE BAPI_REFORDER_ITEM_I OPTIONAL *" IT_REFORDER_ITEM_UP STRUCTURE BAPI_REFORDER_ITEM_UP OPTIONAL *" IT_REFORDER_SERNO_OLIST_INS STRUCTURE *" BAPI_REFORDER_SERNO_OLIST_I OPTIONAL *" IT_REFORDER_SERNO_OLIST_DEL STRUCTURE *" BAPI_REFORDER_SERNO_OLIST_I OPTIONAL *" IT_PRT STRUCTURE BAPI_ALM_ORDER_PRT_I OPTIONAL *" IT_PRT_UP STRUCTURE BAPI_ALM_ORDER_PRT_UP OPTIONAL *" IT_REFORDER_OPERATION STRUCTURE BAPI_REFORDER_OPERATION *" OPTIONAL *" IT_SERVICEOUTLINE STRUCTURE BAPI_ALM_SRV_OUTLINE OPTIONAL *" IT_SERVICEOUTLINE_UP STRUCTURE BAPI_ALM_SRV_OUTLINE_UP *" OPTIONAL *" IT_SERVICELINES STRUCTURE BAPI_ALM_SRV_SERVICE_LINE OPTIONAL *" IT_SERVICELINES_UP STRUCTURE BAPI_ALM_SRV_SERVICE_LINE_UP *" OPTIONAL *" IT_SERVICELIMIT STRUCTURE BAPI_ALM_SRV_LIMIT_DATA OPTIONAL *" IT_SERVICELIMIT_UP STRUCTURE BAPI_ALM_SRV_LIMIT_DATA_UP *" OPTIONAL *" IT_SERVICECONTRACTLIMITS STRUCTURE *" BAPI_ALM_SRV_CONTRACT_LIMITS OPTIONAL *" IT_SERVICECONTRACTLIMITS_UP STRUCTURE *" BAPI_ALM_SRV_CONTRACT_LIMITS_U OPTIONAL *" ET_NOTIFICATION_NUMBERS STRUCTURE BAPI_ALM_NOTIF_NUMBERS *" OPTIONAL *" IT_PERMIT STRUCTURE BAPI_ALM_ORDER_PERMIT OPTIONAL *" IT_PERMIT_UP STRUCTURE BAPI_ALM_ORDER_PERMIT_UP OPTIONAL *" IT_PERMIT_ISSUE STRUCTURE BAPI_ALM_ORDER_PERMITISSUE OPTIONAL *" IT_ESTIMATED_COSTS STRUCTURE BAPI_ALM_ORDER_COSTS_EST_I *" OPTIONAL *" IT_HEADER_JVA STRUCTURE BAPI_ALM_ORDER_JVA OPTIONAL *" IT_HEADER_JVA_UP STRUCTURE BAPI_ALM_ORDER_JVA_UP OPTIONAL *" IT_ADDITIONAL_TEXT STRUCTURE BAPI_ALM_CC4_ADDITIONAL_TEXT *" OPTIONAL *"---------------------------------------------------------------------- ENHANCEMENT-POINT bapi_alm_order_maintain_g8 SPOTS es_saplibapi_alm_order STATIC. ENHANCEMENT-POINT bapi_alm_order_maintain_g6 SPOTS es_saplibapi_alm_order. * BAPI Funktionsbaustein zum Bearbeiten von ALM Aufträgen (PM/CS) * Die gewünschten Funktionen müssen über eine Methodentabelle * übergeben werden. Darin stehen die auszuführenden Methoden. * Die dazugehörigen Daten sind in den einzelnen Datentabellen * zuzuordnen. * Weitere Informationen befinden sich im BAPI Explorer unter * Instandhaltungsabwicklung bzw. Serviceabwicklung * Datendefinitionen *************************************** DATA lt_methods TYPE bapi_alm_order_method_t. * Zu bearbeitende Aufträge, die gelesen werden müssen DATA lt_orders TYPE almb_ord_pre_tab. * Methodenreihenfolge DATA lt_method_level TYPE almb_proc_level_tab. * Interne Datentabellen *********************************** * Auftragsköpfe DATA lt_caufvd TYPE almb_caufvd_tab_int. DATA lt_caufvd_up TYPE almb_caufvd_up_tab_int. * Servicedaten Auftragsköpfe DATA lt_pmsdo TYPE almb_caufvd_srv_tab_int. DATA lt_pmsdo_up TYPE almb_caufvd_srv_up_tab_int. * Auftragsköpfe (extern) DATA lt_bapihead TYPE almb_caufvd_tab. DATA ls_bapihead TYPE LINE OF almb_caufvd_tab. DATA lt_bapihead_up TYPE almb_caufvd_up_tab. DATA ls_bapihead_up TYPE LINE OF almb_caufvd_up_tab. DATA lt_bapihead_old TYPE almb_caufvd_tab. DATA lt_bapihead_old_up TYPE almb_caufvd_up_tab. * Servicedaten Auftragsköpfe (extern) DATA lt_bapisrvcdata TYPE almb_caufvd_srv_tab. DATA ls_bapisrvcdata TYPE LINE OF almb_caufvd_srv_tab. DATA lt_bapisrvcdata_up TYPE almb_caufvd_srv_up_tab. DATA ls_bapisrvcdata_up TYPE LINE OF almb_caufvd_srv_up_tab. DATA lt_bapisrvcdata_old TYPE almb_caufvd_srv_tab. DATA lt_bapisrvcdata_old_up TYPE almb_caufvd_srv_up_tab. * Auftragskopfdaten nach BADI für Abwärtskompatibilität DATA ls_header TYPE bapi_alm_order_headers_i. DATA ls_header_up TYPE bapi_alm_order_headers_up. DATA ls_header_srv TYPE bapi_alm_order_srvdat_e. DATA ls_header_srv_up TYPE bapi_alm_order_srvdat_up. DATA lt_header TYPE TABLE OF bapi_alm_order_headers_i. DATA lt_header_up TYPE TABLE OF bapi_alm_order_headers_up. DATA lt_header_srv TYPE TABLE OF bapi_alm_order_srvdat_e. DATA lt_header_srv_up TYPE TABLE OF bapi_alm_order_srvdat_up. * Userstatus DATA lt_userstatus TYPE almb_userstatus. * Partner DATA lt_partner TYPE almb_partner_tab. DATA lt_partner_up TYPE almb_partner_up_tab. * Vorgänge DATA lt_afvgd TYPE almb_afvgd_tab. DATA lt_afvgd_up TYPE almb_afvgd_up_tab. * Anordnungsbeziehungen DATA lt_afabd TYPE almb_afabd_tab. DATA lt_afabd_up TYPE almb_afabd_up_tab. * Komponenten DATA lt_resbd TYPE almb_resbd_tab. DATA lt_resbd_up TYPE almb_resbd_up_tab. * Objektliste DATA lt_riwol TYPE almb_riwol_tab. DATA lt_riwol_up TYPE almb_riwol_up_tab. * Objectlist: Relation Operation to Objectlist DATA lt_olist_relation TYPE almb_olist_relation_tab. * Task lists DATA lt_tasklists TYPE ibapi_order_tasklists_i_t. * Settlement rules DATA lt_cobl TYPE almb_cobl_tab. DATA lt_cobl_up TYPE almb_cobl_up_tab. * Langtexte DATA lt_text TYPE almb_text_tab. DATA lt_text_add TYPE almb_cc4_add_text_tab. "note 2756658 DATA lt_text_lines TYPE tlinetab. * Rückgabe der Nachrichten DATA lt_messages TYPE bal_t_msg. DATA ls_messages TYPE bal_s_msg. DATA ls_return LIKE LINE OF return[]. DATA lv_error TYPE sy-subrc. *Refurbishment order DATA lt_afpod TYPE ibapi_afpod_tt. DATA lt_afpod_resbd TYPE ibapi_reforder_comp_tt. DATA lt_serno_olist_ins TYPE reford_serno_olist_t. DATA lt_serno_olist_del TYPE reford_serno_olist_t. DATA lt_afpod_up TYPE ibapi_afpod_update_tt. DATA lt_afpod_resbd_up TYPE ibapi_reforder_comp_update_tt. DATA lt_reford_afvgd TYPE almb_afvgd_tab. *PRTs DATA lt_prt TYPE bapi_alm_order_prt_i_t. DATA lt_prt_up TYPE bapi_alm_order_prt_up_t. *Service packages DATA lt_serviceoutline TYPE bapi_alm_srv_outline_t. DATA lt_serviceoutline_up TYPE bapi_alm_srv_outline_up_t. DATA lt_servicelines TYPE bapi_alm_srv_service_line_t. DATA lt_servicelines_up TYPE bapi_alm_srv_service_line_up_t. DATA lt_servicelimit TYPE bapi_alm_srv_limit_data_t. DATA lt_servicelimit_up TYPE bapi_alm_srv_limit_data_up_t. DATA lt_servicecontractlimits TYPE bapi_alm_srv_contract_limit_t. DATA lt_servicecontractlimits_up TYPE bapi_alm_srv_contr_limits_u_t. * Note 1989741 - begin DATA: ls_extension_up TYPE almb_extension_up. DATA: lt_extension_up TYPE almb_extension_up_tab. * Note 1989741 - end *Permits DATA lt_permit TYPE eam_t_permit_order. DATA lt_permit_up TYPE eam_t_permit_order_up. DATA lt_permit_issue TYPE eam_t_permit_issue. * Estimated costs DATA: lt_est_cost TYPE bapi_alm_order_costs_est_i_tt. " 1672966 EAMCC PM110 * Settlement profiles DATA: lt_settlmt_profile TYPE almb_settlmt_profile_tab. * >>>>> Begin note 2304265: DFPS specific variables data lv_method_del type abap_bool. * <<<<< End note 2304265 * DATA lt_serno_olist_up TYPE REFORD_SERNO_OLIST_UPDATE_TT. FIELD-SYMBOLS <fs_olist_relation> LIKE LINE OF lt_olist_relation. FIELD-SYMBOLS <fs_methods> LIKE LINE OF lt_methods. "1837200 cl_eam_usage=>insert('BAPI_ALM_ORDER_MAINTAIN'). * BADIs * Vorwärtsdeklaration für exit handler BAdI CLASS cl_exithandler DEFINITION LOAD. * Interfacereferenz für BAdI STATICS sr_modify_input_data TYPE REF TO if_ex_ibapi_alm_ord_modify. STATICS sv_badiactive. * Konstante für BAdI-Referenzierung CONSTANTS lc_badiname TYPE exit_def VALUE 'IBAPI_ALM_ORD_MODIFY'. * start FLE MATNR BAPI Changes DATA: ls_fnames TYPE cl_matnr_chk_mapper=>ts_matnr_bapi_fnames, lt_fnames_hdr TYPE cl_matnr_chk_mapper=>tt_matnr_bapi_fname, lt_fnames_hdr_srv TYPE cl_matnr_chk_mapper=>tt_matnr_bapi_fname, lt_fnames_comp TYPE cl_matnr_chk_mapper=>tt_matnr_bapi_fname, lt_fnames_obj_list TYPE cl_matnr_chk_mapper=>tt_matnr_bapi_fname, lt_fnames_oper TYPE cl_matnr_chk_mapper=>tt_matnr_bapi_fname, lt_fnames_prt TYPE cl_matnr_chk_mapper=>tt_matnr_bapi_fname, lt_fnames_ref_ord_itm TYPE cl_matnr_chk_mapper=>tt_matnr_bapi_fname, lt_fnames_ref_ord_opr TYPE cl_matnr_chk_mapper=>tt_matnr_bapi_fname. DATA: lt_matnr_data_to_x_key_fnames TYPE cl_matnr_chk_mapper=>tt_matnr_data_to_x_key_fnames. DATA: lt_matnr_dta_2_xkey_fnames_hdr TYPE cl_matnr_chk_mapper=>tt_matnr_data_to_x_key_fnames. DATA: lt_mtnr_dta2xkey_fnames_hdrsrv TYPE cl_matnr_chk_mapper=>tt_matnr_data_to_x_key_fnames. DATA: lt_matnr_dta_2_xkey_fnames_opr TYPE cl_matnr_chk_mapper=>tt_matnr_data_to_x_key_fnames. DATA: lt_matnr_dta_2_xkey_fnames_cmp TYPE cl_matnr_chk_mapper=>tt_matnr_data_to_x_key_fnames. DATA: lt_mtnr_dta2xkey_fnames_rfoitm TYPE cl_matnr_chk_mapper=>tt_matnr_data_to_x_key_fnames. DATA: ls_matnr_data_to_x_key_fnames LIKE LINE OF lt_matnr_data_to_x_key_fnames. DATA: ls_matnr_data_to_x_line_ass TYPE cl_matnr_chk_mapper=>ts_matnr_data_to_x_line_ass. DATA: lt_matnr_data_to_x_line_ass TYPE cl_matnr_chk_mapper=>tt_matnr_data_to_x_line_ass. DATA: lv_linecount_data TYPE i. DATA: lv_linecount_data_up TYPE i. * MATERIAL CLEAR ls_fnames. ls_fnames-int = 'MATERIAL'. ls_fnames-ext = 'MATERIAL_EXTERNAL'. ls_fnames-vers = 'MATERIAL_VERSION'. ls_fnames-guid = 'MATERIAL_GUID'. ls_fnames-long = 'MATERIAL_LONG'. INSERT ls_fnames INTO TABLE lt_fnames_prt. ls_fnames-int_x = 'MATERIAL'. ls_fnames-ext_x = 'MATERIAL'. "no update flag existing, flag of internal field is used ls_fnames-vers_x = 'MATERIAL'. "no update flag existing, flag of internal field is used * ls_fnames-guid_x = 'MATERIAL_GUID'. ls_fnames-long_x = 'MATERIAL_LONG'. INSERT ls_fnames INTO TABLE lt_fnames_hdr. INSERT ls_fnames INTO TABLE lt_fnames_hdr_srv. INSERT ls_fnames INTO TABLE lt_fnames_comp. * ASSEMBLY CLEAR ls_fnames. ls_fnames-int = 'ASSEMBLY'. ls_fnames-ext = 'ASSEMBLY_EXTERNAL'. ls_fnames-vers = 'ASSEMBLY_VERSION'. ls_fnames-guid = 'ASSEMBLY_GUID'. ls_fnames-long = 'ASSEMBLY_LONG'. INSERT ls_fnames INTO TABLE lt_fnames_ref_ord_opr. INSERT ls_fnames INTO TABLE lt_fnames_obj_list. ls_fnames-int_x = 'ASSEMBLY'. ls_fnames-ext_x = 'ASSEMBLY'. "no update flag existing, flag of internal field is used ls_fnames-vers_x = 'ASSEMBLY'. "no update flag existing, flag of internal field is used * ls_fnames-guid_x = 'ASSEMBLY_GUID'. ls_fnames-long_x = 'ASSEMBLY_LONG'. INSERT ls_fnames INTO TABLE lt_fnames_hdr. INSERT ls_fnames INTO TABLE lt_fnames_oper. * SERMAT CLEAR ls_fnames. ls_fnames-int = 'SERMAT'. ls_fnames-ext = 'SERMAT_EXTERNAL'. ls_fnames-vers = 'SERMAT_VERSION'. ls_fnames-guid = 'SERMAT_GUID'. ls_fnames-long = 'SERMAT_LONG'. * ls_fnames-int_x = 'SERMAT'. * ls_fnames-ext_x = 'SERMAT_EXTERNAL'. * ls_fnames-vers_x = 'SERMAT_VERSION'. * ls_fnames-guid_x = 'SERMAT_GUID'. * ls_fnames-long_x = 'SERMAT_LONG'. INSERT ls_fnames INTO TABLE lt_fnames_obj_list. * MATERIAL_TO CLEAR ls_fnames. ls_fnames-int = 'MATERIAL_TO'. ls_fnames-ext = 'MATERIAL_TO_EXTERNAL'. ls_fnames-vers = 'MATERIAL_TO_VERSION'. ls_fnames-guid = 'MATERIAL_TO_GUID'. ls_fnames-long = 'MATERIAL_TO_LONG'. ls_fnames-int_x = 'MATERIAL_TO'. ls_fnames-ext_x = 'MATERIAL_TO'. "no update flag existing, flag of internal field is used ls_fnames-vers_x = 'MATERIAL_TO'. "no update flag existing, flag of internal field is used * ls_fnames-guid_x = 'MATERIAL_TO_GUID'. ls_fnames-long_x = 'MATERIAL_TO_LONG'. INSERT ls_fnames INTO TABLE lt_fnames_ref_ord_itm. * IT_HEADER CLEAR ls_matnr_data_to_x_key_fnames. ls_matnr_data_to_x_key_fnames-data_key_field = 'ORDERID'. ls_matnr_data_to_x_key_fnames-x_key_field = 'ORDERID'. APPEND ls_matnr_data_to_x_key_fnames TO lt_matnr_dta_2_xkey_fnames_hdr. cl_matnr_chk_mapper=>bapi_tables_conv_tab_x_names( EXPORTING iv_int_to_external = abap_false it_fnames = lt_fnames_hdr it_matnr_data_to_x_key_fnames = lt_matnr_dta_2_xkey_fnames_hdr CHANGING ct_matnr = it_header[] ct_matnrx = it_header_up[] EXCEPTIONS excp_matnr_ne = 1 excp_matnr_invalid_input = 2 OTHERS = 3 ). IF sy-subrc NE 0. CALL METHOD cl_matnr_chk_mapper=>bapi_get_last_error IMPORTING ev_return = ls_return. APPEND ls_return TO return. IF ls_return-type NA 'SIW'. RETURN. ENDIF. ENDIF. * IT_HEADER_SRV - No key fields DESCRIBE TABLE it_header_srv[] LINES lv_linecount_data. DESCRIBE TABLE it_header_srv_up[] LINES lv_linecount_data_up. CLEAR lt_matnr_data_to_x_line_ass[]. IF lv_linecount_data = lv_linecount_data_up. lv_linecount_data = 0. WHILE lv_linecount_data LT lv_linecount_data_up. ADD 1 TO lv_linecount_data. ls_matnr_data_to_x_line_ass-ass_x_line_idx = lv_linecount_data. ls_matnr_data_to_x_line_ass-data_line_idx = lv_linecount_data. APPEND ls_matnr_data_to_x_line_ass TO lt_matnr_data_to_x_line_ass. ENDWHILE. ENDIF. cl_matnr_chk_mapper=>bapi_tables_conv_tab_x_idx( EXPORTING iv_int_to_external = abap_false it_fnames = lt_fnames_hdr_srv it_matnr_data_to_x_line_ass = lt_matnr_data_to_x_line_ass CHANGING ct_matnr = it_header_srv[] ct_matnrx = it_header_srv_up[] EXCEPTIONS excp_matnr_ne = 1 excp_matnr_invalid_input = 2 OTHERS = 3 ). IF sy-subrc NE 0. CALL METHOD cl_matnr_chk_mapper=>bapi_get_last_error IMPORTING ev_return = ls_return. APPEND ls_return TO return. IF ls_return-type NA 'SIW'. RETURN. ENDIF. ENDIF. * IT_OPERATION - No key fields * DESCRIBE TABLE it_operation[] LINES lv_linecount_data. * DESCRIBE TABLE it_operation_up[] LINES lv_linecount_data_up. * CLEAR lt_matnr_data_to_x_line_ass[]. * IF lv_linecount_data = lv_linecount_data_up. * lv_linecount_data = 0. * WHILE lv_linecount_data LT lv_linecount_data_up. * ADD 1 TO lv_linecount_data. * ls_matnr_data_to_x_line_ass-ass_x_line_idx = lv_linecount_data. * ls_matnr_data_to_x_line_ass-data_line_idx = lv_linecount_data. * APPEND ls_matnr_data_to_x_line_ass TO lt_matnr_data_to_x_line_ass. * ENDWHILE. * ENDIF. CLEAR lt_matnr_data_to_x_line_ass[]. LOOP AT it_operation_up. READ TABLE it_operation INDEX sy-tabix TRANSPORTING NO FIELDS. IF sy-subrc IS INITIAL. ls_matnr_data_to_x_line_ass-ass_x_line_idx = sy-tabix. ls_matnr_data_to_x_line_ass-data_line_idx = sy-tabix. APPEND ls_matnr_data_to_x_line_ass TO lt_matnr_data_to_x_line_ass. ENDIF. ENDLOOP. cl_matnr_chk_mapper=>bapi_tables_conv_tab_x_idx( EXPORTING iv_int_to_external = abap_false it_fnames = lt_fnames_oper it_matnr_data_to_x_line_ass = lt_matnr_data_to_x_line_ass CHANGING ct_matnr = it_operation[] ct_matnrx = it_operation_up[] EXCEPTIONS excp_matnr_ne = 1 excp_matnr_invalid_input = 2 OTHERS = 3 ). IF sy-subrc NE 0. CALL METHOD cl_matnr_chk_mapper=>bapi_get_last_error IMPORTING ev_return = ls_return. APPEND ls_return TO return. IF ls_return-type NA 'SIW'. RETURN. ENDIF. ENDIF. * IT_COMPONENT - No key fields * DESCRIBE TABLE it_component[] LINES lv_linecount_data. * DESCRIBE TABLE it_component_up[] LINES lv_linecount_data_up. * CLEAR lt_matnr_data_to_x_line_ass[]. * IF lv_linecount_data = lv_linecount_data_up. * lv_linecount_data = 0. * WHILE lv_linecount_data LT lv_linecount_data_up. * ADD 1 TO lv_linecount_data. * ls_matnr_data_to_x_line_ass-ass_x_line_idx = lv_linecount_data. * ls_matnr_data_to_x_line_ass-data_line_idx = lv_linecount_data. * APPEND ls_matnr_data_to_x_line_ass TO lt_matnr_data_to_x_line_ass. * ENDWHILE. * ENDIF. CLEAR lt_matnr_data_to_x_line_ass[]. LOOP AT it_component_up. READ TABLE it_component INDEX sy-tabix TRANSPORTING NO FIELDS. IF sy-subrc IS INITIAL. ls_matnr_data_to_x_line_ass-ass_x_line_idx = sy-tabix. ls_matnr_data_to_x_line_ass-data_line_idx = sy-tabix. APPEND ls_matnr_data_to_x_line_ass TO lt_matnr_data_to_x_line_ass. ENDIF. ENDLOOP. cl_matnr_chk_mapper=>bapi_tables_conv_tab_x_idx( EXPORTING iv_int_to_external = abap_false it_fnames = lt_fnames_comp it_matnr_data_to_x_line_ass = lt_matnr_data_to_x_line_ass CHANGING ct_matnr = it_component[] ct_matnrx = it_component_up[] EXCEPTIONS excp_matnr_ne = 1 excp_matnr_invalid_input = 2 OTHERS = 3 ). IF sy-subrc NE 0. CALL METHOD cl_matnr_chk_mapper=>bapi_get_last_error IMPORTING ev_return = ls_return. APPEND ls_return TO return. IF ls_return-type NA 'SIW'. RETURN. ENDIF. ENDIF. * IT_REFORDER_ITEM CLEAR ls_matnr_data_to_x_key_fnames. ls_matnr_data_to_x_key_fnames-data_key_field = 'ORDERID'. ls_matnr_data_to_x_key_fnames-x_key_field = 'ORDERID'. APPEND ls_matnr_data_to_x_key_fnames TO lt_mtnr_dta2xkey_fnames_rfoitm. cl_matnr_chk_mapper=>bapi_tables_conv_tab_x_names( EXPORTING iv_int_to_external = abap_false it_fnames = lt_fnames_ref_ord_itm it_matnr_data_to_x_key_fnames = lt_mtnr_dta2xkey_fnames_rfoitm CHANGING ct_matnr = it_reforder_item[] ct_matnrx = it_reforder_item_up[] EXCEPTIONS excp_matnr_ne = 1 excp_matnr_invalid_input = 2 OTHERS = 3 ). IF sy-subrc NE 0. CALL METHOD cl_matnr_chk_mapper=>bapi_get_last_error IMPORTING ev_return = ls_return. APPEND ls_return TO return. IF ls_return-type NA 'SIW'. RETURN. ENDIF. ENDIF. * IT_OBJECTLIST * No UP-structure with material field CALL METHOD cl_matnr_chk_mapper=>bapi_tables_conv_tab EXPORTING iv_int_to_external = abap_false it_fnames = lt_fnames_obj_list CHANGING ct_matnr = it_objectlist[] EXCEPTIONS excp_matnr_ne = 1 excp_matnr_invalid_input = 2 OTHERS = 3. IF sy-subrc NE 0. CALL METHOD cl_matnr_chk_mapper=>bapi_get_last_error IMPORTING ev_return = ls_return. APPEND ls_return TO return. IF ls_return-type NA 'SIW'. RETURN. ENDIF. ENDIF. * IT_PRT * No UP-structure with material field CALL METHOD cl_matnr_chk_mapper=>bapi_tables_conv_tab EXPORTING iv_int_to_external = abap_false it_fnames = lt_fnames_prt CHANGING ct_matnr = it_prt[] EXCEPTIONS excp_matnr_ne = 1 excp_matnr_invalid_input = 2 OTHERS = 3. IF sy-subrc NE 0. CALL METHOD cl_matnr_chk_mapper=>bapi_get_last_error IMPORTING ev_return = ls_return. APPEND ls_return TO return. IF ls_return-type NA 'SIW'. RETURN. ENDIF. ENDIF. * IT_REFORDER_OPERATION * No UP-structure CALL METHOD cl_matnr_chk_mapper=>bapi_tables_conv_tab EXPORTING iv_int_to_external = abap_false it_fnames = lt_fnames_ref_ord_opr CHANGING ct_matnr = it_reforder_operation[] EXCEPTIONS excp_matnr_ne = 1 excp_matnr_invalid_input = 2 OTHERS = 3. IF sy-subrc NE 0. CALL METHOD cl_matnr_chk_mapper=>bapi_get_last_error IMPORTING ev_return = ls_return. APPEND ls_return TO return. IF ls_return-type NA 'SIW'. RETURN. ENDIF. ENDIF. * end FLE MATNR BAPI Changes * Initialisierungen *************************************** * setzen BAPI-Flag z.B. für Prüfloserzeugung MOVE 'X' TO gv_bapi_flg. "note 1302002 * Memory refresh CALL FUNCTION 'IBAPI_PROC_INIT_REQUEST'. * Badi initialisieren IF sv_badiactive IS INITIAL. CALL METHOD cl_exithandler=>get_instance EXPORTING exit_name = lc_badiname null_instance_accepted = 'X' CHANGING instance = sr_modify_input_data. sv_badiactive = 'X'. ENDIF. * Retrunparemetertabellen löschen CLEAR return[]. CLEAR et_numbers[]. * globales Bapiflag setzen CALL FUNCTION 'IBAPI_Z_SET_BAPI_FLAG' EXPORTING iv_flag = 'X'. CALL FUNCTION 'DIALOG_GET_STATUS' "Note 1441350 IMPORTING "Note 1441350 dialog_status = gv_dialog. "Note 1441350 CALL FUNCTION 'DIALOG_SET_NO_DIALOG'. "Note 1441350 * Aktionsbuffer für Auftragskopfdaten CALL FUNCTION 'IBAPI_ALM_ORDER_INIT_ACTIONS'. * Application Log initialisieren PERFORM alm_order_msg_log_init. * Tabelle mit Methoden kopieren MOVE it_methods[] TO lt_methods. * start of note 1837200 * usage of method DIALOG together with MMSRV is not supported READ TABLE lt_methods TRANSPORTING NO FIELDS WITH KEY method = 'DIALOG'. IF sy-subrc = 0. LOOP AT lt_methods ASSIGNING <fs_methods> WHERE objecttype CS 'SERVICE'. MESSAGE e137(iwo_bapi2) WITH <fs_methods>-objecttype INTO mess. bapi_message. MESSAGE e113(iwo_bapi2) INTO mess. bapi_message. PERFORM end_bapi CHANGING return[]. PERFORM reset_created_headers USING et_numbers[] lt_method_level. RETURN. ENDLOOP. ENDIF. * end of note 1837200 * Schnittstellendaten in interne Strukturen umwandeln ***** CALL FUNCTION 'IBAPI_PROC_INTERFACE_E2I' EXPORTING it_header = it_header[] it_header_up = it_header_up[] it_header_srv = it_header_srv[] it_header_srv_up = it_header_srv_up[] it_userstatus = it_userstatus[] it_partner = it_partner[] it_partner_up = it_partner_up[] it_operation = it_operation[] it_operation_up = it_operation_up[] it_relation = it_relation[] it_relation_up = it_relation_up[] it_component = it_component[] it_component_up = it_component_up[] it_objectlist = it_objectlist[] it_objectlist_up = it_objectlist_up[] it_olist_relation = it_olist_relation[] it_srule = it_srule[] it_srule_up = it_srule_up[] it_text = it_text[] it_text_lines = it_text_lines[] it_tasklists = it_tasklists[] it_reforder_item = it_reforder_item[] it_reforder_item_up = it_reforder_item_up[] it_reforder_operation = it_reforder_operation[] it_reforder_serno_olist_ins = it_reforder_serno_olist_ins[] it_reforder_serno_olist_del = it_reforder_serno_olist_del[] it_serviceoutline = it_serviceoutline[] it_servicelines = it_servicelines[] it_servicelimit = it_servicelimit[] it_servicecontractlimits = it_servicecontractlimits[] it_serviceoutline_up = it_serviceoutline_up[] it_servicelines_up = it_servicelines_up[] it_servicelimit_up = it_servicelimit_up[] it_servicecontractlimits_up = it_servicecontractlimits_up[] it_permit = it_permit[] it_permit_up = it_permit_up[] it_permit_issue = it_permit_issue[] it_estimated_costs = it_estimated_costs[] " 1672966 EAMCC PM110 it_header_jva = it_header_jva[] it_header_jva_up = it_header_jva_up[] it_text_add = it_additional_text[] "note 2756658 IMPORTING et_caufvd = lt_caufvd et_caufvd_up = lt_caufvd_up et_caufvd_srv = lt_pmsdo et_caufvd_srv_up = lt_pmsdo_up et_userstatus = lt_userstatus et_partner = lt_partner et_partner_up = lt_partner_up et_afvgd = lt_afvgd et_afvgd_up = lt_afvgd_up et_afabd = lt_afabd et_afabd_up = lt_afabd_up et_resbd = lt_resbd et_resbd_up = lt_resbd_up et_riwol = lt_riwol et_riwol_up = lt_riwol_up et_olist_relation = lt_olist_relation et_cobl = lt_cobl et_cobl_up = lt_cobl_up et_thead = lt_text et_tlines = lt_text_lines et_tasklists = lt_tasklists et_afpod = lt_afpod et_afpod_up = lt_afpod_up et_afpod_resbd = lt_afpod_resbd et_afpod_resbd_up = lt_afpod_resbd_up et_reford_afvgd = lt_reford_afvgd et_serno_olist_ins = lt_serno_olist_ins et_serno_olist_del = lt_serno_olist_del et_serviceoutline = lt_serviceoutline et_servicelines = lt_servicelines et_servicelimit = lt_servicelimit et_servicecontractlimits = lt_servicecontractlimits et_serviceoutline_up = lt_serviceoutline_up et_servicelines_up = lt_servicelines_up et_servicelimit_up = lt_servicelimit_up et_servicecontractlimits_up = lt_servicecontractlimits_up et_permit = lt_permit et_permit_up = lt_permit_up et_permit_issue = lt_permit_issue et_estimated_costs = lt_est_cost " 1672966 EAMCC PM110 et_thead_add = lt_text_add "note 2756658 et_settlement_profile = lt_settlmt_profile EXCEPTIONS conversion_error = 1 textline_error = 2 OTHERS = 3. IF sy-subrc NE 0. PERFORM end_bapi CHANGING return[]. EXIT. ENDIF. *--- fill PRT data in int. tables (mapping is performed later) lt_prt = it_prt[]. lt_prt_up = it_prt_up[]. * BADI zum prüfen und ändern der Eingabedaten ************* * aufrufen. Zu diesem Zeitpunkt sind die meisten ********** * Daten im internen Format verfügbar ********************** IF NOT sr_modify_input_data IS INITIAL. * Abwärtskompatibilität: In frühen Versionen wurden nur die externen * Repräsentationen der Auftragskopfdaten angeboten. Dabei können nur * bestimmte Teile der Auftragsköpfe geändert werden. Falls aber Kunden * bereits eine entsprechende BAdI-Implementation erstellt haben, wird * Nacharbeit notwendig, um die alte Logik nach wie vor zu * unterstützen LOOP AT it_header. MOVE-CORRESPONDING it_header TO ls_bapihead. APPEND ls_bapihead TO lt_bapihead. ENDLOOP. LOOP AT it_header_up. MOVE-CORRESPONDING it_header_up TO ls_bapihead_up. APPEND ls_bapihead_up TO lt_bapihead_up. ENDLOOP. LOOP AT it_header_srv. MOVE-CORRESPONDING it_header_srv TO ls_bapisrvcdata. MOVE it_header_srv-material_long TO ls_bapisrvcdata-material. "MFLE APPEND ls_bapisrvcdata TO lt_bapisrvcdata. ENDLOOP. LOOP AT it_header_srv_up. MOVE-CORRESPONDING it_header_srv_up TO ls_bapisrvcdata_up. MOVE it_header_srv_up-material_long TO ls_bapisrvcdata_up-material. "MFLE APPEND ls_bapisrvcdata_up TO lt_bapisrvcdata_up. ENDLOOP. * Before-Image für externe Datenrepräsentation sichern lt_bapihead_old = lt_bapihead. lt_bapihead_old_up = lt_bapihead_up. lt_bapisrvcdata_old = lt_bapisrvcdata. lt_bapisrvcdata_old_up = lt_bapisrvcdata_up. CLEAR lt_extension_up. " Note 1989741 cl_im_eams_ord_cfd_write=>extension_in_tab = extension_in[]. LOOP AT extension_in. CALL METHOD sr_modify_input_data->modify_input_data EXPORTING extension_in = extension_in CHANGING ct_methods = lt_methods ct_header = lt_bapihead ct_header_up = lt_bapihead_up ct_header_srv = lt_bapisrvcdata ct_header_srv_up = lt_bapisrvcdata_up ct_userstatus = lt_userstatus ct_partner = lt_partner ct_partner_up = lt_partner_up ct_operation = lt_afvgd ct_operation_up = lt_afvgd_up ct_relation = lt_afabd ct_relation_up = lt_afabd_up ct_component = lt_resbd ct_component_up = lt_resbd_up ct_objectlist = lt_riwol ct_text = lt_text ct_text_lines = lt_text_lines ct_messages = lt_messages ct_header_int = lt_caufvd ct_header_int_up = lt_caufvd_up ct_pmsdo_srv = lt_pmsdo ct_pmsdo_srv_up = lt_pmsdo_up ct_reforder_item_int = lt_afpod ct_reforder_item_int_up = lt_afpod_up ct_reforder_comp = lt_afpod_resbd ct_reforder_comp_up = lt_afpod_resbd_up ct_reforder_serno_olist_ins = lt_serno_olist_ins ct_reforder_serno_olist_del = lt_serno_olist_del ct_prt = lt_prt ct_prt_up = lt_prt_up ct_serviceoutline = lt_serviceoutline ct_serviceoutline_up = lt_serviceoutline_up ct_servicelines = lt_servicelines ct_servicelines_up = lt_servicelines_up ct_servicelimit = lt_servicelimit ct_servicelimit_up = lt_servicelimit_up ct_servicecontractlimits = lt_servicecontractlimits ct_servicecontractlimits_up = lt_servicecontractlimits_up ct_estimated_costs = lt_est_cost. " 1672966 EAMCC PM110 * Note 1989741 - begin IF extension_in-structure IS NOT INITIAL. ls_extension_up-fieldname = extension_in-structure. ls_extension_up-bapiupdate = 'X'. APPEND ls_extension_up TO lt_extension_up. ENDIF. * Note 1989741 - end ENDLOOP. * Before- und After-Image für alte Logik vergleichen: * Bei Delta nur die externe Repräsentation der Kopfdaten verwenden IF lt_bapihead_old <> lt_bapihead OR lt_bapihead_old_up <> lt_bapihead_up OR lt_bapisrvcdata_old <> lt_bapisrvcdata OR lt_bapisrvcdata_old_up <> lt_bapisrvcdata_up. * Aus im BAdI veränderten Daten Import-Daten wiederherstellen, * Konvertierung für Kopfdaten erneut durchführen LOOP AT lt_bapihead INTO ls_bapihead. MOVE-CORRESPONDING ls_bapihead TO ls_header. APPEND ls_header TO lt_header. ENDLOOP. LOOP AT lt_bapihead_up INTO ls_bapihead_up. MOVE-CORRESPONDING ls_bapihead_up TO ls_header_up. APPEND ls_header_up TO lt_header_up. ENDLOOP. LOOP AT lt_bapisrvcdata INTO ls_bapisrvcdata. MOVE-CORRESPONDING ls_bapisrvcdata TO ls_header_srv. ls_header_srv-material_long = ls_bapisrvcdata-material. "MFLE CLEAR: ls_header_srv-material. "MFLE APPEND ls_header_srv TO lt_header_srv. ENDLOOP. LOOP AT lt_bapisrvcdata_up INTO ls_bapisrvcdata_up. MOVE-CORRESPONDING ls_bapisrvcdata_up TO ls_header_srv_up. ls_header_srv_up-material_long = ls_bapisrvcdata_up-material. "MFLE APPEND ls_header_srv_up TO lt_header_srv_up. ENDLOOP. CALL FUNCTION 'IBAPI_PROC_INTERFACE_E2I' EXPORTING it_header = lt_header[] it_header_up = lt_header_up[] it_header_srv = lt_header_srv[] it_header_srv_up = lt_header_srv_up[] it_userstatus = it_userstatus[] it_partner = it_partner[] it_operation = it_operation[] it_relation = it_relation[] it_component = it_component[] it_text = it_text[] it_text_lines = it_text_lines[] IMPORTING et_caufvd = lt_caufvd et_caufvd_up = lt_caufvd_up et_caufvd_srv = lt_pmsdo et_caufvd_srv_up = lt_pmsdo_up EXCEPTIONS conversion_error = 1 textline_error = 2 OTHERS = 3. IF sy-subrc NE 0. PERFORM end_bapi CHANGING return[]. EXIT. ENDIF. ENDIF. ENDIF. * Messages vom BADI auswerten und ins BAPI-Log scheiben * Fehler in Tabelle RETURN schreiben. * Bei Message E oder A bricht der Bapi ab CLEAR return[]. LOOP AT lt_messages INTO ls_messages. CALL FUNCTION 'BALW_BAPIRETURN_GET2' EXPORTING type = ls_messages-msgty cl = ls_messages-msgid number = ls_messages-msgno par1 = ls_messages-msgv1 par2 = ls_messages-msgv2 par3 = ls_messages-msgv3 par4 = ls_messages-msgv4 IMPORTING return = ls_return. APPEND ls_return TO return[]. IF ls_messages-msgty CA 'AE'. MOVE 4 TO lv_error. ENDIF. ENDLOOP. "Message-Log zurückgeben IF lv_error NE 0. EXIT. ENDIF. * Prüfen, ob der Trace geschrieben werden soll, * und ihn dann auf das Frontend schreiben. Dies * geht natürlich nur, wenn der BAPI vom Frontend * aus aufgerufen wird. * Der Trace kann auch dazu dienen festzustellen, ob die * Daten korrekt kovertiert wurden, und der BADI das * richtige gemacht hat. CALL FUNCTION 'IBAPI_PROC_SAVE_TRACE' EXPORTING it_header = lt_caufvd it_header_up = lt_caufvd_up it_header_srv = lt_pmsdo it_header_srv_up = lt_pmsdo_up it_userstatus = lt_userstatus it_partner = lt_partner it_partner_up = lt_partner_up it_operation = lt_afvgd it_operation_up = lt_afvgd_up it_relation = lt_afabd it_relation_up = lt_afabd_up it_component = lt_resbd it_component_up = lt_resbd_up it_objectlist = lt_riwol it_srule = lt_cobl it_srule_up = lt_cobl_up it_text = lt_text it_text_lines = lt_text_lines it_tasklists = lt_tasklists CHANGING ct_methods = lt_methods. * Methodentabelle auf Konsistenz prüfen und in internes * Format umsetzen. Bestimmen, welche Aufträge in die * Belegtabelle gelesen werden müssen. CALL FUNCTION 'IBAPI_PROC_METHOD_TABLE_E2I' IMPORTING et_orders = lt_orders CHANGING ct_method_table = lt_methods EXCEPTIONS object_unknown = 1 method_unknown = 2 invalid_order_key = 3 required_order_no_created = 4 save_or_dialog_required = 5 OTHERS = 6. IF sy-subrc NE 0. * Fehler werden bereits in FB geloggt * setzen des Fehlerflags und verlassen des Bapis PERFORM end_bapi CHANGING return[]. EXIT. ENDIF. * Reihenfolge der Bearbeitung festlegen. ****************** * dies ist vor allem dann wichtig, wenn ******************* * Anordnungsbeziehungen zwischen neu ********************** * angelegten Vorgängen erzeugt werden sollen. ************* CALL FUNCTION 'IBAPI_SET_METHOD_LEVEL' EXPORTING it_methods = lt_methods IMPORTING et_method_level = lt_method_level. * Lesen der Aufträge in die Belegtabellen und sperren. CALL FUNCTION 'IBAPI_READ_AND_LOCK_ORDERS' EXPORTING it_aufnr = lt_orders it_methods = lt_methods EXCEPTIONS order_not_found = 1 release_no_change = 2 order_locked = 3 OTHERS = 4. IF sy-subrc NE 0. * Fehler beim Lesen der Aufträge in die Belegtabellen PERFORM end_bapi CHANGING return[]. EXIT. ENDIF. * For supporting geospatial data processing,the code related to note 2550268 is disabled **-- check orders is geo enabled note 2550268 * PERFORM eamgef_order_check USING it_header[] * lt_method_level * CHANGING lv_error. * IF lv_error NE 0. * PERFORM end_bapi CHANGING return[]. * EXIT. * ENDIF. "note 2550268 * For supporting geospatial data processing,the code related to note 2550268 is disabled * Linear Asset Management EhP5 IF cl_ops_switch_check=>eam_sfws_lfe( ) IS NOT INITIAL. CALL METHOD cl_eaml_ea_bapi_util=>set_order_data_buf EXPORTING it_header = it_header[] it_header_up = it_header_up[] it_operation = it_operation[] it_operation_up = it_operation_up[]. ENDIF. * >>>>> Begin note 2304265: DFPS specific checks clear lv_method_del. if cl_check_switch=>dfps_is_active( ) = abap_true. perform dfps_auth_check tables it_header return changing lt_method_level lv_method_del. endif. if lv_method_del = abap_true. * At least one method was deleted by the DFPS change protection checks, therefore it will be checked in the following * if only a save method remains in the processing methods. If yes, this save must no longer be processed. if lines( lt_method_level ) = 1. read table lt_method_level transporting no fields with key method = if_eams_bo_const=>gc_bapi_ord_method-save. if sy-subrc = 0. * only a save method exists ==> delete this method too clear lt_method_level. endif. endif. endif. if lt_method_level is not initial. * <<<<< End note 2304265 * Ausführen der in der Methodentabelle hinterlegten ******* * Methoden ************************************************ CALL FUNCTION 'IBAPI_PROC_METHOD_TABLE_EXEC' EXPORTING it_proc_level_tab = lt_method_level it_order_tab = lt_caufvd it_order_up_tab = lt_caufvd_up it_order_srv_tab = lt_pmsdo it_order_srv_up_tab = lt_pmsdo_up it_userstatus_tab = lt_userstatus it_partner_tab = lt_partner it_partner_up_tab = lt_partner_up it_operation_tab = lt_afvgd it_operation_up_tab = lt_afvgd_up it_relation_tab = lt_afabd it_relation_up_tab = lt_afabd_up it_component_tab = lt_resbd it_component_up_tab = lt_resbd_up it_objectlist_tab = lt_riwol it_objectlist_up_tab = lt_riwol_up it_olist_relation_tab = lt_olist_relation it_cobl_tab = lt_cobl it_cobl_up_tab = lt_cobl_up it_text_tab = lt_text it_text_lines_tab = lt_text_lines it_tasklists = lt_tasklists it_extension_up = lt_extension_up " Note 1989741 it_reforder_item = lt_afpod it_reforder_item_up = lt_afpod_up it_reforder_comp = lt_afpod_resbd it_reforder_comp_up = lt_afpod_resbd_up it_reforder_operation = lt_reford_afvgd it_reforder_serno_olist_ins = lt_serno_olist_ins it_reforder_serno_olist_del = lt_serno_olist_del it_prt = lt_prt it_prt_up = lt_prt_up it_serviceoutline = lt_serviceoutline it_serviceoutline_up = lt_serviceoutline_up it_servicelines = lt_servicelines it_servicelines_up = lt_servicelines_up it_servicelimit = lt_servicelimit it_servicelimit_up = lt_servicelimit_up it_servicecontractlimits = lt_servicecontractlimits it_servicecontractlimits_up = lt_servicecontractlimits_up it_permit = lt_permit it_permit_up = lt_permit_up it_permit_issue = lt_permit_issue iv_mmsrv_external_maintenace = iv_mmsrv_external_maintenace it_estimated_costs = lt_est_cost " 1672966 EAMCC PM110 it_text_add_tab = lt_text_add "note 2756658 it_settlmt_profile = lt_settlmt_profile IMPORTING et_numbers = et_numbers[] et_notif_numbers = et_notification_numbers[] EXCEPTIONS data_for_method_not_found = 1 method_not_supported = 2 error_in_processing = 3 OTHERS = 4. IF sy-subrc NE 0. * Fehler &1 beim Bearbeiten der Bapi-Methoden MESSAGE e113(iwo_bapi2) INTO mess. bapi_message. * New with ERP 2005: If order headers are created BUT subsequent objects * led to an error, the order header update flag is now set to 'IGNORE' for * update processes. PERFORM reset_created_headers USING et_numbers[] lt_method_level. PERFORM end_bapi CHANGING return[]. EXIT. ENDIF. endif. "DFPS note 2304265 * Lesen des Application Logs und zurückgeben der ********** * Meldungen in die Exporttabelle ************************** PERFORM end_bapi CHANGING return[]. ENHANCEMENT-POINT bapi_alm_order_maintain_g7 SPOTS es_saplibapi_alm_order. ENDFUNCTION.
09-04
#include <signal.h> #include <getopt.h> #include <ethernet.h> #include <bcmeth.h> #include <bcmevent.h> #include <802.11.h> #include <bcmiov.h> #include "qm_utils.h" #include "qm_mscs.h" #ifdef BCM_QOSMGMT_MULTIAP #include "qm_mesh.h" #endif /* BCM_QOSMGMT_MULTIAP */ #define MSCS_COMMAND_LEN (SYS_CMD_LEN + 16) /* Assume by default AC_VO and AC_VI needs mscs processing. Corresponding up bitmap is 0xF0 */ #define QOSMGMT_DEFAULT_UP_BITMAP 0xF0 #define QOSMGMT_DEFAULT_UP_LIMIT 7 static bool qosmgmt_is_mscs_disallowed(qosmgmt_t *qosmgmt, const uint8 *da); static void qosmgmt_mscs_reset_kernel() { char command[SYS_CMD_LEN]; ASSERT(qm_sta_list.mscs_sta_count == 0); if (qm_sta_list.scs_sta_count_tclas == 0) { if (netfilter_module) { snprintf(command, SYS_CMD_LEN, "rmmod br_netfilter.ko &> /dev/null"); SYSTEM_CALL(command); ASSERT(netfilter_loaded == TRUE); netfilter_loaded = FALSE; } iptables_deinit(); } } static void qosmgmt_mscs_init_kernel() { char command[SYS_CMD_LEN]; ASSERT(qm_sta_list.mscs_sta_count == 0); if (qm_sta_list.scs_sta_count_tclas == 0) { if (netfilter_module) { /* Insert br_nfilter module and set global mscs iptables rule */ snprintf(command, SYS_CMD_LEN, "insmod /lib/modules/$(uname -r)/" "kernel/net/bridge/br_netfilter.ko &> /dev/null"); SYSTEM_CALL(command); ASSERT(netfilter_loaded == FALSE); netfilter_loaded = TRUE; } iptables_init(); } } static int qosmgmt_delete_mscs_stalist(qosmgmt_t *qosmgmt, char *ifname, const uint8 *da) { actframe_entry_t *entry = NULL; actframe_entry_t *next = NULL; entry = qosmgmt->head; while (entry) { next = entry->next; if ((entry->type == QOSMGMT_MSCS) && (strncmp(entry->ifname, ifname, IFNAMSIZ) == 0) && (!eacmp(entry->stamac.octet, da))) { /* delete this entry */ qosmgmt_delete_actframe_entry(qosmgmt, ifname, (char *)&entry->stamac, entry->type); /* only one mscs entry per sta */ break; } entry = next; } return BCME_OK; } static int qosmgmt_update_mscs_response_actframe(qosmgmt_t *qosmgmt, actframe_entry_t *entry, dot11_mscs_req_t *req_act_fr) { dot11_mscs_descr_ie_t *mscs_descr_ie = NULL; dot11_mscs_res_t *mscs_res = NULL; char *ioctl_buf = NULL; wl_af_params_t *af_params; wl_action_frame_t *action_frame; int buflen; if (entry == NULL) { QOSMGMT_ERROR("Error: entry is NULL\n"); return BCME_ERROR; } ASSERT(entry->actframe_buflen >= WLC_IOCTL_SMLEN); ioctl_buf = (char *)entry->actframe_buf; QOSMGMT_INFO("Action Frame cat: %d rav: %d, dia: %d\n", req_act_fr->category, req_act_fr->robust_action, req_act_fr->dialog_token); mscs_descr_ie = &req_act_fr->mscs_descr; /* strncpy will pad ioctl_buf with 0 after "actframe" until * WLC_IOCTL_SMLEN, so no need to memset with 0 and fill last * chat to '\0'. */ strncpy(ioctl_buf, "actframe", WLC_IOCTL_SMLEN); buflen = strlen(ioctl_buf) + 1; af_params = (wl_af_params_t *)(ioctl_buf + buflen); action_frame = &af_params->action_frame; af_params->channel = 0; af_params->dwell_time = htod32(-1); eacopy(entry->stamac.octet, action_frame->da.octet); action_frame->packetId = entry->packetId; action_frame->len = htod16(DOT11_MSCS_RES_HDR_LEN); mscs_res = (dot11_mscs_res_t *)&action_frame->data[0]; mscs_res->category = DOT11_ACTION_CAT_QOSMGMT; mscs_res->robust_action = DOT11_QOSMGMT_MSCS_RES; mscs_res->dialog_token = req_act_fr->dialog_token; if (qosmgmt_is_mscs_disallowed(qosmgmt, entry->stamac.octet)) { mscs_res->status = DOT11_SC_DECLINED; } else if ((mscs_descr_ie->req_type == DOT11_MSCS_REQ_TYPE_ADD) || (mscs_descr_ie->req_type == DOT11_MSCS_REQ_TYPE_CHANGE)) { mscs_res->status = DOT11_SC_SUCCESS; } else { /* WFA #4.4.3.5 - * when AP receives MSCS Request with Request Type subfield as 1 (REMOVE) * MSCS Response should go with Status Code TCLAS_PROCESSING_TERMINATED (97) */ mscs_res->status = DOT11_SC_TCLAS_PROCESSING_TERMINATED; } return mscs_res->status; } static int qosmgmt_update_mscs_terminate_actframe(qosmgmt_t *qosmgmt, actframe_entry_t *entry) { dot11_mscs_res_t *mscs_res = NULL; char *ioctl_buf = NULL; wl_af_params_t *af_params; wl_action_frame_t *action_frame; int buflen; if (entry == NULL) { QOSMGMT_ERROR("%s:Error: entry is NULL\n", __FUNCTION__); return BCME_ERROR; } ASSERT(entry->actframe_buflen >= WLC_IOCTL_SMLEN); ioctl_buf = (char *)entry->actframe_buf; strncpy(ioctl_buf, "actframe", WLC_IOCTL_SMLEN); buflen = strlen(ioctl_buf) + 1; af_params = (wl_af_params_t *)(ioctl_buf + buflen); action_frame = &af_params->action_frame; af_params->channel = 0; af_params->dwell_time = htod32(-1); eacopy(entry->stamac.octet, action_frame->da.octet); action_frame->packetId = entry->packetId; action_frame->len = htod16(DOT11_MSCS_RES_HDR_LEN); /* WFA #4.4.2.9 - Trigger APUT to delete (teardown) MSCS for STA2 */ mscs_res = (dot11_mscs_res_t *)&action_frame->data[0]; mscs_res->category = DOT11_ACTION_CAT_QOSMGMT; mscs_res->robust_action = DOT11_QOSMGMT_MSCS_RES; mscs_res->dialog_token = 0; mscs_res->status = DOT11_SC_TCLAS_PROCESSING_TERMINATED; return BCME_OK; } static int qosmgmt_update_mscs_descr_ie(qosmgmt_t *qosmgmt, qm_sta_entry_t *sta_e, void *data, uint32 datalen, uint32 req_type) { #ifdef BCM_QOSMGMT_MULTIAP uint8 *descr_ie = NULL; if (!I5_IS_MULTIAP_CONTROLLER(qosmgmt->multiap_mode)) { return BCME_OK; } if (req_type == DOT11_MSCS_REQ_TYPE_ADD) { ASSERT(data && datalen); descr_ie = (uint8 *)calloc(1, datalen); if (descr_ie == NULL) { QOSMGMT_ERROR("can't allocate memory\n"); return BCME_NOMEM; } memcpy(descr_ie, data, datalen); sta_e->mscs_param.mscs_ie.descr_ie = descr_ie; sta_e->mscs_param.mscs_ie.descr_len = datalen; } else if (req_type == DOT11_MSCS_REQ_TYPE_REMOVE) { if (sta_e->mscs_param.mscs_ie.descr_ie) { free(sta_e->mscs_param.mscs_ie.descr_ie); sta_e->mscs_param.mscs_ie.descr_ie = NULL; sta_e->mscs_param.mscs_ie.descr_len = 0; } } else { ASSERT(FALSE); } #endif /* BCM_QOSMGMT_MULTIAP */ return BCME_OK; } int qosmgmt_iptables_mscs_cmd(qosmgmt_t *qosmgmt, qm_sta_entry_t *e, iptables_entry_type_t type) { char macstr[ETHER_ADDR_STR_LEN]; char command[MSCS_COMMAND_LEN]; char cmd_postfix[SYS_CMD_LEN]; int ret = BCME_OK; ether_etoa((uint8 *)&e->ea, macstr); if (type == IPTABLES_ADD) { if (qm_sta_list.mscs_sta_count == 0) { /* This will be first enrty. Initialize kernel and netfilter */ qosmgmt_mscs_init_kernel(); } } snprintf(cmd_postfix, SYS_CMD_LEN, "-t mangle %s MSCS-RULES -m mac --mac-source %s -m mscs" " --up-bitmap 0x%x --up-limit %d -j RETURN", type == IPTABLES_ADD ? "-A":"-D", macstr, e->mscs_param.up_bitmap, e->mscs_param.up_limit); snprintf(command, MSCS_COMMAND_LEN, "iptables %s", cmd_postfix); SYSTEM_CALL(command); snprintf(command, MSCS_COMMAND_LEN, "ip6tables %s", cmd_postfix); SYSTEM_CALL(command); if (type == IPTABLES_DEL) { /* delete stored mscs_desc_ie */ qosmgmt_update_mscs_descr_ie(qosmgmt, e, NULL, 0, DOT11_MSCS_REQ_TYPE_REMOVE); if (qm_sta_list.mscs_sta_count == 0) { /* Left last MSCS station. Return to default kernel mode */ qosmgmt_mscs_reset_kernel(); } if (ASR_ENAB(e->sta_cap)) { if (qosmgmt_mscs_external_add(qosmgmt, e)) { /* A replacement entry is added by asr auto mscs */ return BCME_OK; } } } if (COMMAND_VALID("fc") == TRUE) { /* Evict all existing flows of the station */ snprintf(command, MSCS_COMMAND_LEN, "fc flush --mac %s &> /dev/null", macstr); SYSTEM_CALL(command); } else if (DIRECTORY_VALID("/proc/driver/fpi_blog")) { /* flush all FPI flows */ snprintf(command, MSCS_COMMAND_LEN, "echo 1 > /proc/driver/fpi_blog/flush"); SYSTEM_CALL(command); } return ret; } bool qosmgmt_mscs_external_add(qosmgmt_t *qosmgmt, qm_sta_entry_t *e) { uint32 qosmgmt_enable; /* MSCS entry for the station will be necessary on following conditions: * 1. If the AP's qosmgmt module is enabled for MSCS and ASR_AUTO_MSCS * 2. If the station does not have already a MSCS entry which may have been * from ASR session or from a MSCS request */ if (MSCS_ENAB(e->sta_cap)) { /* MSCS is already active in this station. */ return FALSE; } qosmgmt_enable = qosmgmt_get_iface_enable(qosmgmt, e->ifname); if (!(MSCS_ENAB(qosmgmt_enable) && ASR_AUTO_MSCS_ENAB(qosmgmt_enable))) { /* MSCS is not enabled. OR it is enabled but auto mscs is not enabled */ return FALSE; } e->sta_cap |= WL_QOSMGMT_ASR_AUTO_MSCS; e->sta_cap |= WL_QOSMGMT_MSCS; e->mscs_param.up_bitmap = QOSMGMT_DEFAULT_UP_BITMAP; e->mscs_param.up_limit = QOSMGMT_DEFAULT_UP_LIMIT; e->mscs_param.stream_timeout = -1; /* Not used */ e->mscs_param.external_request = TRUE; qosmgmt_iptables_mscs_cmd(qosmgmt, e, IPTABLES_ADD); qm_sta_list.mscs_sta_count++; return TRUE; } bool qosmgmt_mscs_external_entry_delete(qosmgmt_t *qosmgmt, qm_sta_entry_t *e) { if (!MSCS_ENAB(e->sta_cap)) { return FALSE; } if (!e->mscs_param.external_request) { /* This entry is from MSCS request. Don't delete it */ return FALSE; } /* clear MSCS cap */ e->sta_cap &= (~WL_QOSMGMT_MSCS); e->sta_cap &= (~WL_QOSMGMT_ASR_AUTO_MSCS); e->mscs_param.external_request = FALSE; qm_sta_list.mscs_sta_count--; /* Delete associated iptables entry */ qosmgmt_iptables_mscs_cmd(qosmgmt, e, IPTABLES_DEL); return TRUE; } int qosmgmt_process_mscs_ie(qosmgmt_t *qosmgmt, char *ifname, void *data, uint32 datalen, const uint8 *da) { dot11_mscs_descr_ie_t *mscs_descr_ie; uint8 up_bitmap, up_limit; qm_sta_entry_t *e; char macstr[ETHER_ADDR_STR_LEN]; if (datalen < sizeof(*mscs_descr_ie)) { return BCME_BADARG; } mscs_descr_ie = (dot11_mscs_descr_ie_t *)data; ether_etoa(da, macstr); up_bitmap = (mscs_descr_ie->up_ctl & DOT11_UPC_UP_BITMAP_MASK) >> DOT11_UPC_UP_BITMAP_SHIFT; up_limit = (mscs_descr_ie->up_ctl & DOT11_UPC_UP_LIMIT_MASK) >> DOT11_UPC_UP_LIMIT_SHIFT; QOSMGMT_INFO("MSCS IE [%s] type: %d, up_bitmap: 0x%x, up_limit: %d timeout: %d\n", macstr, mscs_descr_ie->req_type, up_bitmap, up_limit, mscs_descr_ie->stream_timeout); if (mscs_descr_ie->req_type > DOT11_MSCS_REQ_TYPE_CHANGE) { QOSMGMT_ERROR("Error: Invalid request type : %d from %s\n", mscs_descr_ie->req_type, macstr); return BCME_ERROR; } e = qosmgmt_get_sta_entry(da, ifname, TRUE); if (e == NULL) { QOSMGMT_ERROR("Out of memory.\n"); return BCME_NOMEM; } if (mscs_descr_ie->req_type == DOT11_MSCS_REQ_TYPE_REMOVE) { if (MSCS_ENAB(e->sta_cap)) { /* clear MSCS cap */ e->sta_cap &= (~WL_QOSMGMT_MSCS); qm_sta_list.mscs_sta_count--; /* Delete associated iptables entry */ qosmgmt_iptables_mscs_cmd(qosmgmt, e, IPTABLES_DEL); } } else { if (MSCS_ENAB(e->sta_cap)) { /* Delete associated iptable entry */ qosmgmt_iptables_mscs_cmd(qosmgmt, e, IPTABLES_DEL); } /* replace param */ e->mscs_param.up_bitmap = up_bitmap; e->mscs_param.up_limit = up_limit; e->mscs_param.stream_timeout = mscs_descr_ie->stream_timeout; e->mscs_param.external_request = FALSE; /* This entry is from a MSCS action frame */ e->sta_cap &= (~WL_QOSMGMT_ASR_AUTO_MSCS); qosmgmt_update_mscs_descr_ie(qosmgmt, e, data, datalen, DOT11_MSCS_REQ_TYPE_ADD); /* Add new iptables entry */ qosmgmt_iptables_mscs_cmd(qosmgmt, e, IPTABLES_ADD); if (!MSCS_ENAB(e->sta_cap)) { e->sta_cap |= WL_QOSMGMT_MSCS; qm_sta_list.mscs_sta_count++; } } /* Free station entry if sta_cap is zero */ qosmgmt_free_sta_entry(e->ea.octet); return BCME_OK; } static int qosmgmt_mscs_iptables_delete(qosmgmt_t *qosmgmt, const uint8 *da) { qm_sta_entry_t *e; char macstr[ETHER_ADDR_STR_LEN]; ether_etoa(da, macstr); e = qosmgmt_get_sta_entry(da, NULL, FALSE); if (e == NULL) { /* No entry for this station */ QOSMGMT_INFO("No entry for STA: %s\n", macstr); return BCME_OK; } if (!MSCS_ENAB(e->sta_cap)) { QOSMGMT_INFO("STA : %s is not MSCS capable\n", macstr); return BCME_OK; } /* clear MSCS cap */ e->sta_cap &= (~WL_QOSMGMT_MSCS); qm_sta_list.mscs_sta_count--; /* Delete associated iptables entry */ qosmgmt_iptables_mscs_cmd(qosmgmt, e, IPTABLES_DEL); /* Free station entry if sta_cap is zero */ qosmgmt_free_sta_entry(e->ea.octet); return BCME_OK; } int qosmgmt_process_mscs_request(qosmgmt_t *qosmgmt, char *ifname, void *data, uint32 datalen, const uint8 *da) { dot11_mscs_req_t *req_act_fr; dot11_mscs_descr_ie_t *mscs_descr_ie; actframe_entry_t *entry; int ret = BCME_OK; if (datalen < sizeof(*req_act_fr)) { return BCME_BADARG; } req_act_fr = (dot11_mscs_req_t *)data; mscs_descr_ie = &req_act_fr->mscs_descr; datalen -= OFFSETOF(dot11_mscs_req_t, mscs_descr); /* delete any pending MSCS resp actframe */ qosmgmt_delete_mscs_stalist(qosmgmt, ifname, da); /* allocate entry for MSCS resp actframe */ entry = qosmgmt_add_actframe_entry(qosmgmt, ifname, da, QOSMGMT_MSCS); /* update MSCS resp actframe buffer for each sta */ ret = qosmgmt_update_mscs_response_actframe(qosmgmt, entry, req_act_fr); if (ret != DOT11_SC_DECLINED) { /* add mscs iptables rules */ qosmgmt_process_mscs_ie(qosmgmt, ifname, mscs_descr_ie, datalen, da); #ifdef BCM_QOSMGMT_MULTIAP qosmgmt_send_wbd_ipc_mscs_success(qosmgmt, mscs_descr_ie, datalen, (uchar *)da); #endif /* BCM_QOSMGMT_MULTIAP */ } /* dump all sta in the list of type MSCS */ qosmgmt_dump_actframe_list(qosmgmt, ifname, QOSMGMT_MSCS); /* transmit MSCS resp actframe */ qosmgmt_send_actionframe_entry(qosmgmt, entry); return BCME_OK; } int qosmgmt_process_mscs_assoc(qosmgmt_t *qosmgmt, char *ifname, void *data, uint32 datalen, const uint8 *da) { if (qosmgmt_is_mscs_disallowed(qosmgmt, da)) { actframe_entry_t *entry; /* delete any pending MSCS actframe */ qosmgmt_delete_mscs_stalist(qosmgmt, ifname, da); /* allocate entry for MSCS terminate actframe */ entry = qosmgmt_add_actframe_entry(qosmgmt, ifname, da, QOSMGMT_MSCS); /* update MSCS terminate actframe buffer for sta */ qosmgmt_update_mscs_terminate_actframe(qosmgmt, entry); /* dump all sta in the list of type MSCS */ qosmgmt_dump_actframe_list(qosmgmt, ifname, QOSMGMT_MSCS); /* transmit MSCS terminate actframe */ qosmgmt_send_actionframe_entry(qosmgmt, entry); } else { /* add mscs iptables rules */ qosmgmt_process_mscs_ie(qosmgmt, ifname, data, datalen, da); #ifdef BCM_QOSMGMT_MULTIAP qosmgmt_send_wbd_ipc_mscs_success(qosmgmt, data, datalen, (uchar *)da); #endif /* BCM_QOSMGMT_MULTIAP */ } return BCME_OK; } int qosmgmt_process_mscs_terminate(qosmgmt_t *qosmgmt, char *ifname, const uint8 *da) { actframe_entry_t *entry; /* delete any pending MSCS actframe */ qosmgmt_delete_mscs_stalist(qosmgmt, ifname, da); /* allocate entry for MSCS terminate actframe */ entry = qosmgmt_add_actframe_entry(qosmgmt, ifname, da, QOSMGMT_MSCS); /* update MSCS terminate actframe buffer for sta */ qosmgmt_update_mscs_terminate_actframe(qosmgmt, entry); /* delete mscs iptables rules */ qosmgmt_mscs_iptables_delete(qosmgmt, da); /* dump all sta in the list of type MSCS */ qosmgmt_dump_actframe_list(qosmgmt, ifname, QOSMGMT_MSCS); /* transmit MSCS terminate actframe */ qosmgmt_send_actionframe_entry(qosmgmt, entry); return BCME_OK; } #ifdef RESTORE_STA_MSCS static int qosmgmt_restore_sta_mscs_ie(qosmgmt_t *qosmgmt, char *ifname, const uint8 *mac) { int ret = BCME_OK; bcm_iov_buf_t *iov_buf = NULL; bcm_iov_buf_t *p_resp = NULL; uint8 *pxtlv = NULL; uint16 buflen = 0, buflen_start = 0; uint16 iovlen = 0; uint8 *iov_resp = NULL; int sbuflen; int hdr_size; iov_buf = (bcm_iov_buf_t *)calloc(1, WLC_IOCTL_MEDLEN); if (iov_buf == NULL) { return BCME_NOMEM; } iov_resp = (uint8 *)calloc(1, WLC_IOCTL_MAXLEN); if (iov_resp == NULL) { ret = BCME_NOMEM; goto fail; } /* fill header */ iov_buf->version = WL_QOSMGMT_IOV_VERSION; iov_buf->id = WL_QOSMGMT_CMD_DESC_IE; pxtlv = (uint8 *)&iov_buf->data[0]; buflen = buflen_start = WLC_IOCTL_MEDLEN - sizeof(bcm_iov_buf_t); ret = bcm_pack_xtlv_entry(&pxtlv, &buflen, WL_QOSMGMT_XTLV_MACADDR, ETHER_ADDR_LEN, (uint8*)mac, BCM_XTLV_OPTION_ALIGN32); if (ret != BCME_OK) { goto fail; } iov_buf->len = buflen_start - buflen; iovlen = sizeof(bcm_iov_buf_t) + iov_buf->len; ret = wl_iovar_getbuf(ifname, "qosmgmt", iov_buf, iovlen, iov_resp, WLC_IOCTL_MAXLEN); if (ret != BCME_OK) { goto fail; } p_resp = (bcm_iov_buf_t *)iov_resp; if (p_resp->id != WL_QOSMGMT_CMD_DESC_IE) { goto fail; } pxtlv = (uint8 *)p_resp->data; sbuflen = p_resp->len; hdr_size = BCM_XTLV_HDR_SIZE_EX(BCM_XTLV_OPTION_ALIGN32); while (sbuflen >= hdr_size) { uint16 type, len; int size; const bcm_xtlv_t *ptlv; const uint8 *data; ptlv = (const bcm_xtlv_t *)pxtlv; bcm_xtlv_unpack_xtlv(ptlv, &type, &len, &data, BCM_XTLV_OPTION_ALIGN32); size = bcm_xtlv_size_for_data(len, BCM_XTLV_OPTION_ALIGN32); sbuflen -= size; if (sbuflen < 0) /* check for buffer overrun */ break; if (type == WL_QOSMGMT_XTLV_MSCS_IE) { /* update iptables based on mscs desc ie */ qosmgmt_process_mscs_ie(qosmgmt, ifname, data, len, mac); } else if (type == WL_QOSMGMT_XTLV_SCS_IE) { /* TODO: update iptables based on scs desc ie */ } pxtlv += size; } fail: if (iov_buf) { free(iov_buf); } if (iov_resp) { free(iov_resp); } return ret; } int qosmgmt_restore_mscs_ie(qosmgmt_t *qosmgmt, char *ifname) { int ret = BCME_OK; bcm_iov_buf_t *iov_buf = NULL; bcm_iov_buf_t *p_resp = NULL; uint8 *pxtlv = NULL; uint16 buflen = 0, buflen_start = 0; uint16 iovlen = 0; uint8 stacap = 0; uint8 *iov_resp = NULL; int sbuflen; int hdr_size; iov_buf = (bcm_iov_buf_t *)calloc(1, WLC_IOCTL_MEDLEN); if (iov_buf == NULL) { return BCME_NOMEM; } iov_resp = (uint8 *)calloc(1, WLC_IOCTL_MAXLEN); if (iov_resp == NULL) { ret = BCME_NOMEM; goto fail; } /* fill header */ iov_buf->version = WL_QOSMGMT_IOV_VERSION; iov_buf->id = WL_QOSMGMT_CMD_STALIST; pxtlv = (uint8 *)&iov_buf->data[0]; buflen = buflen_start = WLC_IOCTL_MEDLEN - sizeof(bcm_iov_buf_t); stacap = bcm_find_fsb(WL_QOSMGMT_MSCS) - 1; ret = bcm_pack_xtlv_entry(&pxtlv, &buflen, WL_QOSMGMT_XTLV_STACAP, sizeof(stacap), &stacap, BCM_XTLV_OPTION_ALIGN32); if (ret != BCME_OK) { goto fail; } iov_buf->len = buflen_start - buflen; iovlen = sizeof(bcm_iov_buf_t) + iov_buf->len; ret = wl_iovar_getbuf(ifname, "qosmgmt", iov_buf, iovlen, iov_resp, WLC_IOCTL_MAXLEN); if (ret != BCME_OK) { goto fail; } p_resp = (bcm_iov_buf_t *)iov_resp; if (p_resp->id != WL_QOSMGMT_CMD_STALIST) { goto fail; } pxtlv = (uint8 *)p_resp->data; sbuflen = p_resp->len; hdr_size = BCM_XTLV_HDR_SIZE_EX(BCM_XTLV_OPTION_ALIGN32); while (sbuflen >= hdr_size) { uint16 type, len; int size; const bcm_xtlv_t *ptlv; const uint8 *data; ptlv = (const bcm_xtlv_t *)pxtlv; bcm_xtlv_unpack_xtlv(ptlv, &type, &len, &data, BCM_XTLV_OPTION_ALIGN32); size = bcm_xtlv_size_for_data(len, BCM_XTLV_OPTION_ALIGN32); sbuflen -= size; if (sbuflen < 0) /* check for buffer overrun */ break; /* restore sta iptables */ qosmgmt_restore_sta_mscs_ie(qosmgmt, ifname, data); pxtlv += size; } fail: if (iov_buf) { free(iov_buf); } if (iov_resp) { free(iov_resp); } return ret; } #endif /* RESTORE_STA_MSCS */ void qosmgmt_clear_mscs_iptables_all_entries(qosmgmt_t *qosmgmt) { int i; qm_sta_entry_ll_t *sta_ll; qm_sta_entry_t *e; if (qm_sta_list.mscs_sta_count == 0) { /* Nothing to clear */ return; } /* Delete all mscs iptables entries created by this app. */ QOSMGMT_INFO("Delete all MSCS iptables entries\n"); for (i = 0; i < QM_HASH_TABLE_SIZE; i++) { sta_ll = qm_sta_list.hash_table[i]; while (sta_ll != NULL) { e = sta_ll->sta_e; if (MSCS_ENAB(e->sta_cap)) { /* clear MSCS cap */ e->sta_cap &= (~WL_QOSMGMT_MSCS); qm_sta_list.mscs_sta_count--; /* Delete MSCS iptables entry */ qosmgmt_iptables_mscs_cmd(qosmgmt, e, IPTABLES_DEL); } /* Free station entry if sta_cap is zero */ sta_ll = qosmgmt_free_sta_entry(e->ea.octet); } } if (qm_sta_list.mscs_sta_count != 0) { QOSMGMT_ERROR("MSCS Station list is corrupted\n"); ASSERT(0); } } static bool qosmgmt_is_mscs_disallowed(qosmgmt_t *qosmgmt, const uint8 *da) { bool ret = FALSE; char macaddr[ETHER_ADDR_STR_LEN], *macnext; struct ether_addr mac_addr; if (qosmgmt->mscs_disallowed_list == NULL) { return ret; } foreach(macaddr, qosmgmt->mscs_disallowed_list, macnext) { if (!ether_atoe(macaddr, (uchar *)&mac_addr)) { QOSMGMT_ERROR("Invalid mac address (%s)\n", macaddr); continue; } if (!eacmp(mac_addr.octet, da)) { QOSMGMT_INFO("MSCS is disallowed for STA:"MACF"\n", ETHER_TO_MACF(*(struct ether_addr *)da)); ret = TRUE; break; } } return ret; }解析一下这段代码
09-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值