AMIConf.c 154 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421
  1. /*****************************************************************
  2. *****************************************************************
  3. *** **
  4. *** (C)Copyright 2005-2006, American Megatrends Inc. **
  5. *** **
  6. *** All Rights Reserved. **
  7. *** **
  8. *** 6145-F, Northbelt Parkway, Norcross, **
  9. *** **
  10. *** Georgia - 30071, USA. Phone-(770)-246-8600. **
  11. *** **
  12. *****************************************************************
  13. *****************************************************************
  14. *
  15. * AMIConf.c
  16. * AMI specific configuration commands related implementation.
  17. *
  18. * Author: Benson Chuang <bensonchuang@ami.com.tw>
  19. *****************************************************************/
  20. #include "Debug.h"
  21. #include "Support.h"
  22. #include "IPMIDefs.h"
  23. #include "AMIRestoreDefaults.h"
  24. #include "flshfiles.h"
  25. #include "flashlib.h"
  26. #include "PendTask.h"
  27. #include <sys/reboot.h>
  28. #include <linux/reboot.h>
  29. #include <arpa/inet.h>
  30. #include <pthread.h>
  31. #include <linux/if.h>
  32. //#include "OSPort.h"
  33. #include "NVRData.h"
  34. #include "NVRAccess.h"
  35. #include "PMConfig.h"
  36. #include "IPMI_AMIConf.h"
  37. #include "AMIConf.h"
  38. #include "nwcfg.h"
  39. #include "Ethaddr.h"
  40. #include "MsgHndlr.h"
  41. #include "ncml.h"
  42. //#include "IPMIConf.h"
  43. #include "hostname.h"
  44. #include <dlfcn.h>
  45. #include "stunnel_cfg.h"
  46. #include "unix.h"
  47. #include "Sensor.h"
  48. #include "SDR.h"
  49. #include <flashlib.h>
  50. #include "featuredef.h"
  51. #include "SEL.h"
  52. #include "blowfish.h"
  53. #include "vmedia_cfg.h"
  54. #include <netdb.h>
  55. #include "AppDevice.h"
  56. #include "userprivilege.h"
  57. #include "Extendedpriv.h"
  58. #include "Platform.h"
  59. #include "safesystem.h"
  60. #include "LANConfig.h"
  61. #include "bmc_type.h"
  62. #define MAX_FULL_SEL_ENTRIES 0x4000
  63. #define SNMP_LIBS "/usr/local/lib/libsnmpusers.so"
  64. #define RMS_SET "rms_set"
  65. #define DNS_PARAM_LENGTH 0x6
  66. /*
  67. * Service commands
  68. */
  69. char *ServiceNameList[MAX_SERVICE_NUM] = {
  70. WEB_SERVICE_NAME,
  71. KVM_SERVICE_NAME,
  72. CDMEDIA_SERVICE_NAME,
  73. FDMEDIA_SERVICE_NAME,
  74. HDMEDIA_SERVICE_NAME,
  75. SSH_SERVICE_NAME,
  76. TELNET_SERVICE_NAME,
  77. SOLSSH_SERVICE_NAME,
  78. };
  79. /**
  80. * @brief IPTABLES Firewall configuration request parameter lengths
  81. **/
  82. static const INT8U FirewallConfigParamLength [] = {
  83. 4+1, /* IP Address block*/
  84. 8+1, /* IP Address Range block*/
  85. 2+1+1, /* Port No block*/
  86. 4+1+1, /* Port Range block*/
  87. 4+1, /* IP Address unblock*/
  88. 8+1, /* IP Address Range unblock*/
  89. 2+1+1, /* Port No unblock*/
  90. 4+1+1, /* Port Range unblock*/
  91. 0, /* Flushing iptables */
  92. 1+1, /* Block all */
  93. 1+1, /* remove Block all */
  94. };
  95. /**
  96. * @brief IPTABLES Get Firewall configuration request parameter lengths
  97. **/
  98. static const INT8U GetFirewallConfigParamLength [] = {
  99. 0, /* Get No Of Entries*/
  100. 1, /* Get A Entry Info */
  101. };
  102. /*
  103. * @brief Network Interface Configuration request parameter length
  104. */
  105. static const INT8U NwIfcStateConfigParamLenght [] = {
  106. 2, /*Eth Interface*/
  107. 7, /*Bond Interface*/
  108. };
  109. /*
  110. * @brief DNS configuration Request parameter length
  111. */
  112. static const INT8U NwDNSConfigParamLength[] = {
  113. 66,
  114. 0xFF,
  115. 4,
  116. 64,
  117. 3,
  118. };
  119. /**
  120. * @brief UDS Session Information request parameter lengths
  121. **/
  122. static const INT8U UDSSessionInfoParamLength[]={
  123. 1,
  124. 5,
  125. 2,
  126. 2,
  127. 5,
  128. 2,
  129. 1,
  130. };
  131. /*
  132. * RIS Configuration commands
  133. */
  134. char *ServiceList[4] = {
  135. RMS_CD_SECTION_NAME,
  136. RMS_FD_SECTION_NAME,
  137. RMS_HD_SECTION_NAME,
  138. RMS_SET,
  139. };
  140. /*
  141. * RIS Configuration commands length
  142. */
  143. static const INT8U ServiceLen[] = {
  144. 3,
  145. 3,
  146. 3,
  147. 2,
  148. };
  149. /**
  150. * @brief RIS Configuration commands request parameter lengths
  151. **/
  152. static const INT32U ServiceParamLength [] = {
  153. 64, /*Image Name Length */
  154. 64, /* Shared Path length*/
  155. 63, /* IP Address Range block*/
  156. 64, /* User Name*/
  157. 32, /* Password*/
  158. 6, /* share Type */
  159. 64, /* Domain name*/
  160. };
  161. /**
  162. * @brief RIS media selection
  163. **/
  164. static const INT8U ServiceParam[] = {
  165. 1,/*CD MEDIA */
  166. 2, /* FD MEDIA*/
  167. 4, /* HD MEDIA*/
  168. };
  169. //extern IfcName_T Ifcnametable[MAX_LAN_CHANNELS];
  170. /*
  171. * DNS related commands
  172. */
  173. INT8U CheckSlaveVLANInterface(INT8U Slaves, INT8U *VLANID, int BMCInst)
  174. {
  175. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  176. char IfcName[16];
  177. int i, j, isFirstIndex = 1;
  178. if (VLANID == NULL)
  179. return (CC_UNSPECIFIED_ERR);
  180. (*VLANID) = 0;
  181. /*Check Slaves Entry*/
  182. for(i = 0; i < BOND_MAX_SLAVE; i++)
  183. {
  184. if( (Slaves >> i) & IFACE_ENABLED)
  185. {
  186. if(CheckIfcEntry( i, ETH_IFACE_TYPE) != 0)
  187. {
  188. IPMI_WARNING("Slave Entry %d is not presented in interface table\n",i);
  189. return (CC_INV_DATA_FIELD);
  190. }
  191. memset(IfcName, 0, sizeof(IfcName));
  192. sprintf(IfcName,"eth%d", i);
  193. for(j = 0; j < sizeof(pBMCInfo->LanIfcConfig)/sizeof(LANIFCConfig_T); j++)
  194. {
  195. if(strcmp(IfcName, pBMCInfo->LanIfcConfig[j].ifname) == 0)
  196. {
  197. TDBG ("VLANID for %s : %d\n", IfcName, pBMCInfo->LANConfig.VLANID[j]);
  198. if (isFirstIndex == 1)
  199. {
  200. (*VLANID) = pBMCInfo->LANConfig.VLANID[j];
  201. isFirstIndex = 0;
  202. }
  203. else
  204. {
  205. if(pBMCInfo->LANConfig.VLANID[j] != (*VLANID))
  206. {
  207. return OEMCC_VLAN_ENABLED_ON_SLAVE;
  208. }
  209. }
  210. }
  211. }
  212. }
  213. }
  214. return 0;
  215. }
  216. /*
  217. @fn CheckVLANInterface
  218. @brief This function is used to check VLAN interface presence
  219. @params Ifcname[in] - interface name BMCInst[in] BMC instance
  220. @returns 1 on VLAN Enabled, 0 on VLAN Disabled
  221. */
  222. int CheckVLANInterface(char* Ifcname,int BMCInst)
  223. {
  224. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  225. int i;
  226. for(i=0;i<sizeof(pBMCInfo->LanIfcConfig)/sizeof(LANIFCConfig_T);i++)
  227. {
  228. if(strcmp(Ifcname,pBMCInfo->LanIfcConfig[i].ifname) == 0)
  229. {
  230. if(pBMCInfo->LANConfig.VLANID[i] != 0)
  231. return 1;
  232. }
  233. }
  234. return 0;
  235. }
  236. /*
  237. @fn ValidateDomainName
  238. @brief This function is used to validate the DNS Domain Name
  239. @params hostname - Domain Name to be validated
  240. @returns 1 on valid domain name , 0 on invalid domain name
  241. */
  242. int ValidateDomainName(const char *hostname)
  243. {
  244. int count = 0;
  245. const char *c, *domain;
  246. static char *invaliddomainname = "()<>@,;:\\\"[]";
  247. /* Here we validate the domain*/
  248. if (!*(domain = c = hostname))
  249. return 0;
  250. do
  251. {
  252. if (*c == '.')
  253. {
  254. if (c == domain || *(c - 1) == '.')
  255. return 0;
  256. count++;
  257. }
  258. if (*c <= ' ' || *c >= 127)
  259. return 0;
  260. if (strchr(invaliddomainname, *c))
  261. return 0;
  262. } while (*++c);
  263. return (count >= 1);
  264. }
  265. /*
  266. @fn ValidateDNSReqInfo
  267. @brief This function is used to validate the DNS Request params DomainIndex and Domainpriority depending on DomainDHCP
  268. @params DomainDHCP - Domain DHCP/static
  269. @params DomainIndex - Domain Index
  270. @params Domainpriority - Domain Prioriry IPV4/IPV6
  271. @returns 0 on valid set DNS conf requested, others - error codes
  272. */
  273. int ValidateDNSReqInfo(INT8U DomainDHCP, INT8U DomainIndex, INT8U Domainpriority)
  274. {
  275. int Ifccount=0,retValue,ifcslaved=0,i;
  276. if(DomainDHCP)
  277. {
  278. Ifccount = g_coremacros.global_nic_count;
  279. if(g_corefeatures.bond_support == ENABLED)
  280. {
  281. for(i = 0; i < Ifccount; i++) // loop to check if bonding is configured
  282. {
  283. retValue = -1;
  284. retValue = CheckBondSlave(i);
  285. if(retValue == -1)
  286. {
  287. return CC_UNSPECIFIED_ERR;
  288. }
  289. if(retValue == 1)
  290. {
  291. ifcslaved = 1;
  292. if(i == DomainIndex)
  293. {
  294. return CC_IFC_ALREADY_SLAVEDTO_BOND;
  295. }
  296. break;
  297. }
  298. if(retValue != 0)
  299. {
  300. TDBG("Error in reading network configuration.\n");
  301. return CC_UNSPECIFIED_ERR;
  302. }
  303. }
  304. }
  305. switch(ifcslaved)
  306. {
  307. case BONDING_ACTIVE:
  308. if(Domainpriority != 1) // Currently IPV6 is not supported for Bonding, so filtering IPV6 request
  309. {
  310. return CC_DNS_CURRENTLY_NOT_SUPPORTED_FOR_IPV6;
  311. }
  312. break;
  313. case BONDING_NOTACTIVE:
  314. for(i=0;i<(sizeof(Ifcnametable)/sizeof(Ifcnametable[0]));i++)
  315. {
  316. if(strstr(Ifcnametable[i].Ifcname,"bond"))
  317. {
  318. if(Ifcnametable[i].Index == DomainIndex)
  319. {
  320. return CC_INV_DATA_FIELD;
  321. }
  322. }
  323. }
  324. if((Domainpriority != 1) && (Domainpriority != 2)) // filter domain priorities other then ipv4 and ipv6
  325. {
  326. return CC_INV_DATA_FIELD;
  327. }
  328. break;
  329. default:
  330. TCRIT("Unable to read the interface state of bonding\n");
  331. }
  332. }
  333. else
  334. {
  335. if(DomainIndex || Domainpriority)
  336. {
  337. return CC_INV_DATA_FIELD;
  338. }
  339. }
  340. return 0;
  341. }
  342. int
  343. AMIGetDNSConf( _NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
  344. {
  345. _NEAR_ AMIGetDNSConfReq_T* pAMIGetDNSConfReq = (_NEAR_ AMIGetDNSConfReq_T*) pReq;
  346. _NEAR_ AMIGetDNSConfRes_T* pAMIGetDNSConfRes = (_NEAR_ AMIGetDNSConfRes_T*) pRes;
  347. HOSTNAMECONF HostnameConfig;
  348. DOMAINCONF DomainConfig;
  349. DNSCONF DnsIPConfig;
  350. INT8U regBMC_FQDN[MAX_LAN_CHANNELS];
  351. INT8U Ifccount;
  352. memset(&HostnameConfig, 0, sizeof(HostnameConfig));
  353. memset(&DomainConfig, 0, sizeof(DomainConfig));
  354. memset(&DnsIPConfig, 0, sizeof(DnsIPConfig));
  355. memset(regBMC_FQDN, 0, sizeof(regBMC_FQDN));
  356. /*Validate the Block selector*/
  357. if( 0 != pAMIGetDNSConfReq->Blockselect
  358. && (pAMIGetDNSConfReq->Param != AMI_DNS_CONF_DOMAIN_NAME )
  359. && (pAMIGetDNSConfReq->Param != AMI_DNS_CONF_DNS_IP))
  360. {
  361. *pRes = CC_INV_DATA_FIELD;
  362. return sizeof(INT8U);
  363. }
  364. nwGetAllDNSConf( &HostnameConfig, &DomainConfig, &DnsIPConfig,regBMC_FQDN );
  365. pAMIGetDNSConfRes->CompletionCode = CC_SUCCESS;
  366. switch(pAMIGetDNSConfReq->Param)
  367. {
  368. case AMI_DNS_CONF_HOST_NAME:
  369. memset(&pAMIGetDNSConfRes->DNSCfg.HName,0,sizeof(HOSTNAMECONF));
  370. pAMIGetDNSConfRes->DNSCfg.HName.HostSetting = HostnameConfig.HostSetting;
  371. pAMIGetDNSConfRes->DNSCfg.HName.HostNameLen= HostnameConfig.HostNameLen;
  372. memcpy(pAMIGetDNSConfRes->DNSCfg.HName.HostName,HostnameConfig.HostName,HostnameConfig.HostNameLen);
  373. return sizeof(INT8U) + sizeof(HOSTNAMECONF);
  374. break;
  375. case AMI_DNS_CONF_REGISTER:
  376. if(g_corefeatures.bond_support == ENABLED)
  377. {
  378. Ifccount = g_coremacros.global_nic_count + 1; //count for bond interface
  379. }
  380. else
  381. {
  382. Ifccount = g_coremacros.global_nic_count;
  383. }
  384. memcpy(pAMIGetDNSConfRes->DNSCfg.RegDNSConf,regBMC_FQDN,Ifccount);
  385. return sizeof(INT8U) + Ifccount;
  386. break;
  387. case AMI_DNS_CONF_DOMAIN_SETTINGS:
  388. pAMIGetDNSConfRes->DNSCfg.DomainConf.DomainDHCP = DomainConfig.dhcpEnable;
  389. pAMIGetDNSConfRes->DNSCfg.DomainConf.DomainIndex = DomainConfig.EthIndex;
  390. pAMIGetDNSConfRes->DNSCfg.DomainConf.Domainpriority= DomainConfig.v4v6;
  391. pAMIGetDNSConfRes->DNSCfg.DomainConf.DomainLen= DomainConfig.domainnamelen;
  392. return sizeof(INT8U) + sizeof(DomainSetting);
  393. break;
  394. case AMI_DNS_CONF_DOMAIN_NAME:
  395. if(pAMIGetDNSConfReq->Blockselect > MAX_BLOCK || pAMIGetDNSConfReq->Blockselect == 0)
  396. {
  397. *pRes = CC_INV_DATA_FIELD;
  398. return sizeof(INT8U);
  399. }
  400. memcpy(pAMIGetDNSConfRes->DNSCfg.DomainName,&DomainConfig.domainname[MAX_DOMAIN_BLOCK_SIZE * (pAMIGetDNSConfReq->Blockselect -1)],MAX_DOMAIN_BLOCK_SIZE);
  401. return sizeof(INT8U) + MAX_DOMAIN_BLOCK_SIZE;
  402. break;
  403. case AMI_DNS_CONF_DNS_SETTING:
  404. pAMIGetDNSConfRes->DNSCfg.DNSConf.IPPriority = DnsIPConfig.IPPriority;
  405. pAMIGetDNSConfRes->DNSCfg.DNSConf.DNSDHCP = DnsIPConfig.DNSDHCP;
  406. pAMIGetDNSConfRes->DNSCfg.DNSConf.DNSIndex = DnsIPConfig.DNSIndex;
  407. return sizeof(INT8U) + sizeof(DNSSetting);
  408. break;
  409. case AMI_DNS_CONF_DNS_IP:
  410. if(pAMIGetDNSConfReq->Blockselect == 1)
  411. {
  412. if(IN6_IS_ADDR_V4MAPPED(&DnsIPConfig.DNSIP1))
  413. {
  414. memcpy(pAMIGetDNSConfRes->DNSCfg.DNSIPAddr,&DnsIPConfig.DNSIP1[IP6_ADDR_LEN - IP_ADDR_LEN],IP_ADDR_LEN);
  415. return sizeof(INT8U) + IP_ADDR_LEN;
  416. }
  417. else
  418. {
  419. memcpy(pAMIGetDNSConfRes->DNSCfg.DNSIPAddr,DnsIPConfig.DNSIP1,IP6_ADDR_LEN);
  420. return sizeof(INT8U) + IP6_ADDR_LEN;
  421. }
  422. }
  423. else if(pAMIGetDNSConfReq->Blockselect == 2)
  424. {
  425. if(IN6_IS_ADDR_V4MAPPED(&DnsIPConfig.DNSIP2))
  426. {
  427. memcpy(pAMIGetDNSConfRes->DNSCfg.DNSIPAddr,&DnsIPConfig.DNSIP2[IP6_ADDR_LEN - IP_ADDR_LEN],IP_ADDR_LEN);
  428. return sizeof(INT8U) + IP_ADDR_LEN;
  429. }
  430. else
  431. {
  432. memcpy(pAMIGetDNSConfRes->DNSCfg.DNSIPAddr,DnsIPConfig.DNSIP2,IP6_ADDR_LEN);
  433. return sizeof(INT8U) + IP6_ADDR_LEN;
  434. }
  435. }
  436. else if(pAMIGetDNSConfReq->Blockselect == 3)
  437. {
  438. if(IN6_IS_ADDR_V4MAPPED(&DnsIPConfig.DNSIP3))
  439. {
  440. memcpy(pAMIGetDNSConfRes->DNSCfg.DNSIPAddr,&DnsIPConfig.DNSIP3[IP6_ADDR_LEN - IP_ADDR_LEN],IP_ADDR_LEN);
  441. return sizeof(INT8U) + IP_ADDR_LEN;
  442. }
  443. else
  444. {
  445. memcpy(pAMIGetDNSConfRes->DNSCfg.DNSIPAddr,DnsIPConfig.DNSIP3,IP6_ADDR_LEN);
  446. return sizeof(INT8U) + IP6_ADDR_LEN;
  447. }
  448. }
  449. else
  450. {
  451. *pRes = CC_INV_DATA_FIELD;
  452. return sizeof(INT8U);
  453. }
  454. break;
  455. case AMI_DNS_CONF_DNS_RESTART:
  456. *pRes = OEMCC_ATTEMPT_TO_GET_WO_PARAM;
  457. return sizeof(INT8U);
  458. break;
  459. case AMI_DNS_CONF_DNS_ENABLE:
  460. pAMIGetDNSConfRes->DNSCfg.DNSEnable = DnsIPConfig.DNSEnable;
  461. return sizeof(INT8U) + sizeof(INT8U);
  462. break;
  463. default:
  464. *pRes = CC_PARAM_NOT_SUPPORTED;
  465. return sizeof(INT8U);
  466. break;
  467. }
  468. return(sizeof(AMIGetDNSConfRes_T));
  469. }
  470. int
  471. AMISetDNSConf( _NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
  472. {
  473. _NEAR_ AMISetDNSConfRes_T *pAMISetDNSConfRes = (_NEAR_ AMISetDNSConfRes_T *)pRes;
  474. _NEAR_ AMISetDNSConfReq_T *pAMISetDNSConfReq = (_NEAR_ AMISetDNSConfReq_T*)pReq;
  475. // _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  476. int i,domainnamelength=0;
  477. INT8U Ifccount, retValue, ifcslaved=0,status=-1,*curchannel;
  478. char *ptr = NULL;
  479. UINT8 reservedBit = REG_BMC_RESERVED;
  480. int sizeWritten = 0;
  481. FILE *fp = NULL;
  482. char tsigprivate[255] = {0};
  483. if(ReqLen >= 2)
  484. {
  485. ReqLen -= 2;
  486. }
  487. else
  488. {
  489. *pRes = CC_REQ_INV_LEN;
  490. return sizeof(INT8U);
  491. }
  492. if(g_corefeatures.online_flashing_support == ENABLED)
  493. {
  494. if(IsCardInFlashMode())
  495. {
  496. IPMI_WARNING("Card in Active flash mode, Not safe to set any of network configurations...\n");
  497. *pRes = CC_DEV_IN_FIRMWARE_UPDATE_MODE;
  498. return sizeof(INT8U);
  499. }
  500. }
  501. if(DNS_PARAM_LENGTH > pAMISetDNSConfReq->ParamSelect)
  502. {
  503. if( (ReqLen != NwDNSConfigParamLength[pAMISetDNSConfReq->ParamSelect - 1])
  504. && ((NwDNSConfigParamLength[pAMISetDNSConfReq->ParamSelect - 1])!=0xFF) )
  505. {
  506. TDBG("ReqLen %ld\n",ReqLen);
  507. *pRes = CC_REQ_INV_LEN;
  508. return sizeof(INT8U);
  509. }
  510. }
  511. /*Validate the Block selector*/
  512. if( 0 != pAMISetDNSConfReq->Blockselector
  513. && (pAMISetDNSConfReq->ParamSelect != AMI_DNS_CONF_DOMAIN_NAME )
  514. && (pAMISetDNSConfReq->ParamSelect != AMI_DNS_CONF_DNS_IP))
  515. {
  516. *pRes = CC_INV_DATA_FIELD;
  517. return sizeof(INT8U);
  518. }
  519. switch(pAMISetDNSConfReq->ParamSelect)
  520. {
  521. case AMI_DNS_CONF_HOST_NAME:
  522. /*Reserved bit checking*/
  523. if(pAMISetDNSConfReq->DnsConfig.HName.HostSetting > 0x1)
  524. {
  525. *pRes = CC_INV_DATA_FIELD;
  526. return sizeof(INT8U);
  527. }
  528. /*Check the Maximum host name length i.e user can send 63 bytes and last one is null character*/
  529. if(pAMISetDNSConfReq->DnsConfig.HName.HostNameLen > MAX_HOSTNAME_LEN - 1)
  530. {
  531. *pRes = CC_INV_DATA_FIELD;
  532. return sizeof(INT8U);
  533. }
  534. TDBG("HostName Setting %d and Length %d\n",pAMISetDNSConfReq->DnsConfig.HName.HostSetting,pAMISetDNSConfReq->DnsConfig.HName.HostNameLen);
  535. LOCK_BMC_SHARED_MEM(BMCInst);
  536. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.HostSetting = pAMISetDNSConfReq->DnsConfig.HName.HostSetting;
  537. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.HostNameLen = pAMISetDNSConfReq->DnsConfig.HName.HostNameLen;
  538. memcpy(BMC_GET_SHARED_MEM (BMCInst)->DNSconf.HostName,pAMISetDNSConfReq->DnsConfig.HName.HostName,pAMISetDNSConfReq->DnsConfig.HName.HostNameLen);
  539. UNLOCK_BMC_SHARED_MEM(BMCInst);
  540. break;
  541. case AMI_DNS_CONF_REGISTER:
  542. /*Added the validation to check the request data when the NIC count is 2. This check will be removed once we support 4 NIC*/
  543. if((g_coremacros.global_nic_count < MAX_LAN_CHANNELS) && (ReqLen!=3))
  544. {
  545. *pRes = CC_REQ_INV_LEN ;
  546. return sizeof(INT8U);
  547. }
  548. // Allow setting this parameter only if DNS Service is enabled
  549. if(BMC_GET_SHARED_MEM(BMCInst)->DNSconf.DNSEnable == 0)
  550. {
  551. TCRIT("DNS is currently disabled. Dissallowing to set the dns configurations...\n");
  552. *pRes = CC_DNS_CURRENTLY_NOT_ENABLED;
  553. return sizeof(INT8U);
  554. }
  555. if(g_corefeatures.bond_support == ENABLED)
  556. {
  557. if(g_coremacros.global_nic_count < MAX_LAN_CHANNELS)
  558. Ifccount = g_coremacros.global_nic_count + 1; //count for bond interface
  559. else
  560. Ifccount = g_coremacros.global_nic_count; // for 4 NIC supported BMC
  561. for(i = 0; i < Ifccount; i++)
  562. {
  563. retValue = -1;
  564. retValue = CheckBondSlave(i);
  565. if(retValue == -1)
  566. {
  567. *pRes = CC_UNSPECIFIED_ERR;
  568. return sizeof(INT8U);
  569. }
  570. if(retValue == 1)
  571. {
  572. ifcslaved = 1;
  573. if(pAMISetDNSConfReq->DnsConfig.RegDNSConf[i])
  574. {
  575. *pRes = CC_IFC_ALREADY_SLAVEDTO_BOND;
  576. return sizeof(INT8U);
  577. }
  578. }
  579. if(retValue != 0)
  580. TDBG("Error in reading network configuration.\n");
  581. if((i == (Ifccount-1)) && (ifcslaved == 0))
  582. {
  583. if( Ifccount != MAX_LAN_CHANNELS)
  584. {
  585. if (pAMISetDNSConfReq->DnsConfig.RegDNSConf[g_coremacros.global_nic_count])
  586. {
  587. TDBG("Attempted to set DNS Conf for Bonding Interface, which is inactive\n");
  588. *pRes = CC_BOND_DISABLED_TOCONF_DNS;
  589. return sizeof(INT8U);
  590. }
  591. }
  592. }
  593. }
  594. }
  595. else
  596. {
  597. Ifccount = g_coremacros.global_nic_count;
  598. if(Ifccount < MAX_LAN_CHANNELS)
  599. {
  600. if (pAMISetDNSConfReq->DnsConfig.RegDNSConf[Ifccount])
  601. {
  602. TDBG("Attempted to set DNS Conf for Bonding Interface, which is inactive\n");
  603. *pRes = CC_BOND_DISABLED_TOCONF_DNS;
  604. return sizeof(INT8U);
  605. }
  606. }
  607. }
  608. if (g_corefeatures.tsig_support == ENABLED) {
  609. reservedBit = reservedBit & REG_BMC_RESERVED_TSIG;
  610. }
  611. for(i = 0; i < Ifccount; i++)
  612. {
  613. if(pAMISetDNSConfReq->DnsConfig.RegDNSConf[i] & reservedBit)
  614. {
  615. TDBG("Register value %d\n",pAMISetDNSConfReq->DnsConfig.RegDNSConf[i]);
  616. *pRes = CC_INV_DATA_FIELD;
  617. return sizeof(INT8U);
  618. }
  619. if (((pAMISetDNSConfReq->DnsConfig.RegDNSConf[i] & REG_BMC_FQDN) == REG_BMC_FQDN) &&
  620. ((pAMISetDNSConfReq->DnsConfig.RegDNSConf[i] & REG_BMC_TSIG) == REG_BMC_TSIG))
  621. {
  622. TCRIT("TSIG can't be enabled with FQDN support");
  623. *pRes = CC_INV_DATA_FIELD;
  624. return sizeof(INT8U);
  625. }
  626. if(((pAMISetDNSConfReq->DnsConfig.RegDNSConf[i] & REG_BMC_FQDN) == REG_BMC_FQDN) &&
  627. ((pAMISetDNSConfReq->DnsConfig.RegDNSConf[i] & REG_BMC_HOSTNAME) == REG_BMC_HOSTNAME))
  628. {
  629. TCRIT("AMISetDNSConf(): Enabling both FQDN and Hostname options is not allowable as these are options of DHCP");
  630. *pRes = CC_INV_DATA_FIELD;
  631. return sizeof(INT8U);
  632. }
  633. }
  634. TDBG("DNS Register Settings %d %d %d\n",pAMISetDNSConfReq->DnsConfig.RegDNSConf[0],pAMISetDNSConfReq->DnsConfig.RegDNSConf[1],pAMISetDNSConfReq->DnsConfig.RegDNSConf[2]);
  635. LOCK_BMC_SHARED_MEM(BMCInst);
  636. memcpy(BMC_GET_SHARED_MEM (BMCInst)->DNSconf.RegisterBMC,pAMISetDNSConfReq->DnsConfig.RegDNSConf,Ifccount);
  637. UNLOCK_BMC_SHARED_MEM(BMCInst);
  638. break;
  639. case AMI_DNS_CONF_TSIG_UPLOAD:
  640. if (g_corefeatures.tsig_support == ENABLED) {
  641. /* Check Requested Length */
  642. if ((ReqLen > MAX_TSIG_PRIVKEY_SIZE) || (ReqLen <= 0))
  643. {
  644. TCRIT("Invalid Request Length\n");
  645. *pRes = CC_REQ_INV_LEN;
  646. return sizeof(INT8U);
  647. }
  648. fp = fopen(TEMP_TSIG_PRIVATE_FILE, "wb");
  649. if (fp == NULL)
  650. {
  651. TCRIT("Error in Opening File\n");
  652. *pRes = CC_UNSPECIFIED_ERR;
  653. return sizeof(INT8U);
  654. }
  655. sizeWritten = fwrite(&pAMISetDNSConfReq->DnsConfig.PrivateKey[0], 1, ReqLen, fp);
  656. if (sizeWritten != ReqLen)
  657. {
  658. TCRIT("Error in writing into the file\n");
  659. fclose(fp);
  660. *pRes = CC_UNSPECIFIED_ERR;
  661. return sizeof(INT8U);
  662. }
  663. fclose(fp);
  664. /* Now Open the File for validation */
  665. fp = fopen(TEMP_TSIG_PRIVATE_FILE, "rb");
  666. if(fp == NULL)
  667. {
  668. TCRIT("Error in Opening File\n");
  669. unlink(TEMP_TSIG_PRIVATE_FILE);
  670. *pRes = CC_UNSPECIFIED_ERR;
  671. return sizeof(INT8U);
  672. }
  673. //HMAC-MD5 Algorithm type check
  674. ptr = fgets(tsigprivate, sizeof(tsigprivate)-1, fp);//read 1st line
  675. ptr = fgets(tsigprivate, sizeof(tsigprivate)-1, fp);
  676. if (strcmp(tsigprivate, TSIG_ALG_TYPE_HMAC_MD5) != 0)
  677. {
  678. TCRIT("The private key's algorithm is not HMAC-MD5.");
  679. fclose(fp);
  680. unlink(TEMP_TSIG_PRIVATE_FILE);
  681. *pRes = CC_TSIGPRIVATEKEY_VALIDATION_FAILED;
  682. return sizeof(INT8U);
  683. }
  684. fclose(fp);
  685. if(moveFile(TEMP_TSIG_PRIVATE_FILE, CONF_TSIG_PRIVATE_FILE) != 0)
  686. {
  687. TCRIT("Error in moving TSIG private key file.");
  688. *pRes = CC_UNSPECIFIED_ERR;
  689. return sizeof(INT8U);
  690. }
  691. }
  692. else
  693. {
  694. *pRes = CC_PARAM_NOT_SUPPORTED;
  695. return sizeof(INT8U);
  696. }
  697. break;
  698. case AMI_DNS_CONF_DOMAIN_SETTINGS:
  699. /*Check the reserve bit*/
  700. if(pAMISetDNSConfReq->DnsConfig.DomainConf.DomainDHCP > 1)
  701. {
  702. *pRes = CC_INV_DATA_FIELD;
  703. return sizeof(INT8U);
  704. }
  705. status = ValidateDNSReqInfo(pAMISetDNSConfReq->DnsConfig.DomainConf.DomainDHCP, pAMISetDNSConfReq->DnsConfig.DomainConf.DomainIndex,pAMISetDNSConfReq->DnsConfig.DomainConf.Domainpriority);
  706. if(status !=0)
  707. {
  708. *pRes = status;
  709. return sizeof(INT8U);
  710. }
  711. TDBG("Domain DHCP %d\nDomainIndex %d\nDomainLen %d\nDomainpriority%d\n",
  712. pAMISetDNSConfReq->DnsConfig.DomainConf.DomainDHCP,
  713. pAMISetDNSConfReq->DnsConfig.DomainConf.DomainIndex,
  714. pAMISetDNSConfReq->DnsConfig.DomainConf.DomainLen,
  715. pAMISetDNSConfReq->DnsConfig.DomainConf.Domainpriority);
  716. LOCK_BMC_SHARED_MEM(BMCInst);
  717. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DomainDHCP = pAMISetDNSConfReq->DnsConfig.DomainConf.DomainDHCP;
  718. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DomainIndex = pAMISetDNSConfReq->DnsConfig.DomainConf.DomainIndex;
  719. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DomainLen = pAMISetDNSConfReq->DnsConfig.DomainConf.DomainLen;
  720. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.Domainpriority = pAMISetDNSConfReq->DnsConfig.DomainConf.Domainpriority;
  721. UNLOCK_BMC_SHARED_MEM(BMCInst);
  722. break;
  723. case AMI_DNS_CONF_DOMAIN_NAME:
  724. if( pAMISetDNSConfReq->Blockselector == 0x0 || pAMISetDNSConfReq->Blockselector > MAX_BLOCK)
  725. {
  726. *pRes = CC_INV_DATA_FIELD;
  727. return sizeof(INT8U);
  728. }
  729. ptr = malloc(sizeof(BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DomainName));
  730. domainnamelength = sizeof(BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DomainName);
  731. strncpy(ptr ,(char *)BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DomainName, domainnamelength);
  732. LOCK_BMC_SHARED_MEM(BMCInst);
  733. if(pAMISetDNSConfReq->Blockselector == 0x01)
  734. memset(&BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DomainName,0,(MAX_BLOCK * MAX_DOMAIN_BLOCK_SIZE));
  735. memcpy(&BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DomainName[ MAX_DOMAIN_BLOCK_SIZE * (pAMISetDNSConfReq->Blockselector - 1)],pAMISetDNSConfReq->DnsConfig.DomainName,MAX_DOMAIN_BLOCK_SIZE);
  736. // Validate the Domain Name if the domain name is of length DomainLen, which is set by user
  737. if(strlen((char *)BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DomainName) >= BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DomainLen)
  738. {
  739. if((ValidateDomainName((char *)BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DomainName)) == INVALID_DOMAIN_NAME)
  740. {
  741. strncpy((char *)BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DomainName, ptr, domainnamelength);
  742. UNLOCK_BMC_SHARED_MEM(BMCInst);
  743. free(ptr);
  744. ptr = NULL;
  745. TDBG("Validating Domain name has fialed\n");
  746. *pRes = CC_INV_DOMAIN_NAME;
  747. return sizeof(INT8U);
  748. }
  749. }
  750. else if(strlen((char *)BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DomainName) > BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DomainLen)
  751. {
  752. strncpy((char *)BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DomainName, ptr, domainnamelength);
  753. UNLOCK_BMC_SHARED_MEM(BMCInst);
  754. free(ptr);
  755. ptr = NULL;
  756. TDBG("Domain Name Length is Greater than the preset param DomainLen(set for Domain Name)\n");
  757. *pRes = CC_INV_DATA_FIELD;
  758. return sizeof(INT8U);
  759. }
  760. UNLOCK_BMC_SHARED_MEM(BMCInst);
  761. free(ptr);
  762. ptr = NULL;
  763. break;
  764. case AMI_DNS_CONF_DNS_SETTING:
  765. /*Check the reserve bits*/
  766. if((pAMISetDNSConfReq->DnsConfig.DNSConf.DNSDHCP > 1) || (pAMISetDNSConfReq->DnsConfig.DNSConf.IPPriority > 2))
  767. {
  768. *pRes = CC_INV_DATA_FIELD;
  769. return sizeof(INT8U);
  770. }
  771. status = ValidateDNSReqInfo(pAMISetDNSConfReq->DnsConfig.DNSConf.DNSDHCP, pAMISetDNSConfReq->DnsConfig.DNSConf.DNSIndex, pAMISetDNSConfReq->DnsConfig.DNSConf.IPPriority);
  772. if(status !=0)
  773. {
  774. *pRes = status;
  775. return sizeof(INT8U);
  776. }
  777. TDBG("IPPriority %d\n",pAMISetDNSConfReq->DnsConfig.DNSConf.IPPriority);
  778. LOCK_BMC_SHARED_MEM(BMCInst);
  779. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.IPPriority = pAMISetDNSConfReq->DnsConfig.DNSConf.IPPriority;
  780. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSDHCP = pAMISetDNSConfReq->DnsConfig.DNSConf.DNSDHCP;
  781. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIndex = pAMISetDNSConfReq->DnsConfig.DNSConf.DNSIndex;
  782. UNLOCK_BMC_SHARED_MEM(BMCInst);
  783. break;
  784. case AMI_DNS_CONF_DNS_IP:
  785. if( pAMISetDNSConfReq->Blockselector == 0x0 || pAMISetDNSConfReq->Blockselector > MAX_DNS_IP_ADDRESS)
  786. {
  787. *pRes = CC_INV_DATA_FIELD;
  788. return sizeof(INT8U);
  789. }
  790. if((ReqLen != IP_ADDR_LEN) && (ReqLen != IP6_ADDR_LEN))
  791. {
  792. TDBG("Reqlen %ld\n",ReqLen);
  793. *pRes = CC_REQ_INV_LEN;
  794. return sizeof(INT8U);
  795. }
  796. /*Validate the IPv6 address*/
  797. if(ReqLen == IP6_ADDR_LEN && 0 != IsValidGlobalIPv6Addr((struct in6_addr*)&pAMISetDNSConfReq->DnsConfig.DNSIPAddr))
  798. {
  799. TCRIT("Invalid Global IPv6 Address\n");
  800. *pRes = CC_INV_DATA_FIELD;
  801. return sizeof(INT8U);
  802. }
  803. TDBG("Block Selector %d\n",pAMISetDNSConfReq->Blockselector);
  804. LOCK_BMC_SHARED_MEM(BMCInst);
  805. if(pAMISetDNSConfReq->Blockselector == 1)
  806. {
  807. memset(&BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIPAddr1,0,IP6_ADDR_LEN);
  808. if(ReqLen == IP_ADDR_LEN)
  809. {
  810. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIPAddr1[10] = 0xFF;
  811. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIPAddr1[11] = 0xFF;
  812. memcpy(&BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIPAddr1[12],pAMISetDNSConfReq->DnsConfig.DNSIPAddr,ReqLen);
  813. TDBG("DNS ipv4 address %d %d %d %d\n",pAMISetDNSConfReq->DnsConfig.DNSIPAddr[0],pAMISetDNSConfReq->DnsConfig.DNSIPAddr[1],
  814. pAMISetDNSConfReq->DnsConfig.DNSIPAddr[2],pAMISetDNSConfReq->DnsConfig.DNSIPAddr[3]);
  815. }
  816. else
  817. {
  818. memcpy(BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIPAddr1,pAMISetDNSConfReq->DnsConfig.DNSIPAddr,ReqLen);
  819. }
  820. }
  821. else if(pAMISetDNSConfReq->Blockselector == 2)
  822. {
  823. memset(&BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIPAddr2,0,IP6_ADDR_LEN);
  824. if(ReqLen == IP_ADDR_LEN)
  825. {
  826. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIPAddr2[10] = 0xFF;
  827. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIPAddr2[11] = 0xFF;
  828. memcpy(&BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIPAddr2[12],pAMISetDNSConfReq->DnsConfig.DNSIPAddr,ReqLen);
  829. }
  830. else
  831. {
  832. memcpy(BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIPAddr2,pAMISetDNSConfReq->DnsConfig.DNSIPAddr,ReqLen);
  833. }
  834. }
  835. else if(pAMISetDNSConfReq->Blockselector == 3)
  836. {
  837. memset(&BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIPAddr3,0,IP6_ADDR_LEN);
  838. if(ReqLen == IP_ADDR_LEN)
  839. {
  840. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIPAddr3[10] = 0xFF;
  841. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIPAddr3[11] = 0xFF;
  842. memcpy(&BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIPAddr3[12],pAMISetDNSConfReq->DnsConfig.DNSIPAddr,ReqLen);
  843. TDBG("DNS ipv4 address %d %d %d %d\n",pAMISetDNSConfReq->DnsConfig.DNSIPAddr[0],pAMISetDNSConfReq->DnsConfig.DNSIPAddr[1],
  844. pAMISetDNSConfReq->DnsConfig.DNSIPAddr[2],pAMISetDNSConfReq->DnsConfig.DNSIPAddr[3]);
  845. }
  846. else
  847. {
  848. memcpy(BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSIPAddr3,pAMISetDNSConfReq->DnsConfig.DNSIPAddr,ReqLen);
  849. }
  850. }
  851. UNLOCK_BMC_SHARED_MEM(BMCInst);
  852. break;
  853. case AMI_DNS_CONF_DNS_RESTART:
  854. if(ReqLen != 0)
  855. {
  856. *pRes = CC_REQ_INV_LEN;
  857. return sizeof(INT8U);
  858. }
  859. SetPendStatus(PEND_OP_SET_ALL_DNS_CFG,PEND_STATUS_PENDING);
  860. OS_THREAD_TLS_GET(g_tls.CurChannel,curchannel);
  861. PostPendTask(PEND_OP_SET_ALL_DNS_CFG, 0, 0,*curchannel & 0xF,BMCInst);
  862. break;
  863. case AMI_DNS_CONF_DNS_ENABLE:
  864. /* Validate the request byte */
  865. if(pAMISetDNSConfReq->DnsConfig.DNSEnable > 1)
  866. {
  867. *pRes = CC_INV_DATA_FIELD;
  868. return sizeof(INT8U);
  869. }
  870. /* Update the shared memory */
  871. LOCK_BMC_SHARED_MEM(BMCInst);
  872. BMC_GET_SHARED_MEM (BMCInst)->DNSconf.DNSEnable = pAMISetDNSConfReq->DnsConfig.DNSEnable;
  873. UNLOCK_BMC_SHARED_MEM(BMCInst);
  874. /* If we disable the DNS service, disable the registrations of BMC hostname too... */
  875. if(pAMISetDNSConfReq->DnsConfig.DNSEnable == 0)
  876. {
  877. LOCK_BMC_SHARED_MEM(BMCInst);
  878. for(i = 0; i < MAX_LAN_CHANNELS; i++)
  879. BMC_GET_SHARED_MEM(BMCInst)->DNSconf.RegisterBMC[i] = 0;
  880. UNLOCK_BMC_SHARED_MEM(BMCInst);
  881. }
  882. break;
  883. default:
  884. *pRes = CC_PARAM_NOT_SUPPORTED;
  885. return sizeof(INT8U);
  886. break;
  887. }
  888. pAMISetDNSConfRes->CompletionCode = CC_SUCCESS;
  889. return(sizeof(AMISetDNSConfRes_T));
  890. }
  891. /*
  892. *@fn GetINT32UBitsNum
  893. *@brief This function will check which bit number is "1" in a value with INT32 type,
  894. * but only one bit number will be allowed to be "1".
  895. *@param value - The input value
  896. *@param bitnum - Which bit number is "1".
  897. *@return Returns -1 on failure
  898. * Returns 0 on success
  899. */
  900. static int GetINT32UBitsNum (INT32U value, INT8U *bitnum)
  901. {
  902. const INT8U startbit = 0;
  903. const INT8U endbit = 31;
  904. INT32U mask = 0x00000000;
  905. INT32U count = 0;
  906. INT8U i = 0;
  907. for(i=startbit;i<=endbit;i++)
  908. {
  909. mask = (1<<i);
  910. if(value & mask)
  911. {
  912. (*bitnum) = i;
  913. count++;
  914. }
  915. }
  916. if(count != 1) //Only one bit should be enabled
  917. {
  918. return -1;
  919. }
  920. return 0;
  921. }
  922. /*
  923. *@fn RestartService
  924. *@brief This function will restart the target service according to parameter service_bit,
  925. *@param service_bit - refer service id field for details
  926. *@return Returns 0 on success
  927. */
  928. /* service id field
  929. * Bit31-Bit5 |Bit4 | Bit3 | Bit2 | Bit1 | Bit0
  930. * Reserved |TELNET| SSH | MEDIA| KVM | WEB
  931. */
  932. static int RestartService(INT8U service_bit,int BMCInst)
  933. {
  934. struct stat buf;
  935. if ((service_bit > 0) && (service_bit <= HDMEDIA_SERVICE_ID_BIT))
  936. {
  937. /* Update the stunnel configuration when ports change for kvm & media services */
  938. UpdateStunnelEntry(ServiceNameList[service_bit]);
  939. if (send_signal_by_name("Adviserd", SIGALRM) != 0)
  940. {
  941. TDBG ("Unable to send the signal to the requested process\n");
  942. }
  943. }
  944. switch (service_bit)
  945. {
  946. case WEB_SERVICE_ID_BIT:
  947. if(stat("/etc/init.d/webgo.sh",&buf) == 0)
  948. {
  949. safe_system("/etc/init.d/webgo.sh restart &");
  950. }
  951. else if(stat("/etc/init.d/lighttpd.sh",&buf) == 0)
  952. {
  953. safe_system("/etc/init.d/lighttpd.sh restart &");
  954. }
  955. break;
  956. case KVM_SERVICE_ID_BIT:
  957. safe_system("/etc/init.d/adviserd.sh restart &");
  958. break;
  959. case CDMEDIA_SERVICE_ID_BIT:
  960. safe_system("/etc/init.d/cdserver restart &");
  961. break;
  962. case FDMEDIA_SERVICE_ID_BIT:
  963. safe_system("/etc/init.d/fdserver restart &");
  964. break;
  965. case HDMEDIA_SERVICE_ID_BIT:
  966. safe_system("/etc/init.d/hdserver restart &");
  967. break;
  968. case SSH_SERVICE_ID_BIT:
  969. safe_system("/etc/init.d/ssh stop");
  970. safe_system("/etc/init.d/ssh start");
  971. break;
  972. case TELNET_SERVICE_ID_BIT:
  973. safe_system("/etc/init.d/telnetd stop");
  974. safe_system("/etc/init.d/telnetd start &");
  975. break;
  976. default :
  977. break;
  978. }
  979. return 0;
  980. }
  981. int
  982. AMIGetServiceConf( _NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
  983. {
  984. _NEAR_ AMIGetServiceConfReq_T* pAMIGetServiceConfReq = (_NEAR_ AMIGetServiceConfReq_T*) pReq;
  985. _NEAR_ AMIGetServiceConfRes_T* pAMIGetServiceConfRes = (_NEAR_ AMIGetServiceConfRes_T*) pRes;
  986. SERVICE_CONF_STRUCT conf;
  987. INT32U Value = 0;
  988. INT8U ServiceIDBit = 0;
  989. int ServiceErr = 0;
  990. /* Match the service_id byte with ServiceName */
  991. Value = (pAMIGetServiceConfReq->ServiceID);
  992. ServiceErr = GetINT32UBitsNum (Value, &ServiceIDBit);
  993. if(ServiceErr < 0)
  994. {
  995. TCRIT("Error in getting bit number from service_id\n");
  996. *pRes = CC_INV_DATA_FIELD;
  997. return sizeof (INT8U);
  998. }
  999. if(ServiceNameList[ServiceIDBit] == NULL)
  1000. {
  1001. TCRIT("ServiceName is not found in ServiceNameList\n");
  1002. *pRes = CC_UNSPECIFIED_ERR;
  1003. return sizeof (INT8U);
  1004. }
  1005. ServiceErr = get_service_configurations(ServiceNameList[ServiceIDBit], &conf);
  1006. if(ServiceErr < 0)
  1007. {
  1008. *pRes = CC_UNSPECIFIED_ERR;
  1009. return sizeof (INT8U);
  1010. }
  1011. memset(pAMIGetServiceConfRes, 0, sizeof(AMIGetServiceConfRes_T));
  1012. pAMIGetServiceConfRes->ServiceID = pAMIGetServiceConfReq->ServiceID;
  1013. pAMIGetServiceConfRes->Enable = conf.CurrentState;
  1014. strcpy(pAMIGetServiceConfRes->InterfaceName, conf.InterfaceName);
  1015. pAMIGetServiceConfRes->InterfaceName [MAX_SERVICE_IFACE_NAME_SIZE] = '\0';
  1016. pAMIGetServiceConfRes->NonSecureAccessPort = conf.NonSecureAccessPort;
  1017. pAMIGetServiceConfRes->SecureAccessPort = conf.SecureAccessPort;
  1018. pAMIGetServiceConfRes->SessionInactivityTimeout = conf.SessionInactivityTimeout;
  1019. pAMIGetServiceConfRes->MaxAllowSession = conf.MaxAllowSession;
  1020. pAMIGetServiceConfRes->CurrentActiveSession = conf.CurrentActiveSession;
  1021. pAMIGetServiceConfRes->MaxSessionInactivityTimeout= conf.MaxSessionInactivityTimeout;
  1022. pAMIGetServiceConfRes->MinSessionInactivityTimeout= conf.MinSessionInactivityTimeout;
  1023. TDBG( "AMIGETSERVICE: ServiceID=%lu, Enable=%d, Name=%s,\n"
  1024. "port=%d, port=%d, timeout=%d, maxsession=%d, activesession=%d\n, "
  1025. "MaxSessionInactivityTimeout=%d, MinSessionInactivityTimeout=%d",
  1026. pAMIGetServiceConfRes->ServiceID,
  1027. pAMIGetServiceConfRes->Enable,
  1028. pAMIGetServiceConfRes->InterfaceName,
  1029. pAMIGetServiceConfRes->NonSecureAccessPort,
  1030. pAMIGetServiceConfRes->SecureAccessPort,
  1031. pAMIGetServiceConfRes->SessionInactivityTimeout,
  1032. pAMIGetServiceConfRes->MaxAllowSession,
  1033. pAMIGetServiceConfRes->CurrentActiveSession,
  1034. pAMIGetServiceConfRes->MaxSessionInactivityTimeout,
  1035. pAMIGetServiceConfRes->MinSessionInactivityTimeout);
  1036. pAMIGetServiceConfRes->CompletionCode = CC_SUCCESS;
  1037. return(sizeof(AMIGetServiceConfRes_T));
  1038. }
  1039. int
  1040. AMISetServiceConf( _NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
  1041. {
  1042. _NEAR_ AMISetServiceConfReq_T* pAMISetServiceConfReq = (_NEAR_ AMISetServiceConfReq_T*) pReq;
  1043. _NEAR_ AMISetServiceConfRes_T* pAMISetServiceConfRes = (_NEAR_ AMISetServiceConfRes_T*) pRes;
  1044. SERVICE_CONF_STRUCT conf,ReqConf;
  1045. INT32U Value = 0;
  1046. INT8U ServiceIDBit = 0;
  1047. int ServiceErr = 0,i;
  1048. int RebootService = 0;
  1049. if ( '\0' != pAMISetServiceConfReq->InterfaceName[MAX_SERVICE_IFACE_NAME_SIZE])
  1050. {
  1051. TCRIT("Error : The last byte must be null in Interface name \n");
  1052. *pRes = CC_INV_DATA_FIELD;
  1053. return sizeof (INT8U);
  1054. }
  1055. /* Match the service_id byte with ServiceName */
  1056. Value = (pAMISetServiceConfReq->ServiceID);
  1057. ServiceErr = GetINT32UBitsNum (Value, &ServiceIDBit);
  1058. if(ServiceErr < 0)
  1059. {
  1060. TCRIT("Error in Getting Bit Number from Service ID\n");
  1061. *pRes = CC_UNSPECIFIED_ERR;
  1062. return sizeof (INT8U);
  1063. }
  1064. if(ServiceNameList[ServiceIDBit] == NULL)
  1065. {
  1066. TCRIT("Service Name Not Available for the Requested Service ID\n");
  1067. *pRes = CC_UNSPECIFIED_ERR;
  1068. return sizeof (INT8U);
  1069. }
  1070. memset(&ReqConf,0,sizeof(SERVICE_CONF_STRUCT));
  1071. memcpy(&ReqConf.ServiceName[0],ServiceNameList[ServiceIDBit],sizeof(ReqConf.ServiceName));
  1072. memcpy(&ReqConf.InterfaceName[0],&pAMISetServiceConfReq->InterfaceName[0],sizeof(pAMISetServiceConfReq->InterfaceName));
  1073. ReqConf.CurrentState = pAMISetServiceConfReq->Enable;
  1074. ReqConf.MaxAllowSession = pAMISetServiceConfReq->MaxAllowSession;
  1075. ReqConf.SessionInactivityTimeout = pAMISetServiceConfReq->SessionInactivityTimeout;
  1076. ReqConf.SecureAccessPort = pAMISetServiceConfReq->SecureAccessPort;
  1077. ReqConf.NonSecureAccessPort = pAMISetServiceConfReq->NonSecureAccessPort;
  1078. ReqConf.CurrentActiveSession = pAMISetServiceConfReq->CurrentActiveSession;
  1079. if(g_corefeatures.bond_support == ENABLED)
  1080. {
  1081. for(i = 0; i < sizeof(Ifcnametable)/sizeof(IfcName_T); i++)
  1082. {
  1083. if(strcmp(Ifcnametable[i].Ifcname,ReqConf.InterfaceName) == 0 )
  1084. {
  1085. if(CheckBondSlave(Ifcnametable[i].Index) == 1)
  1086. {
  1087. *pRes = NCML_ERR_INVALID_INTERFACE_NAME;
  1088. return sizeof(INT8U);
  1089. }
  1090. else
  1091. {
  1092. break;
  1093. }
  1094. }
  1095. }
  1096. }
  1097. ServiceErr=Validate_SetServiceConfiguration(&ReqConf);
  1098. if(ServiceErr !=CC_NORMAL)
  1099. {
  1100. *pRes=ServiceErr;
  1101. TCRIT("Validate_SetServiceConfiguration Failed %d\n",ServiceErr);
  1102. return sizeof(INT8U);
  1103. }
  1104. ServiceErr = get_service_configurations(ReqConf.ServiceName, &conf);
  1105. if (ServiceErr < 0)
  1106. {
  1107. TCRIT("Error in Getting the Configuration for the Requested Service\n");
  1108. *pRes = CC_UNSPECIFIED_ERR;
  1109. return sizeof (INT8U);
  1110. }
  1111. if ((conf.CurrentState != ReqConf.CurrentState) ||
  1112. (memcmp(conf.InterfaceName, ReqConf.InterfaceName, strlen(conf.InterfaceName)) != 0) ||
  1113. (conf.NonSecureAccessPort != ReqConf.NonSecureAccessPort) ||
  1114. (conf.SecureAccessPort != ReqConf.SecureAccessPort) ||
  1115. (conf.SessionInactivityTimeout != ReqConf.SessionInactivityTimeout) ||
  1116. (conf.MaxAllowSession != ReqConf.MaxAllowSession))
  1117. {
  1118. RebootService = 1;
  1119. }
  1120. memset(&conf, 0, sizeof(SERVICE_CONF_STRUCT));
  1121. memcpy(&conf.ServiceName[0],&ReqConf.ServiceName[0],sizeof(ReqConf.ServiceName));
  1122. conf.CurrentState = ReqConf.CurrentState;
  1123. strcpy(conf.InterfaceName, ReqConf.InterfaceName);
  1124. conf.NonSecureAccessPort = ReqConf.NonSecureAccessPort;
  1125. conf.SecureAccessPort = ReqConf.SecureAccessPort;
  1126. conf.SessionInactivityTimeout = ReqConf.SessionInactivityTimeout;
  1127. conf.MaxAllowSession = ReqConf.MaxAllowSession;
  1128. conf.CurrentActiveSession = ReqConf.CurrentActiveSession;
  1129. ServiceErr = set_service_configurations(ServiceNameList[ServiceIDBit], &conf,g_corefeatures.timeoutd_sess_timeout);
  1130. if(ServiceErr < 0)
  1131. {
  1132. TCRIT("Error in Setting the Configuration for the Requested Service\n");
  1133. *pRes = CC_UNSPECIFIED_ERR;
  1134. return sizeof (INT8U);
  1135. }
  1136. if (RebootService) {
  1137. RestartService(ServiceIDBit,BMCInst);
  1138. RebootService = 0;
  1139. }
  1140. pAMISetServiceConfRes->CompletionCode = CC_SUCCESS;
  1141. return(sizeof(AMISetServiceConfRes_T));
  1142. }
  1143. int AMILinkDownResilent( _NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
  1144. {
  1145. _NEAR_ AMILinkDownResilentReq_T* pAMILinkDownResilentReq = (_NEAR_ AMILinkDownResilentReq_T*) pReq;
  1146. _NEAR_ AMILinkDownResilentRes_T* pAMILinkDownResilentRes = (_NEAR_ AMILinkDownResilentRes_T *) pRes;
  1147. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  1148. pAMILinkDownResilentRes->CompletionCode = CC_SUCCESS;
  1149. if(pAMILinkDownResilentReq->LinkDownEnable== 1)
  1150. {
  1151. pBMCInfo->IpmiConfig.LinkDownResilentSupport = 1;
  1152. pAMILinkDownResilentRes->LinkEnableStatus = pBMCInfo->IpmiConfig.LinkDownResilentSupport;
  1153. }
  1154. else if(pAMILinkDownResilentReq->LinkDownEnable == 0)
  1155. {
  1156. pBMCInfo->IpmiConfig.LinkDownResilentSupport = 0;
  1157. pAMILinkDownResilentRes->LinkEnableStatus = pBMCInfo->IpmiConfig.LinkDownResilentSupport;
  1158. }
  1159. else if(pAMILinkDownResilentReq->LinkDownEnable == 0xFF)
  1160. {
  1161. pAMILinkDownResilentRes->LinkEnableStatus = pBMCInfo->IpmiConfig.LinkDownResilentSupport;
  1162. }
  1163. else
  1164. {
  1165. *pRes = CC_INV_DATA_FIELD;
  1166. }
  1167. return sizeof(AMILinkDownResilentRes_T);
  1168. }
  1169. /*
  1170. * @fn ValidateSetIfaceStateBond
  1171. * @brief Validate the SetIface State Bond Command inupt
  1172. * @param[in] pReq - Request Structure.
  1173. * @param[out] pRes - Response Structure.
  1174. * @param[out] VLANID - VLANID of the slave interfaces (if any, otherwise return 0).
  1175. * @param[in] CheckBondDisable - Validate the Bond disable feature.
  1176. * @param[in] BMCInst - Instance of the BMC.
  1177. * @return
  1178. */
  1179. int ValidateSetIfaceStateBond (INT8U *pReq, INT8U *pRes, INT8U *VLANID, int CheckBondDisable, int BMCInst)
  1180. {
  1181. AMISetIfaceStateReq_T *pAMIIfaceStateReq = (AMISetIfaceStateReq_T *)pReq;
  1182. AMISetIfaceStateRes_T *pAMIIfaceStateRes = (AMISetIfaceStateRes_T *)pRes;
  1183. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  1184. int Ifccount = 0, i;
  1185. char IfcName[16];
  1186. if(g_corefeatures.bond_support != ENABLED)
  1187. {
  1188. *pRes = CC_PARAM_NOT_SUPPORTED;
  1189. return sizeof(INT8U);
  1190. }
  1191. if((pAMIIfaceStateReq->ConfigData.BondIface.AutoConf & ENABLE_DISABLE_MASK)!= 0)
  1192. {
  1193. *pRes = CC_INV_DATA_FIELD;
  1194. return sizeof(INT8U);
  1195. }
  1196. if( pAMIIfaceStateReq->ConfigData.BondIface.Slaves == 0)
  1197. {
  1198. *pRes = CC_INSUFFICIENT_SLAVE_COUNT;
  1199. return sizeof(INT8U);
  1200. }
  1201. /*Get the no of LAN interface count*/
  1202. if(get_network_interface_count(&Ifccount) < 0)
  1203. {
  1204. pAMIIfaceStateRes->CompletionCode = CC_UNSPECIFIED_ERR;
  1205. return sizeof(INT8U);
  1206. }
  1207. if(Ifccount <= 1)
  1208. {
  1209. *pRes = OEMCC_INSUFFIENT_LANIFC_COUNT;
  1210. return sizeof(INT8U);
  1211. }
  1212. if(pAMIIfaceStateReq->ConfigData.BondIface.BondIndex== 0xff)
  1213. {
  1214. IPMI_WARNING("\nInvalid EthIndex number :%x", pAMIIfaceStateReq->ConfigData.BondIface.BondIndex);
  1215. *pRes = CC_INV_DATA_FIELD;
  1216. return sizeof (INT8U);
  1217. }
  1218. if (CheckBondDisable == 1)
  1219. {
  1220. if(g_corefeatures.delayed_lan_restart_support)
  1221. {
  1222. if((!pBMCInfo->BondConfig.Enable) && (pAMIIfaceStateReq->ConfigData.BondIface.Enable == IFACE_DISABLED))
  1223. {
  1224. *pRes = OEMCC_BOND_ALREADY_DISABLED;
  1225. return sizeof(INT8U);
  1226. }
  1227. }
  1228. else
  1229. {
  1230. GetNoofInterface();
  1231. memset(IfcName,0,sizeof(IfcName));
  1232. sprintf(IfcName,"bond%d",pAMIIfaceStateReq->ConfigData.BondIface.BondIndex);
  1233. for(i=0;i<sizeof(Ifcnametable)/sizeof(IfcName_T);i++)
  1234. {
  1235. if(Ifcnametable[i].Ifcname[0] == 0)
  1236. continue;
  1237. if((strcmp(IfcName,Ifcnametable[i].Ifcname) == 0 ))
  1238. {
  1239. if((Ifcnametable[i].Enabled == IFACE_DISABLED ) && (pAMIIfaceStateReq->ConfigData.BondIface.Enable == IFACE_DISABLED))
  1240. {
  1241. *pRes = OEMCC_BOND_ALREADY_DISABLED;
  1242. return sizeof(INT8U);
  1243. }
  1244. break;
  1245. }
  1246. }
  1247. if(i == sizeof(Ifcnametable)/sizeof(IfcName_T))
  1248. {
  1249. *pRes = CC_INV_DATA_FIELD;
  1250. return sizeof(INT8U);
  1251. }
  1252. }
  1253. }
  1254. TDBG("Enable:%d\nBondIndex:%d\nBondMode:%d\nmiiinterval:%d\nSlave:%d\nAutoConf:%d\n",
  1255. pAMIIfaceStateReq->ConfigData.BondIface.Enable,
  1256. pAMIIfaceStateReq->ConfigData.BondIface.BondIndex,
  1257. pAMIIfaceStateReq->ConfigData.BondIface.BondMode,
  1258. pAMIIfaceStateReq->ConfigData.BondIface.MiiInterval,
  1259. pAMIIfaceStateReq->ConfigData.BondIface.Slaves,
  1260. pAMIIfaceStateReq->ConfigData.BondIface.AutoConf);
  1261. /*Validate the bonding mode*/
  1262. if( pAMIIfaceStateReq->ConfigData.BondIface.BondMode > MAX_BOND_MODE)
  1263. {
  1264. IPMI_WARNING("Bond Mode is exceeded\n");
  1265. *pRes = CC_INV_DATA_FIELD;
  1266. return (sizeof(INT8U));
  1267. }
  1268. /*Validate the supported bonding modes*/
  1269. if( pAMIIfaceStateReq->ConfigData.BondIface.BondMode == MAX_BOND_MODE )
  1270. {
  1271. IPMI_WARNING("Bond Mode %d is not supported\n",pAMIIfaceStateReq->ConfigData.BondIface.BondMode);
  1272. *pRes = OEMCC_UNSUPPORTED_BOND_MODE;
  1273. return (sizeof(INT8U));
  1274. }
  1275. /*Validate the miiinterval*/
  1276. if(pAMIIfaceStateReq->ConfigData.BondIface.MiiInterval < DEFAULT_MII_INTERVAL)
  1277. {
  1278. IPMI_WARNING("Mii interval should be greater than 100\n");
  1279. *pRes = CC_INV_DATA_FIELD;
  1280. return (sizeof(INT8U));
  1281. }
  1282. *pRes = CheckSlaveVLANInterface(pAMIIfaceStateReq->ConfigData.BondIface.Slaves, VLANID, BMCInst);
  1283. if ((*pRes) != 0)
  1284. {
  1285. return (sizeof(INT8U));
  1286. }
  1287. return 0;
  1288. }
  1289. /**
  1290. * @fn AMISetIfaceState
  1291. * @brief This function sets the status of interfaces
  1292. * @param Request message and BMC instance
  1293. * @return success completion code
  1294. */
  1295. int AMISetIfaceState( _NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
  1296. {
  1297. _NEAR_ AMISetIfaceStateReq_T* pAMIIfaceStateReq = (_NEAR_ AMISetIfaceStateReq_T *) pReq;
  1298. _NEAR_ AMISetIfaceStateRes_T* pAMIIfaceStateRes = (_NEAR_ AMISetIfaceStateRes_T *) pRes;
  1299. NWCFG_STRUCT cfg;
  1300. NWCFG6_STRUCT cfg6;
  1301. int retValue = 0;
  1302. char IfcName[16],tmpstr[16];
  1303. int EthIndex = 0,i,ethcount=0;
  1304. INT8U CurrentIfaceState = 0x00, VLANID = 0,*curchannel;
  1305. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  1306. BondIface bond;
  1307. int Ifccount = 0;
  1308. memset(&bond,0,sizeof(BondIface));
  1309. INT8U netch = 0;
  1310. if ( ReqLen >= 1 )
  1311. {
  1312. ReqLen -= 1;
  1313. }
  1314. else
  1315. {
  1316. *pRes = CC_REQ_INV_LEN;
  1317. return sizeof (INT8U);
  1318. }
  1319. if(IsBMCNFSMode() != 0)
  1320. {
  1321. IPMI_WARNING("Card in NFS mode, Not safe to set any of interface configurations...\n");
  1322. *pRes = CC_CMD_UNSUPPORTED_UNCONFIGURABLE;
  1323. return sizeof(INT8U);
  1324. }
  1325. if(g_corefeatures.online_flashing_support == ENABLED)
  1326. {
  1327. if(IsCardInFlashMode())
  1328. {
  1329. IPMI_WARNING("Card in Active flash mode, Not safe to set any of network configurations...\n");
  1330. *pRes = CC_DEV_IN_FIRMWARE_UPDATE_MODE;
  1331. return sizeof(INT8U);
  1332. }
  1333. }
  1334. if( 0x02 >pAMIIfaceStateReq->Params)
  1335. {
  1336. if(ReqLen != NwIfcStateConfigParamLenght[pAMIIfaceStateReq->Params])
  1337. {
  1338. TCRIT("params:%d reqLen:%ld\n",pAMIIfaceStateReq->Params,ReqLen);
  1339. *pRes = CC_REQ_INV_LEN;
  1340. return sizeof(INT8U);
  1341. }
  1342. }
  1343. if (g_PDKHandle[PDK_BEFORESETIFACESTATE] != NULL )
  1344. {
  1345. retValue = ((int(*)(INT8U *, INT8U, INT8U *,int))
  1346. (g_PDKHandle[PDK_BEFORESETIFACESTATE]))(pReq, ReqLen, pRes, BMCInst);
  1347. if(retValue != 0)
  1348. {
  1349. return retValue;
  1350. }
  1351. }
  1352. OS_THREAD_TLS_GET(g_tls.CurChannel,curchannel);
  1353. switch(pAMIIfaceStateReq->Params)
  1354. {
  1355. case AMI_IFACE_STATE_ETH:
  1356. if(pAMIIfaceStateReq->ConfigData.EthIface.EthIndex == 0xff)
  1357. {
  1358. IPMI_WARNING("\nInvalid EthIndex number :%x", pAMIIfaceStateReq->ConfigData.EthIface.EthIndex);
  1359. *pRes = CC_INV_DATA_FIELD;
  1360. return sizeof (INT8U);
  1361. }
  1362. //Checking for valid EnableState
  1363. if( (pAMIIfaceStateReq->ConfigData.EthIface.EnableState != DISABLE_V4_V6)
  1364. && (pAMIIfaceStateReq->ConfigData.EthIface.EnableState != ENABLE_V4)
  1365. && (pAMIIfaceStateReq->ConfigData.EthIface.EnableState != ENABLE_V6)
  1366. && (pAMIIfaceStateReq->ConfigData.EthIface.EnableState != ENABLE_V4_V6)
  1367. )
  1368. {
  1369. IPMI_WARNING("\nInvalid EnableState :%x", pAMIIfaceStateReq->ConfigData.EthIface.EnableState);
  1370. *pRes = CC_INV_DATA_FIELD;
  1371. return sizeof (INT8U);
  1372. }
  1373. /*Ethindex to be enabled*/
  1374. EthIndex = pAMIIfaceStateReq->ConfigData.EthIface.EthIndex;
  1375. /*Compare the bonding and eth interfaces */
  1376. if(GetIfcNameByIndex(EthIndex, IfcName) != 0)
  1377. {
  1378. IPMI_WARNING("Invalid EthIndex number %d\n",EthIndex);
  1379. *pRes = CC_INV_DATA_FIELD;
  1380. return sizeof(INT8U);
  1381. }
  1382. sprintf(tmpstr,"bond");
  1383. if(strstr(IfcName,tmpstr) != NULL)
  1384. {
  1385. IPMI_WARNING("Given EthIndex %d is specific to bonding interface. Use specific parameter for bonding\n",EthIndex);
  1386. *pRes = OEMCC_INV_PARAM_ONLY_FOR_NON_BONDING;
  1387. return sizeof(INT8U);
  1388. }
  1389. if(!((g_corefeatures.delayed_lan_restart_support) && !(pBMCInfo->BondConfig.Enable)))
  1390. {
  1391. /*Check if the given Interface is the slave of any Bond interfaces*/
  1392. retValue= CheckBondSlave(pAMIIfaceStateReq->ConfigData.EthIface.EthIndex);
  1393. if(retValue == -1)
  1394. {
  1395. *pRes = CC_UNSPECIFIED_ERR;
  1396. return sizeof(INT8U);
  1397. }
  1398. if(retValue == 1)
  1399. {
  1400. *pRes = CC_PARAM_NOT_SUP_IN_CUR_STATE;
  1401. return sizeof(INT8U);
  1402. }
  1403. }
  1404. /*Update the interface status*/
  1405. GetNoofInterface();
  1406. for(i=0;i<sizeof(Ifcnametable)/sizeof(IfcName_T);i++)
  1407. {
  1408. if(Ifcnametable[i].Ifcname[0] == 0)
  1409. continue;
  1410. if(Ifcnametable[i].Enabled == 1)
  1411. ethcount++;
  1412. }
  1413. memset(&cfg, 0, sizeof(NWCFG_STRUCT));
  1414. memset(&cfg6, 0, sizeof(NWCFG6_STRUCT));
  1415. retValue = nwReadNWCfg_v4_v6(&cfg, &cfg6, EthIndex,g_corefeatures.global_ipv6);
  1416. if(retValue != 0)
  1417. TCRIT("Error in reading network configuration.\n");
  1418. CurrentIfaceState = ((cfg6.enable<<1) | cfg.enable);
  1419. if(CurrentIfaceState == pAMIIfaceStateReq->ConfigData.EthIface.EnableState)
  1420. {
  1421. TCRIT("Iface state is the same, do nothing\n");
  1422. *pRes = CC_SUCCESS;
  1423. return sizeof(AMISetIfaceStateRes_T);
  1424. }
  1425. if(ENABLE_V6 == pAMIIfaceStateReq->ConfigData.EthIface.EnableState)
  1426. {
  1427. if(g_corefeatures.global_ipv6 == ENABLED)
  1428. {
  1429. TDBG("IPv6 only enabled");
  1430. }
  1431. else
  1432. {
  1433. TCRIT("IPMI support for IPv6 is Disabled...\n");
  1434. *pRes = OEMCC_INV_IP4_NOT_ENABLED;
  1435. return sizeof (INT8U);
  1436. }
  1437. }
  1438. if((ethcount == 1) && pAMIIfaceStateReq->ConfigData.EthIface.EnableState == 0x0)
  1439. {
  1440. *pRes =OEMCC_INV_MIN_IFC_COUNT_DISABLED;
  1441. return sizeof(INT8U);
  1442. }
  1443. pBMCInfo->LANCfs[EthIndex].IPv6_Enable = (pAMIIfaceStateReq->ConfigData.EthIface.EnableState & ENABLE_V6) ? 1 : 0;
  1444. pBMCInfo->LANCfs[EthIndex].IPv4_Enable= (pAMIIfaceStateReq->ConfigData.EthIface.EnableState & ENABLE_V4) ? 1 : 0;
  1445. SetPendStatus(PEND_OP_SET_ETH_IFACE_STATE,PEND_STATUS_PENDING);
  1446. PostPendTask(PEND_OP_SET_ETH_IFACE_STATE, (INT8U *)&pAMIIfaceStateReq->ConfigData.EthIface, sizeof(EthIfaceState),*curchannel & 0xF,BMCInst);
  1447. FlushIPMI((INT8U*)&pBMCInfo->LANCfs[0], (INT8U*)&pBMCInfo->LANCfs[EthIndex],
  1448. pBMCInfo->IPMIConfLoc.LANCfsAddr, sizeof(LANConfig_T),BMCInst);
  1449. break;
  1450. case AMI_IFACE_BOND_ENABLED:
  1451. *pRes = CC_ATTEMPT_TO_SET_RO_PARAM;
  1452. return sizeof (*pRes);
  1453. break;
  1454. case AMI_GET_IFACE_COUNT:
  1455. *pRes = CC_ATTEMPT_TO_SET_RO_PARAM;
  1456. return sizeof (*pRes);
  1457. break;
  1458. case AMI_GET_IFACE_CHANNEL:
  1459. *pRes = CC_ATTEMPT_TO_SET_RO_PARAM;
  1460. return sizeof (*pRes);
  1461. break;
  1462. case AMI_GET_IFACE_NAME:
  1463. *pRes = CC_ATTEMPT_TO_SET_RO_PARAM;
  1464. return sizeof (*pRes);
  1465. break;
  1466. case AMI_IFACE_STATE_BOND:
  1467. retValue = ValidateSetIfaceStateBond (pReq, pRes, &VLANID, 1, BMCInst);
  1468. if (retValue != 0)
  1469. {
  1470. return retValue;
  1471. }
  1472. sprintf(IfcName,"bond%d",pAMIIfaceStateReq->ConfigData.BondIface.BondIndex);
  1473. for(i=0;i<MAX_LAN_CHANNELS;i++)
  1474. {
  1475. if(strcmp(pBMCInfo->LanIfcConfig[i].ifname,IfcName) == 0)
  1476. {
  1477. EthIndex=pBMCInfo->LanIfcConfig[i].Ethindex;
  1478. netch = pBMCInfo->LanIfcConfig[i].Chnum ;
  1479. break;
  1480. }
  1481. }
  1482. if (pAMIIfaceStateReq->ConfigData.BondIface.Enable == 1)
  1483. {
  1484. memset(&cfg, 0, sizeof(NWCFG_STRUCT));
  1485. memset(&cfg6, 0, sizeof(NWCFG6_STRUCT));
  1486. memset(IfcName,0,sizeof(IfcName));
  1487. if(g_corefeatures.delayed_lan_restart_support)
  1488. {
  1489. if((pBMCInfo->LANCfs[EthIndex].IPv4_Enable == 0) && (pBMCInfo->LANCfs[EthIndex].IPv6_Enable == 0))
  1490. {
  1491. *pRes = OEMCC_ETH_IFACE_DISABLED;
  1492. return sizeof(INT8U);
  1493. }
  1494. }
  1495. else
  1496. {
  1497. retValue = nwReadNWCfg_v4_v6(&cfg, &cfg6,EthIndex,g_corefeatures.global_ipv6);
  1498. if(retValue != 0)
  1499. TCRIT("Error in reading network configuration.\n");
  1500. if ((cfg.enable == 0) && (cfg6.enable == 0))
  1501. {
  1502. *pRes = OEMCC_ETH_IFACE_DISABLED;
  1503. return sizeof(INT8U);
  1504. }
  1505. }
  1506. }
  1507. _fmemcpy (&pBMCInfo->BondConfig,
  1508. &(pAMIIfaceStateReq->ConfigData.BondIface), sizeof(BondIface));
  1509. SetPendStatus(PEND_OP_SET_BOND_IFACE_STATE,PEND_STATUS_PENDING);
  1510. PostPendTask(PEND_OP_SET_BOND_IFACE_STATE, (INT8U *)&pAMIIfaceStateReq->ConfigData.BondIface, sizeof(BondIface),netch & 0xF,BMCInst);
  1511. if (VLANID != 0)
  1512. {
  1513. cfg.VLANID = VLANID;
  1514. SetPendStatus(PEND_OP_SET_VLAN_ID, PEND_STATUS_PENDING);
  1515. PostPendTask(PEND_OP_SET_VLAN_ID, (INT8U*)&cfg, sizeof(cfg), (*curchannel & 0x0F), BMCInst );
  1516. }
  1517. FlushIPMI((INT8U*)&pBMCInfo->BondConfig, (INT8U*)&pBMCInfo->BondConfig,
  1518. pBMCInfo->IPMIConfLoc.BONDConfigAddr, sizeof(BondIface),BMCInst);
  1519. break;
  1520. case AMI_BOND_ACTIVE_SLAVE:
  1521. if(g_corefeatures.bond_support != ENABLED)
  1522. {
  1523. *pRes = CC_PARAM_NOT_SUPPORTED;
  1524. return sizeof(INT8U);
  1525. }
  1526. memset(IfcName,0,sizeof(IfcName));
  1527. sprintf(IfcName,"bond%d",pAMIIfaceStateReq->ConfigData.ActiveSlave.BondIndex);
  1528. for(i=0;i<sizeof(Ifcnametable)/sizeof(IfcName_T);i++)
  1529. {
  1530. if((strcmp(IfcName,Ifcnametable[i].Ifcname) == 0 ) )
  1531. {
  1532. break;
  1533. }
  1534. }
  1535. /*Bond index is Invalid*/
  1536. if(i == sizeof(Ifcnametable)/sizeof(IfcName_T))
  1537. {
  1538. *pRes = OEMCC_BOND_NOT_ENABLED;
  1539. return sizeof(INT8U);
  1540. }
  1541. if(pAMIIfaceStateReq->ConfigData.ActiveSlave.ActiveIndex == 0x0)
  1542. {
  1543. *pRes = CC_INV_DATA_FIELD;
  1544. return sizeof(INT8U);
  1545. }
  1546. /*Index value 0xff will enable both eth0 and eth1 interface*/
  1547. if(pAMIIfaceStateReq->ConfigData.ActiveSlave.ActiveIndex != 0xff )
  1548. {
  1549. for(i=0;i<BOND_MAX_SLAVE;i++)
  1550. {
  1551. if((pAMIIfaceStateReq->ConfigData.ActiveSlave.ActiveIndex >> i) & IFACE_ENABLED)
  1552. {
  1553. Ifccount++;
  1554. /*Check Slave Entry presence*/
  1555. if(CheckIfcEntry(i,ETH_IFACE_TYPE) != 0)
  1556. {
  1557. *pRes = CC_INV_DATA_FIELD;
  1558. return sizeof(INT8U);
  1559. }
  1560. }
  1561. }
  1562. }
  1563. if (nwGetBondConf( &bond, pAMIIfaceStateReq->ConfigData.ActiveSlave.BondIndex) != 0)
  1564. {
  1565. TDBG("Error in getting Bonding Configurations\n");
  1566. }
  1567. if((bond.BondMode == BOND_ACTIVE_BACKUP) && ((pAMIIfaceStateReq->ConfigData.ActiveSlave.ActiveIndex == 0xff) || (Ifccount > 1)))
  1568. {
  1569. *pRes = CC_INV_DATA_FIELD;
  1570. return sizeof(INT8U);
  1571. }
  1572. if(bond.BondMode == BOND_ACTIVE_BACKUP)
  1573. {
  1574. for(i=0;i<BOND_MAX_SLAVE;i++)
  1575. {
  1576. if((pAMIIfaceStateReq->ConfigData.ActiveSlave.ActiveIndex >> i) & IFACE_ENABLED)
  1577. {
  1578. if(CheckIfcLinkStatus(i) != 1)
  1579. {
  1580. *pRes = OEMCC_ACTIVE_SLAVE_LINK_DOWN;
  1581. return sizeof(INT8U);
  1582. }
  1583. break;
  1584. }
  1585. }
  1586. }
  1587. SetPendStatus(PEND_OP_SET_ACTIVE_SLAVE,PEND_STATUS_PENDING);
  1588. PostPendTask(PEND_OP_SET_ACTIVE_SLAVE, (INT8U *)&pAMIIfaceStateReq->ConfigData.ActiveSlave, sizeof(ActiveSlave_T),*curchannel & 0xF,BMCInst);
  1589. break;
  1590. case AMI_BOND_VLAN_ENABLED:
  1591. if(g_corefeatures.bond_support == ENABLED)
  1592. {
  1593. *pRes = CC_ATTEMPT_TO_SET_RO_PARAM;
  1594. }
  1595. else
  1596. {
  1597. *pRes = CC_PARAM_NOT_SUPPORTED;
  1598. }
  1599. return sizeof (*pRes);
  1600. break;
  1601. default:
  1602. pAMIIfaceStateRes->CompletionCode = CC_PARAM_NOT_SUPPORTED;
  1603. return sizeof(INT8U);
  1604. }
  1605. pAMIIfaceStateRes->CompletionCode = CC_SUCCESS;
  1606. return sizeof(AMISetIfaceStateRes_T);
  1607. }
  1608. /**
  1609. * @fn AMIGetIfaceState
  1610. * @brief This function returns the status of interfaces
  1611. * @param Request message and BMC instance
  1612. * @return status of interfaces
  1613. */
  1614. int AMIGetIfaceState( _NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
  1615. {
  1616. _NEAR_ AMIGetIfaceStateReq_T* pAMIIfaceStateReq = (_NEAR_ AMIGetIfaceStateReq_T *) pReq;
  1617. _NEAR_ AMIGetIfaceStateRes_T* pAMIIfaceStateRes = (_NEAR_ AMIGetIfaceStateRes_T *) pRes;
  1618. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  1619. NWCFG_STRUCT cfg;
  1620. NWCFG6_STRUCT cfg6;
  1621. BondIface bond;
  1622. char tmpstr[16];
  1623. char IfcName[16],EthIfcname[MAX_ETHIFC_LEN * MAX_LAN_CHANNELS];
  1624. int retValue = 0,i,Ifccount = 0,j,count=0;
  1625. int EthIndex = 0,NIC_Count = 0,netindex = 0;
  1626. INT8U CurrentIfaceState = 0x00;
  1627. if(0 != pAMIIfaceStateReq->BlockSelect)
  1628. {
  1629. IPMI_WARNING("Invalid BlockSelect :%x\n", pAMIIfaceStateReq->BlockSelect);
  1630. *pRes = CC_INV_DATA_FIELD;
  1631. return sizeof (INT8U);
  1632. }
  1633. if (g_PDKHandle[PDK_BEFOREGETIFACESTATE] != NULL )
  1634. {
  1635. retValue = ((int(*)(INT8U *, INT8U, INT8U *,int))
  1636. (g_PDKHandle[PDK_BEFOREGETIFACESTATE]))(pReq, ReqLen, pRes, BMCInst);
  1637. if(retValue != 0)
  1638. {
  1639. return retValue;
  1640. }
  1641. }
  1642. GetNoofInterface();
  1643. switch(pAMIIfaceStateReq->Params)
  1644. {
  1645. case AMI_IFACE_STATE_ETH:
  1646. if(pAMIIfaceStateReq->SetSelect== 0xff)
  1647. {
  1648. IPMI_WARNING("\nInvalid EthIndex number :%x", pAMIIfaceStateReq->SetSelect);
  1649. *pRes = CC_INV_DATA_FIELD;
  1650. return sizeof (INT8U);
  1651. }
  1652. EthIndex = pAMIIfaceStateReq->SetSelect;
  1653. if(GetIfcNameByIndex(EthIndex, IfcName) != 0)
  1654. {
  1655. IPMI_WARNING("Invalid EthIndex number %d\n",EthIndex);
  1656. *pRes = CC_INV_DATA_FIELD;
  1657. return sizeof(INT8U);
  1658. }
  1659. /* sprintf(tmpstr,"bond0");
  1660. if(strcmp(tmpstr,IfcName) == 0)
  1661. {
  1662. IPMI_WARNING("Given EthIndex %d is specific to bonding interface. Use specific parameter for bonding\n",EthIndex);
  1663. *pRes = CC_INV_DATA_FIELD;
  1664. return sizeof(INT8U);
  1665. }*/
  1666. memset(&cfg, 0, sizeof(NWCFG_STRUCT));
  1667. memset(&cfg6, 0, sizeof(NWCFG6_STRUCT));
  1668. if((g_corefeatures.delayed_lan_restart_support))
  1669. {
  1670. netindex = EthIndex;
  1671. if(pBMCInfo->BondConfig.Enable == 1)
  1672. {
  1673. sprintf(tmpstr,"bond0");
  1674. for(i=0; i < MAX_LAN_CHANNELS; i++)
  1675. {
  1676. if(strcmp(tmpstr, pBMCInfo->LanIfcConfig[i].ifname) == 0)
  1677. {
  1678. netindex = pBMCInfo->LanIfcConfig[i].Ethindex;
  1679. }
  1680. }
  1681. }
  1682. cfg6.enable = pBMCInfo->LANCfs[netindex].IPv6_Enable;
  1683. cfg.enable = pBMCInfo->LANCfs[netindex].IPv4_Enable;
  1684. }
  1685. else
  1686. {
  1687. retValue = nwReadNWCfg_v4_v6(&cfg, &cfg6, EthIndex,g_corefeatures.global_ipv6);
  1688. if(retValue != 0)
  1689. TCRIT("Error in reading network configuration.\n");
  1690. }
  1691. pAMIIfaceStateRes->ConfigData.EthIface.EthIndex = EthIndex;
  1692. CurrentIfaceState = ((cfg6.enable<<1) | cfg.enable);
  1693. pAMIIfaceStateRes->ConfigData.EthIface.EnableState = CurrentIfaceState;
  1694. pAMIIfaceStateRes->CompletionCode = CC_NORMAL;
  1695. return sizeof(INT8U) + sizeof(EthIfaceState);
  1696. break;
  1697. case AMI_IFACE_STATE_BOND:
  1698. if(g_corefeatures.bond_support == ENABLED)
  1699. {
  1700. if(pAMIIfaceStateReq->SetSelect== 0xff)
  1701. {
  1702. IPMI_WARNING("\nInvalid EthIndex number :%x", pAMIIfaceStateReq->SetSelect);
  1703. *pRes = CC_INV_DATA_FIELD;
  1704. return sizeof (INT8U);
  1705. }
  1706. EthIndex = pAMIIfaceStateReq->SetSelect;
  1707. memset(&bond,0,sizeof(BondIface));
  1708. if(g_corefeatures.delayed_lan_restart_support)
  1709. {
  1710. if(EthIndex == pBMCInfo->BondConfig.BondIndex)
  1711. {
  1712. memcpy(&bond, &pBMCInfo->BondConfig, sizeof(BondIface));
  1713. }
  1714. }
  1715. else
  1716. {
  1717. if (nwGetBondConf( &bond, EthIndex) != 0)
  1718. {
  1719. TDBG("Error in getting Bonding Configurations\n");
  1720. }
  1721. }
  1722. pAMIIfaceStateRes->CompletionCode = CC_NORMAL;
  1723. pAMIIfaceStateRes->ConfigData.BondIface.Enable = bond.Enable;
  1724. pAMIIfaceStateRes->ConfigData.BondIface.BondIndex = bond.BondIndex;
  1725. pAMIIfaceStateRes->ConfigData.BondIface.BondMode = bond.BondMode;
  1726. pAMIIfaceStateRes->ConfigData.BondIface.MiiInterval = bond.MiiInterval;
  1727. pAMIIfaceStateRes->ConfigData.BondIface.Slaves = bond.Slaves;
  1728. pAMIIfaceStateRes->ConfigData.BondIface.AutoConf = bond.AutoConf;
  1729. return sizeof(INT8U) +sizeof(BondIface);
  1730. }
  1731. else
  1732. {
  1733. *pRes = CC_PARAM_NOT_SUPPORTED;
  1734. return sizeof(INT8U);
  1735. }
  1736. break;
  1737. case AMI_IFACE_BOND_ENABLED:
  1738. if(pAMIIfaceStateReq->SetSelect != 0)
  1739. {
  1740. IPMI_WARNING("\nInvalid BondIndex number :%x", pAMIIfaceStateReq->SetSelect);
  1741. *pRes = CC_INV_DATA_FIELD;
  1742. return sizeof (INT8U);
  1743. }
  1744. memset(IfcName,0,sizeof(IfcName));
  1745. sprintf(IfcName,"bond%d",pAMIIfaceStateReq->SetSelect);
  1746. for(i=0;i<sizeof(pBMCInfo->LanIfcConfig)/sizeof(LANIFCConfig_T);i++)
  1747. {
  1748. if((strcmp(IfcName,pBMCInfo->LanIfcConfig[i].ifname) == 0 ) &&
  1749. (pBMCInfo->LanIfcConfig[i].Up_Status == 1))
  1750. {
  1751. pAMIIfaceStateRes->ConfigData.BondEnable.Enabled = 1;
  1752. break;
  1753. }
  1754. else
  1755. {
  1756. pAMIIfaceStateRes->ConfigData.BondEnable.Enabled = 0;
  1757. pAMIIfaceStateRes->ConfigData.BondEnable.BondIndex = 0;
  1758. }
  1759. }
  1760. for(i=0;i< sizeof(Ifcnametable)/sizeof(IfcName_T);i++)
  1761. {
  1762. if(Ifcnametable[i].Ifcname[0] == 0)
  1763. continue;
  1764. if( (strcmp(IfcName,Ifcnametable[i].Ifcname) == 0) &&
  1765. (pAMIIfaceStateRes->ConfigData.BondEnable.Enabled == 1))
  1766. {
  1767. pAMIIfaceStateRes->ConfigData.BondEnable.BondIndex = Ifcnametable[i].Index;
  1768. break;
  1769. }
  1770. }
  1771. pAMIIfaceStateRes->CompletionCode = CC_NORMAL;
  1772. return sizeof(INT8U)+sizeof(BondEnabled_T);
  1773. break;
  1774. case AMI_GET_IFACE_COUNT:
  1775. /*Get the no of LAN interface count support for IPMI*/
  1776. if( NULL != g_PDKHandle[PDK_GETIFACECOUNT])
  1777. {
  1778. if( 0xFF != (((INT8U(*)(INT8U *, INT8U *, int))(g_PDKHandle[PDK_GETIFACECOUNT]))
  1779. (pAMIIfaceStateRes->ConfigData.LANCount.EthIndex,
  1780. &pAMIIfaceStateRes->ConfigData.LANCount.Count, BMCInst)))
  1781. {
  1782. pAMIIfaceStateRes->CompletionCode = CC_NORMAL;
  1783. return sizeof (AMIGetIfaceStateRes_T);
  1784. }
  1785. }
  1786. if(get_network_interface_count(&Ifccount) < 0)
  1787. {
  1788. pAMIIfaceStateRes->CompletionCode = CC_UNSPECIFIED_ERR;
  1789. return sizeof(INT8U);
  1790. }
  1791. memset(EthIfcname,0,MAX_ETHIFC_LEN * MAX_LAN_CHANNELS);
  1792. memset(pAMIIfaceStateRes->ConfigData.LANCount.EthIndex,0,MAX_LAN_CHANNEL);
  1793. if(get_network_interfaces_name(EthIfcname,Ifccount) < 0)
  1794. {
  1795. pAMIIfaceStateRes->CompletionCode = CC_UNSPECIFIED_ERR;
  1796. return sizeof(INT8U);
  1797. }
  1798. count = 0;
  1799. /*Get the Index value of each LAN Interface*/
  1800. for(i=0;i<sizeof(Ifcnametable)/sizeof(IfcName_T);i++)
  1801. {
  1802. if(Ifcnametable[i].Ifcname[0] == 0)
  1803. continue;
  1804. for(j=0;j <Ifccount;j++)
  1805. {
  1806. if((strcmp(Ifcnametable[i].Ifcname,&EthIfcname[j*MAX_ETHIFC_LEN]) == 0)
  1807. && (strlen(Ifcnametable[i].Ifcname) != 0))
  1808. {
  1809. pAMIIfaceStateRes->ConfigData.LANCount.EthIndex[count] = Ifcnametable[i].Index;
  1810. count++;
  1811. }
  1812. }
  1813. }
  1814. /* force count value to match CONFIG_SPX_FEATURE_GLOBAL_NIC_COUNT */
  1815. NIC_Count =g_coremacros.global_nic_count;
  1816. if(count > NIC_Count)
  1817. {
  1818. count = NIC_Count;
  1819. }
  1820. pAMIIfaceStateRes->CompletionCode = CC_NORMAL;
  1821. pAMIIfaceStateRes->ConfigData.LANCount.Count = count;
  1822. return sizeof(INT8U)+sizeof(LANIfcCount_T);
  1823. break;
  1824. case AMI_GET_IFACE_CHANNEL:
  1825. pAMIIfaceStateRes->ConfigData.IfcChannel.Channel = 0;
  1826. for(i=0;i<sizeof(Ifcnametable)/sizeof(IfcName_T);i++)
  1827. {
  1828. if(Ifcnametable[i].Ifcname[0] == 0)
  1829. continue;
  1830. if(Ifcnametable[i].Index== pAMIIfaceStateReq->SetSelect)
  1831. {
  1832. for(j=0;j<MAX_LAN_CHANNELS;j++)
  1833. {
  1834. if(strcmp(Ifcnametable[i].Ifcname,pBMCInfo->LanIfcConfig[j].ifname) == 0)
  1835. {
  1836. pAMIIfaceStateRes->ConfigData.IfcChannel.Channel = pBMCInfo->LanIfcConfig[j].Chnum;
  1837. pAMIIfaceStateRes->CompletionCode = CC_SUCCESS;
  1838. return sizeof(INT8U)+sizeof(GetIfcChannel_T);
  1839. }
  1840. }
  1841. }
  1842. }
  1843. *pRes = CC_INV_DATA_FIELD;
  1844. return sizeof(INT8U);
  1845. break;
  1846. case AMI_GET_IFACE_NAME:
  1847. memset(&pAMIIfaceStateRes->ConfigData.IfcName.IfcName,0,sizeof(MAX_IFACE_NAME));
  1848. for(i=0;i<sizeof(Ifcnametable)/sizeof(IfcName_T);i++)
  1849. {
  1850. if(Ifcnametable[i].Ifcname[0] == 0)
  1851. continue;
  1852. if(Ifcnametable[i].Index== pAMIIfaceStateReq->SetSelect)
  1853. {
  1854. memcpy(&pAMIIfaceStateRes->ConfigData.IfcName.IfcName,&Ifcnametable[i].Ifcname,MAX_IFACE_NAME);
  1855. pAMIIfaceStateRes->CompletionCode = CC_SUCCESS;
  1856. return sizeof(INT8U)+sizeof(GetIfcName_T);
  1857. }
  1858. }
  1859. *pRes = CC_INV_DATA_FIELD;
  1860. return sizeof(INT8U);
  1861. break;
  1862. case AMI_BOND_ACTIVE_SLAVE:
  1863. if(g_corefeatures.bond_support == ENABLED)
  1864. {
  1865. memset(IfcName,0,sizeof(IfcName));
  1866. sprintf(IfcName,"bond%d",pAMIIfaceStateReq->SetSelect);
  1867. for(i=0;i<sizeof(Ifcnametable)/sizeof(IfcName_T);i++)
  1868. {
  1869. if(Ifcnametable[i].Ifcname[0] == 0)
  1870. continue;
  1871. if((strcmp(IfcName,Ifcnametable[i].Ifcname) == 0 ))
  1872. {
  1873. pAMIIfaceStateRes->ConfigData.ActiveSlave.BondIndex = pAMIIfaceStateReq->SetSelect;
  1874. break;
  1875. }
  1876. }
  1877. /*Bond index is Invalid*/
  1878. if(i == sizeof(Ifcnametable)/sizeof(IfcName_T))
  1879. {
  1880. *pRes = OEMCC_BOND_NOT_ENABLED;
  1881. return sizeof(INT8U);
  1882. }
  1883. /*Get the active slave configuration*/
  1884. nwGetActiveSlave(pAMIIfaceStateReq->SetSelect,&pAMIIfaceStateRes->ConfigData.ActiveSlave.ActiveIndex);
  1885. pAMIIfaceStateRes->CompletionCode = CC_NORMAL;
  1886. return sizeof(INT8U)+sizeof(ActiveSlave_T);
  1887. }
  1888. else
  1889. {
  1890. *pRes = CC_PARAM_NOT_SUPPORTED;
  1891. return sizeof(INT8U);
  1892. }
  1893. break;
  1894. case AMI_BOND_VLAN_ENABLED:
  1895. if(g_corefeatures.bond_support == ENABLED)
  1896. {
  1897. memset(IfcName,0,sizeof(IfcName));
  1898. sprintf(IfcName,"bond%d",pAMIIfaceStateReq->SetSelect);
  1899. if(CheckVLANInterface(IfcName, BMCInst) == 1)
  1900. pAMIIfaceStateRes->ConfigData.BondVLAN.Enabled = 1;
  1901. else
  1902. pAMIIfaceStateRes->ConfigData.BondVLAN.Enabled = 0;
  1903. pAMIIfaceStateRes->CompletionCode = CC_SUCCESS;
  1904. return sizeof(INT8U)+sizeof(BondVLAN_T);
  1905. }
  1906. else
  1907. {
  1908. *pRes = CC_PARAM_NOT_SUPPORTED;
  1909. return sizeof(INT8U);
  1910. }
  1911. break;
  1912. default:
  1913. pAMIIfaceStateRes->CompletionCode = CC_PARAM_NOT_SUPPORTED;
  1914. return sizeof(INT8U);
  1915. }
  1916. pAMIIfaceStateRes->CompletionCode = CC_SUCCESS;
  1917. return sizeof (AMIGetIfaceStateRes_T);
  1918. }
  1919. /**
  1920. * @fn AMISetFirewall
  1921. * @brief This function sets the iptables Firewall
  1922. * @param Request message and Iptables State
  1923. */
  1924. int AMISetFirewall ( _NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes ,int BMCInst )
  1925. {
  1926. _NEAR_ AMISetFirewallReq_T *pAMISetFirewallReq = ( _NEAR_ AMISetFirewallReq_T *) pReq;
  1927. _NEAR_ AMISetFirewallRes_T *pAMISetFirewallRes = ( _NEAR_ AMISetFirewallRes_T *) pRes;
  1928. INT8U *curchannel;
  1929. if(g_corefeatures.system_firewall_support != CORE_FEATURE_ENABLED)
  1930. {
  1931. pAMISetFirewallRes->CompletionCode = CC_INV_CMD;
  1932. return sizeof(INT8U);
  1933. }
  1934. if(0x0b > pAMISetFirewallReq->Param ) //Max known Firewall paramter
  1935. {
  1936. if ((ReqLen-1) != FirewallConfigParamLength [pAMISetFirewallReq->Param ])
  1937. {
  1938. *pRes = CC_REQ_INV_LEN;
  1939. TDBG("Your entered Parameter %d is not a valid data \n",pAMISetFirewallReq->Param);
  1940. return sizeof (INT8U);
  1941. }
  1942. else
  1943. {
  1944. TDBG("Your entered Parameter %d is a valid data... \n",pAMISetFirewallReq->Param);
  1945. }
  1946. }
  1947. void *dl_handle = NULL;
  1948. void ( *dl_func )( void *, void * );
  1949. void ( *dl_block )( void * );
  1950. dl_handle = NULL;
  1951. dl_handle = dlopen ( "/usr/local/lib/libiptables.so", RTLD_NOW );
  1952. if(NULL == dl_handle)
  1953. {
  1954. IPMI_ERROR("Error in loading libiptables.so library %s\n", dlerror() );
  1955. return 0;
  1956. }
  1957. switch ( pAMISetFirewallReq->Param )
  1958. {
  1959. case IP_IPV4:
  1960. dl_func = dlsym( dl_handle, "block_ip_ipv4" );
  1961. if(NULL == dl_func)
  1962. {
  1963. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  1964. dlclose(dl_handle);
  1965. return 0;
  1966. }
  1967. dl_func ( (void *)&pAMISetFirewallReq->State,(void *) pAMISetFirewallReq->CMD_INFO.IPAddr_ipv4 );
  1968. break;
  1969. case IPS_IPV4:
  1970. dl_func = dlsym( dl_handle, "block_ip_range_ipv4" );
  1971. if(NULL == dl_func)
  1972. {
  1973. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  1974. dlclose(dl_handle);
  1975. return 0;
  1976. }
  1977. dl_func ( (void *)&pAMISetFirewallReq->State,(void *) &pAMISetFirewallReq->CMD_INFO.IPRange_ipv4 );
  1978. break;
  1979. case PORT:
  1980. dl_func = dlsym( dl_handle, "block_port" );
  1981. if(NULL == dl_func)
  1982. {
  1983. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  1984. dlclose(dl_handle);
  1985. return 0;
  1986. }
  1987. dl_func ( (void *)&pAMISetFirewallReq->State,(void *) &pAMISetFirewallReq->CMD_INFO.Port_Data);
  1988. break;
  1989. case PORT_RANGE:
  1990. dl_func = dlsym ( dl_handle, "block_range_ports" );
  1991. if(NULL == dl_func)
  1992. {
  1993. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  1994. dlclose(dl_handle);
  1995. return 0;
  1996. }
  1997. dl_func ( (void *)&pAMISetFirewallReq->State,(void *) &pAMISetFirewallReq->CMD_INFO.Port_Range);
  1998. break;
  1999. case IP_IPV4_Unlock:
  2000. dl_func = dlsym( dl_handle, "release_ip_ipv4" );
  2001. if(NULL == dl_func)
  2002. {
  2003. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  2004. dlclose(dl_handle);
  2005. return 0;
  2006. }
  2007. dl_func ( (void *)&pAMISetFirewallReq->State,(void *) pAMISetFirewallReq->CMD_INFO.IPAddr_ipv4 );
  2008. break;
  2009. case IPS_IPV4_Unlock:
  2010. dl_func = dlsym( dl_handle, "release_range_ip_ipv4" );
  2011. if(NULL == dl_func)
  2012. {
  2013. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  2014. dlclose(dl_handle);
  2015. return 0;
  2016. }
  2017. dl_func ( (void *)&pAMISetFirewallReq->State,(void *) &pAMISetFirewallReq->CMD_INFO.IPRange_ipv4 );
  2018. break;
  2019. case PORT_Release:
  2020. dl_func = dlsym( dl_handle, "release_port" );
  2021. if(NULL == dl_func)
  2022. {
  2023. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  2024. dlclose(dl_handle);
  2025. return 0;
  2026. }
  2027. dl_func ( (void *)&pAMISetFirewallReq->State,(void *) &pAMISetFirewallReq->CMD_INFO.Port_Data );
  2028. break;
  2029. case PORT_RANGE_Release:
  2030. dl_func = dlsym( dl_handle, "release_range_port" );
  2031. if(NULL == dl_func)
  2032. {
  2033. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  2034. dlclose(dl_handle);
  2035. return 0;
  2036. }
  2037. dl_func ( (void *)&pAMISetFirewallReq->State,(void *) &pAMISetFirewallReq->CMD_INFO.Port_Range);
  2038. break;
  2039. case FLUSH:
  2040. dl_func = dlsym (dl_handle, "flush_iptables");
  2041. if ( NULL == dl_func )
  2042. {
  2043. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  2044. dlclose(dl_handle);
  2045. return 0;
  2046. }
  2047. dl_func ( (void *) NULL, (void *)NULL );
  2048. break;
  2049. /*
  2050. case ENABLE_ALL:
  2051. dl_func = dlsym (dl_handle, "enable_all");
  2052. if ( NULL == dl_func )
  2053. {
  2054. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  2055. dlclose(dl_handle);
  2056. return 0;
  2057. }
  2058. dl_func ( (void *) NULL );
  2059. break;
  2060. */
  2061. case DISABLE_ALL:
  2062. if ( pAMISetFirewallReq->CMD_INFO.Block > 3 || pAMISetFirewallReq->CMD_INFO.Block == 0)
  2063. {
  2064. IPMI_ERROR("Invalid data\n");
  2065. *pRes = CC_INV_DATA_FIELD;
  2066. dlclose(dl_handle);
  2067. return sizeof(INT8U);
  2068. }
  2069. OS_THREAD_TLS_GET(g_tls.CurChannel,curchannel);
  2070. SetPendStatus(PEND_OP_SET_BLOCK_ALL,PEND_STATUS_PENDING);
  2071. PostPendTask(PEND_OP_SET_BLOCK_ALL, (INT8U *)&pAMISetFirewallReq->CMD_INFO.Block, sizeof(INT8U),*curchannel & 0xF,BMCInst);
  2072. break;
  2073. case REMOVE_DISABLE_ALL:
  2074. if ( pAMISetFirewallReq->CMD_INFO.Unblock > 3 || pAMISetFirewallReq->CMD_INFO.Unblock == 0)
  2075. {
  2076. IPMI_ERROR("Invalid data\n");
  2077. *pRes = CC_INV_DATA_FIELD;
  2078. dlclose(dl_handle);
  2079. return sizeof(INT8U);
  2080. }
  2081. dl_block = dlsym (dl_handle, "remove_block_all");
  2082. if ( NULL == dl_block)
  2083. {
  2084. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  2085. dlclose(dl_handle);
  2086. return 0;
  2087. }
  2088. dl_block ( (void *)&pAMISetFirewallReq->CMD_INFO.Unblock);
  2089. break;
  2090. default:
  2091. pAMISetFirewallRes->CompletionCode = CC_PARAM_NOT_SUPPORTED;
  2092. }
  2093. dlclose (dl_handle);
  2094. pAMISetFirewallRes->CompletionCode = CC_SUCCESS;
  2095. return sizeof(AMISetFirewallRes_T);
  2096. }
  2097. /**
  2098. * @fn AMIGetFirewall
  2099. * @brief This function is used to Get the iptables rules
  2100. * @param Request message and Command Info
  2101. */
  2102. int AMIGetFirewall ( _NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes ,int BMCInst )
  2103. {
  2104. _NEAR_ AMIGetFirewallReq_T *pAMIGetFirewallReq = ( _NEAR_ AMIGetFirewallReq_T *) pReq;
  2105. _NEAR_ AMIGetFirewallRes_T *pAMIGetFirewallRes = ( _NEAR_ AMIGetFirewallRes_T *) pRes;
  2106. int retVal=0;
  2107. if(g_corefeatures.system_firewall_support != CORE_FEATURE_ENABLED)
  2108. {
  2109. pAMIGetFirewallRes->CCParam.CompletionCode = CC_INV_CMD;
  2110. return sizeof(INT8U);
  2111. }
  2112. if(0x02 > pAMIGetFirewallReq->Param ) //Max known Firewall paramter
  2113. {
  2114. if ((ReqLen-1) != GetFirewallConfigParamLength [pAMIGetFirewallReq->Param ])
  2115. {
  2116. *pRes = CC_REQ_INV_LEN;
  2117. TDBG("Your entered Parameter %d is not a valid data \n",pAMIGetFirewallReq->Param);
  2118. return sizeof (INT8U);
  2119. }
  2120. else
  2121. {
  2122. TDBG("Your entered Parameter %d is a valid data... \n",pAMIGetFirewallReq->Param);
  2123. }
  2124. }
  2125. void *dl_handle = NULL;
  2126. int ( *dl_func )( void * ,void * )=NULL;
  2127. int ( *dl_func0 )()=NULL;
  2128. dl_handle = dlopen ( "/usr/local/lib/libiptables.so", RTLD_NOW );
  2129. if(NULL == dl_handle)
  2130. {
  2131. IPMI_ERROR("Error in loading libiptables.so library %s\n", dlerror() );
  2132. return -1;
  2133. }
  2134. switch( pAMIGetFirewallReq->Param )
  2135. {
  2136. case GET_IPTABLE_COUNT:
  2137. dl_func0 = dlsym (dl_handle, "get_iptable_count");
  2138. if ( NULL == dl_func0 )
  2139. {
  2140. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  2141. dlclose(pAMIGetFirewallRes);
  2142. return -1;
  2143. }
  2144. pAMIGetFirewallRes->FWInfo.TotalCount= dl_func0 ();
  2145. break;
  2146. case GET_ENTRY_INFO:
  2147. dl_func = dlsym (dl_handle, "get_iptable_entry");
  2148. if ( NULL == dl_func )
  2149. {
  2150. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  2151. dlclose(pAMIGetFirewallRes);
  2152. return CC_PARAM_NOT_SUPPORTED;
  2153. }
  2154. retVal = dl_func ( (INT8U *)&pAMIGetFirewallReq->EntryNo, (INT8U *)&pAMIGetFirewallRes->FWInfo.Info );
  2155. if(retVal == -1)
  2156. {
  2157. pAMIGetFirewallRes->CCParam.CompletionCode = CC_INV_DATA_FIELD;
  2158. return sizeof(INT8U);
  2159. }
  2160. break;
  2161. case IS_BLOCK_ALL:
  2162. dl_func0 = dlsym (dl_handle, "IsBlockAllEnabled");
  2163. if ( NULL == dl_func0 )
  2164. {
  2165. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  2166. dlclose(pAMIGetFirewallRes);
  2167. return -1;
  2168. }
  2169. retVal = dl_func0();
  2170. if(retVal != -1)
  2171. {
  2172. pAMIGetFirewallRes->FWInfo.IsBlockAll=retVal;
  2173. }
  2174. else
  2175. {
  2176. pAMIGetFirewallRes->FWInfo.IsBlockAll=0;
  2177. }
  2178. break;
  2179. default:
  2180. pAMIGetFirewallRes->CCParam.CompletionCode = CC_PARAM_NOT_SUPPORTED;
  2181. return sizeof(INT8U);
  2182. }
  2183. dlclose (dl_handle);
  2184. pAMIGetFirewallRes->CCParam.CompletionCode = CC_SUCCESS;
  2185. if( pAMIGetFirewallReq->Param == GET_IPTABLE_COUNT)
  2186. {
  2187. return sizeof(GetFWCC_T)+sizeof(INT8U);
  2188. }
  2189. else if( pAMIGetFirewallReq->Param == IS_BLOCK_ALL)
  2190. {
  2191. return sizeof(GetFWCC_T)+sizeof(INT8U);
  2192. }
  2193. else
  2194. {
  2195. return sizeof(GetFWCC_T) + sizeof(pAMIGetFirewallRes->FWInfo.Info.TYPE) + FirewallConfigParamLength[pAMIGetFirewallRes->FWInfo.Info.TYPE];
  2196. }
  2197. }
  2198. int
  2199. AMISetSNMPConf( _NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
  2200. {
  2201. _NEAR_ AMISetSNMPConfRes_T *pAMISetSNMPConfRes = (_NEAR_ AMISetSNMPConfRes_T *)pRes;
  2202. _NEAR_ AMISetSNMPConfReq_T * snmpcfg = (_NEAR_ AMISetSNMPConfReq_T*)pReq;
  2203. void *dl_snmphandle = NULL;
  2204. int ( *dl_snmpadduser )( char*,char*,INT8U,INT8U,INT8U)=NULL;
  2205. int ( *dl_snmpdeluser)()=NULL;
  2206. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  2207. _FAR_ UserInfo_T* pUserInfo;
  2208. INT8U PwdEncKey[MAX_SIZE_KEY] = {0};
  2209. char Tmp_UserName[MAX_USERNAME_LEN+1]={0};
  2210. char User_password[MAX_PASSWORD_LEN]={0};
  2211. char Tmp_Password[MAX_PASSWORD_LEN+1]={0};
  2212. memset(Tmp_UserName,0,sizeof(Tmp_UserName));
  2213. memset(Tmp_Password,0,sizeof(Tmp_Password));
  2214. if (snmpcfg->UserID == 0)
  2215. {
  2216. pAMISetSNMPConfRes->CompletionCode = CC_INV_DATA_FIELD ;
  2217. return sizeof (*pRes);
  2218. }
  2219. pUserInfo = getUserIdInfo(snmpcfg->UserID, BMCInst);
  2220. if(pUserInfo == NULL)
  2221. {
  2222. pAMISetSNMPConfRes->CompletionCode = CC_INV_DATA_FIELD ;
  2223. return sizeof (*pRes);
  2224. }
  2225. if(snmpcfg->UserID != pUserInfo->UserId)
  2226. {
  2227. pAMISetSNMPConfRes->CompletionCode = CC_INV_DATA_FIELD ;
  2228. return sizeof (*pRes);
  2229. }
  2230. memcpy(Tmp_UserName,pUserInfo->UserName,MAX_USERNAME_LEN);
  2231. Tmp_UserName[strlen(Tmp_UserName)] = '\0';
  2232. if(*Tmp_UserName == '\0')
  2233. {
  2234. pAMISetSNMPConfRes->CompletionCode = CC_NULL_USERID_NOT_SUPPORTED ;
  2235. return sizeof (*pRes);
  2236. }
  2237. if (g_corefeatures.userpswd_encryption == ENABLED)
  2238. {
  2239. /* Get Encryption Key from the MBMCInfo_t structure */
  2240. LOCK_BMC_SHARED_MEM(BMCInst);
  2241. memcpy(PwdEncKey, &(g_MBMCInfo.PwdEncKey), MAX_SIZE_KEY);
  2242. UNLOCK_BMC_SHARED_MEM(BMCInst);
  2243. if(DecryptPassword((INT8S *)(pBMCInfo->EncryptedUserInfo[snmpcfg->UserID - 1].EncryptedPswd), MAX_PASSWORD_LEN, User_password, MAX_PASSWORD_LEN, PwdEncKey))
  2244. {
  2245. *pRes = CC_UNSPECIFIED_ERR;
  2246. return sizeof(*pRes);
  2247. }
  2248. memcpy(Tmp_Password,User_password,MAX_PASSWORD_LEN);
  2249. Tmp_Password[strlen(Tmp_Password)] = '\0';
  2250. }
  2251. else
  2252. {
  2253. memcpy(Tmp_Password,pUserInfo->UserPassword,MAX_PASSWORD_LEN);
  2254. Tmp_Password[strlen(Tmp_Password)] = '\0';
  2255. }
  2256. if(g_corefeatures.snmp_support == ENABLED)
  2257. {
  2258. dl_snmphandle = dlopen (SNMP_LIBS,RTLD_NOW);
  2259. if(NULL == dl_snmphandle)
  2260. {
  2261. IPMI_ERROR("Error in loading libsnmpuser.so library %s\n", dlerror() );
  2262. return -1;
  2263. }
  2264. //only add to SNMP Config if snmp is enabled for the user
  2265. if (snmpcfg->snmp_enable == 1){
  2266. dl_snmpadduser = dlsym (dl_snmphandle, "SNMPAddUser");
  2267. if ( NULL == dl_snmpadduser)
  2268. {
  2269. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  2270. dlclose(dl_snmphandle);
  2271. return -1;
  2272. }
  2273. if((dl_snmpadduser)((char *)Tmp_UserName,(char *)Tmp_Password, snmpcfg->snmp_access_type, snmpcfg->snmp_enc_type_1, snmpcfg->snmp_enc_type_2)!=0)
  2274. {
  2275. *pRes = CC_INV_DATA_FIELD;
  2276. return sizeof(*pRes);
  2277. }
  2278. } else if (snmpcfg->snmp_enable == 0){
  2279. dl_snmpdeluser = dlsym (dl_snmphandle, "SNMPDelUser");
  2280. if ( NULL == dl_snmpdeluser)
  2281. {
  2282. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  2283. dlclose(dl_snmphandle);
  2284. return -1;
  2285. }
  2286. (dl_snmpdeluser)((char *)Tmp_UserName);//if the username exists in the snmpcfg, needs to be deleted
  2287. } else {
  2288. *pRes = CC_INV_DATA_FIELD;
  2289. return sizeof(*pRes);
  2290. }
  2291. pAMISetSNMPConfRes->CompletionCode = CC_SUCCESS;
  2292. dlclose(dl_snmphandle);
  2293. return(sizeof(AMISetSNMPConfRes_T));
  2294. }
  2295. else
  2296. {
  2297. *pRes = CC_INV_CMD;
  2298. return sizeof(*pRes);
  2299. }
  2300. }
  2301. int AMIGetSNMPConf( _NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes, int BMCInst)
  2302. {
  2303. _NEAR_ AMIGetSNMPConfRes_T *pAMIGetSNMPConfRes = (_NEAR_ AMIGetSNMPConfRes_T *)pRes;
  2304. _NEAR_ AMIGetSNMPConfReq_T * snmpcfg = (_NEAR_ AMIGetSNMPConfReq_T*)pReq;
  2305. void *dl_snmphandle = NULL;
  2306. int ( *dl_snmpgetuser)(char *,INT8U *,INT8U *,INT8U *,INT8U *)=NULL;
  2307. INT8U snmp_enable,snmp_access_type,snmp_enc_type_1,snmp_enc_type_2;
  2308. _FAR_ UserInfo_T* pUserInfo;
  2309. char Tmp_UserName[MAX_USERNAME_LEN+1]={0};
  2310. memset(Tmp_UserName,0,sizeof(Tmp_UserName));
  2311. if (snmpcfg->UserID == 0)
  2312. {
  2313. pAMIGetSNMPConfRes->CompletionCode = CC_INV_DATA_FIELD ;
  2314. return sizeof (*pRes);
  2315. }
  2316. pUserInfo = getUserIdInfo(snmpcfg->UserID, BMCInst);
  2317. if(pUserInfo == NULL)
  2318. {
  2319. pAMIGetSNMPConfRes->CompletionCode = CC_INV_DATA_FIELD ;
  2320. return sizeof (*pRes);
  2321. }
  2322. if(snmpcfg->UserID != pUserInfo->UserId)
  2323. {
  2324. pAMIGetSNMPConfRes->CompletionCode = CC_INV_DATA_FIELD ;
  2325. return sizeof (*pRes);
  2326. }
  2327. memcpy(Tmp_UserName,pUserInfo->UserName,MAX_USERNAME_LEN);
  2328. Tmp_UserName[strlen(Tmp_UserName)] = '\0';
  2329. if(*Tmp_UserName == '\0')
  2330. {
  2331. pAMIGetSNMPConfRes->CompletionCode = CC_NULL_USERID_NOT_SUPPORTED ;
  2332. return sizeof (*pRes);
  2333. }
  2334. if(g_corefeatures.snmp_support == ENABLED)
  2335. {
  2336. dl_snmphandle = dlopen (SNMP_LIBS,RTLD_NOW);
  2337. if(NULL == dl_snmphandle)
  2338. {
  2339. IPMI_ERROR("Error in loading libsnmpuser.so library %s\n", dlerror() );
  2340. return -1;
  2341. }
  2342. dl_snmpgetuser = dlsym (dl_snmphandle,"SNMPGetUser");
  2343. if ( NULL == dl_snmpgetuser)
  2344. {
  2345. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  2346. dlclose(dl_snmphandle);
  2347. return -1;
  2348. }
  2349. dl_snmpgetuser((char *)Tmp_UserName, &snmp_enable, &snmp_access_type, &snmp_enc_type_1, &snmp_enc_type_2);
  2350. pAMIGetSNMPConfRes->CompletionCode = CC_SUCCESS;
  2351. pAMIGetSNMPConfRes->UserID = snmpcfg->UserID;
  2352. pAMIGetSNMPConfRes->snmp_enable = snmp_enable;
  2353. pAMIGetSNMPConfRes->snmp_access_type = snmp_access_type;
  2354. pAMIGetSNMPConfRes->snmp_enc_type_1 = snmp_enc_type_1;
  2355. pAMIGetSNMPConfRes->snmp_enc_type_2 = snmp_enc_type_2;
  2356. dlclose(dl_snmphandle);
  2357. return(sizeof(AMIGetSNMPConfRes_T));
  2358. }
  2359. else
  2360. {
  2361. *pRes = CC_INV_CMD;
  2362. return sizeof(*pRes);
  2363. }
  2364. }
  2365. /**
  2366. * @fn AMIGetSELPolicy
  2367. * @brief This function returns current SEL policy.
  2368. * @param Request message and BMC instance
  2369. * @return Current SEL policy
  2370. */
  2371. int
  2372. AMIGetSELPolicy (_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes, int BMCInst)
  2373. {
  2374. _NEAR_ AMIGetSELPolicyRes_T* pAMIGetSELPolicyRes = (_NEAR_ AMIGetSELPolicyRes_T*)pRes;
  2375. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  2376. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE);
  2377. pAMIGetSELPolicyRes->CompletionCode = CC_NORMAL;
  2378. pAMIGetSELPolicyRes->SELPolicy = pBMCInfo->AMIConfig.CircularSEL;
  2379. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  2380. return sizeof(AMIGetSELPolicyRes_T);
  2381. }
  2382. /**
  2383. * @fn AMISetSELPolicy
  2384. * @brief This function sets current SEL policy.
  2385. * @param Request message and BMC instance
  2386. * @return Success completion code
  2387. */
  2388. int
  2389. AMISetSELPolicy (_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes, int BMCInst)
  2390. {
  2391. _NEAR_ AMISetSELPolicyRes_T* pAMISetSELPolicyRes = (_NEAR_ AMISetSELPolicyRes_T*)pRes;
  2392. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  2393. if(g_corefeatures.circular_sel == ENABLED)
  2394. {
  2395. _NEAR_ AMISetSELPolicyReq_T* pAMISetSELPolicyReq = (_NEAR_ AMISetSELPolicyReq_T*)pReq;
  2396. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE);
  2397. /* Validate SEL policy */
  2398. if (pAMISetSELPolicyReq->SELPolicy != LINEAR_SEL && pAMISetSELPolicyReq->SELPolicy != CIRCULAR_SEL)
  2399. {
  2400. pAMISetSELPolicyRes->CompletionCode = CC_INV_DATA_FIELD;
  2401. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  2402. return sizeof(*pRes);
  2403. }
  2404. SetSELPolicy(pAMISetSELPolicyReq->SELPolicy, BMCInst);
  2405. pAMISetSELPolicyRes->CompletionCode = CC_NORMAL;
  2406. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  2407. return sizeof(AMISetSELPolicyRes_T);
  2408. }
  2409. else
  2410. {
  2411. /* If Circular SEL feature is disabled in Project Configuration, return Not Support In Current State code. */
  2412. pAMISetSELPolicyRes->CompletionCode = CC_PARAM_NOT_SUP_IN_CUR_STATE;
  2413. return sizeof(*pRes);
  2414. }
  2415. }
  2416. /*
  2417. *@fn AMIGetSELEntires
  2418. *@param This function retrieves the SEL entries
  2419. *@return Returns CC_NORMAL
  2420. */
  2421. int AMIGetSELEntires(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes, int BMCInst)
  2422. {
  2423. AMIGetSELEntriesReq_T *pAMIGetSelEntriesReq = (AMIGetSELEntriesReq_T *)pReq;
  2424. AMIGetSELEntriesRes_T *pAMIGetSelEntiresRes = (AMIGetSELEntriesRes_T *)pRes;
  2425. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  2426. SELRepository_T *m_sel = NULL;
  2427. INT16U NumRecords = 0;
  2428. if(g_corefeatures.del_sel_reclaim_support != ENABLED)
  2429. {
  2430. m_sel = (SELRepository_T*)GetSDRSELNVRAddr((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024), BMCInst);
  2431. NumRecords = m_sel->NumRecords;
  2432. }
  2433. else
  2434. {
  2435. NumRecords = pBMCInfo->SELReclaimRepos.pSELReclaimInfo->NumRecords;
  2436. }
  2437. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE);
  2438. if(((NumRecords - pAMIGetSelEntriesReq->Noofentretrieved) * sizeof(SELRec_T)) < MAX_FULL_SEL_ENTRIES)
  2439. {
  2440. pAMIGetSelEntiresRes->Status = FULL_SEL_ENTRIES;
  2441. pAMIGetSelEntiresRes->Noofentries = NumRecords - pAMIGetSelEntriesReq->Noofentretrieved;
  2442. }
  2443. else if(NumRecords == SEL_EMPTY_REPOSITORY)
  2444. {
  2445. pAMIGetSelEntiresRes->CompletionCode = OEMCC_SEL_EMPTY_REPOSITORY;
  2446. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  2447. return sizeof(*pRes);
  2448. }
  2449. else if (NumRecords < pAMIGetSelEntriesReq->Noofentretrieved)
  2450. {
  2451. pAMIGetSelEntiresRes->CompletionCode = OEMCC_SEL_CLEARED;
  2452. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  2453. return sizeof(*pRes);
  2454. }
  2455. else
  2456. {
  2457. pAMIGetSelEntiresRes->Status = PARTIAL_SEL_ENTRIES;
  2458. pAMIGetSelEntiresRes->Noofentries = ((MAX_FULL_SEL_ENTRIES - sizeof(AMIGetSELEntriesRes_T))/sizeof(SELRec_T));
  2459. }
  2460. if(g_corefeatures.del_sel_reclaim_support != ENABLED)
  2461. {
  2462. memcpy((INT8U*)(pAMIGetSelEntiresRes + 1),(INT8U*)&m_sel->SELRecord[pAMIGetSelEntriesReq->Noofentretrieved],
  2463. sizeof(SELRec_T)*pAMIGetSelEntiresRes->Noofentries);
  2464. }
  2465. else
  2466. {
  2467. CopySELReclaimEntries(&(SEL_RECLAIM_HEAD_NODE(BMCInst)),(INT8U *)(pAMIGetSelEntiresRes+1),
  2468. pAMIGetSelEntriesReq->Noofentretrieved,pAMIGetSelEntiresRes->Noofentries,BMCInst);
  2469. }
  2470. pAMIGetSelEntiresRes->LastRecID = BMC_GET_SHARED_MEM(BMCInst)->m_LastRecID;
  2471. pAMIGetSelEntiresRes->CompletionCode = CC_NORMAL;
  2472. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  2473. return sizeof(AMIGetSELEntriesRes_T) + (sizeof(SELRec_T) * pAMIGetSelEntiresRes->Noofentries);
  2474. }
  2475. /**
  2476. * @fn AMIGetSensorInfo
  2477. * @brief This function Gets all the Sensor Info needed for Web.
  2478. * @param Request message and BMC instance
  2479. * @return Proper completion code
  2480. */
  2481. int AMIGetSenforInfo(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes, int BMCInst)
  2482. {
  2483. AMIGetSensorInfoRes_T *pAMIGetSensorInfoRes = (AMIGetSensorInfoRes_T *)pRes;
  2484. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  2485. INT8U* pValidSensor = NULL;
  2486. INT16U SensorIndex = 0;
  2487. SensorInfo_T pSensor ;
  2488. SenInfo_T SensorInfo;
  2489. BOOL SensorIsSigned = FALSE;
  2490. INT16U SensorReading = 0;
  2491. SensorSharedMem_T* pSMSharedMem;
  2492. _FAR_ SDRRecHdr_T* pSDRRec;
  2493. _FAR_ FullSensorRec_T* FullSDR;
  2494. _FAR_ CompactSensorRec_T* CompSDR;
  2495. int i = 0;
  2496. /* Get the Sensor Shared Memory */
  2497. pSMSharedMem = (_FAR_ SensorSharedMem_T*)&pBMCInfo->SensorSharedMem;
  2498. if(pBMCInfo->SenConfig.ValidSensorCnt == 0)
  2499. {
  2500. pAMIGetSensorInfoRes->CompletionCode = OEMCC_SENSOR_INFO_EMPTY;
  2501. return sizeof(*pRes);
  2502. }
  2503. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->m_hSMSharedMemMutex, SHARED_MEM_TIMEOUT);
  2504. pValidSensor = (INT8U*)(pAMIGetSensorInfoRes+1);
  2505. for(i = 0; i < pBMCInfo->SenConfig.ValidSensorCnt; i++)
  2506. {
  2507. SensorIndex = pBMCInfo->SenConfig.ValidSensorList[i];
  2508. pSensor = pSMSharedMem->SensorInfo[SensorIndex];
  2509. /*Copy the SDR Header*/
  2510. memcpy(&SensorInfo.hdr,pSensor.SDRRec,sizeof(SDRRecHdr_T));
  2511. SensorInfo.SensorNumber = pSensor.SensorNumber;
  2512. SensorInfo.SensorTypeCode = pSensor.SensorTypeCode;
  2513. SensorInfo.EventTypeCode = pSensor.EventTypeCode;
  2514. SensorInfo.Units1 = pSensor.Units1;
  2515. SensorInfo.Units2 = pSensor.Units2;
  2516. SensorInfo.Units3 = pSensor.Units3;
  2517. SensorInfo.M_LSB = pSensor.M_LSB;
  2518. SensorInfo.M_MSB_Tolerance = pSensor.M_MSB_Tolerance;
  2519. SensorInfo.B_LSB = pSensor.B_LSB;
  2520. SensorInfo.B_MSB_Accuracy = pSensor.B_MSB_Accuracy;
  2521. SensorInfo.Accuracy_MSB_Exp = pSensor.Accuracy_MSB_Exp;
  2522. SensorInfo.RExp_BExp = pSensor.RExp_BExp;
  2523. SensorInfo.LowerNonCritical = pSensor.LowerNonCritical;
  2524. SensorInfo.LowerCritical = pSensor.LowerCritical;
  2525. SensorInfo.LowerNonRecoverable = pSensor.LowerNonRecoverable;
  2526. SensorInfo.UpperNonCritical = pSensor.UpperNonCritical;
  2527. SensorInfo.UpperCritical = pSensor.UpperCritical;
  2528. SensorInfo.UpperNonRecoverable= pSensor.UpperNonRecoverable;
  2529. SensorInfo.Settable_Readable_ThreshMask= pSensor.SettableThreshMask;
  2530. SensorInfo.Flags = pSensor.EventFlags & 0xe0;
  2531. if((pSensor.EventFlags & BIT5) != 0)
  2532. {
  2533. SensorInfo.SensorReading = 0;
  2534. }
  2535. SensorReading = pSensor.SensorReading;
  2536. SensorInfo.SensorReading = 0;
  2537. SensorIsSigned = ( 0 != (pSensor.InternalFlags & BIT1));
  2538. if (THRESHOLD_SENSOR_CLASS == pSensor.EventTypeCode)
  2539. {
  2540. SensorInfo.SensorReading = (SensorReading & 0x00FF);
  2541. SensorInfo.ComparisonStatus = 0;
  2542. if((pSensor.DeassertionEventEnablesByte2 & BIT6) == BIT6 )
  2543. {
  2544. if (CompareValues(SensorIsSigned, SensorInfo.SensorReading, pSensor.UpperNonRecoverable) >= 0)
  2545. {
  2546. SensorInfo.ComparisonStatus |= BIT5;
  2547. }
  2548. }
  2549. if((pSensor.DeassertionEventEnablesByte2 & BIT5) == BIT5 )
  2550. {
  2551. if (CompareValues(SensorIsSigned, SensorInfo.SensorReading, pSensor.UpperCritical) >= 0)
  2552. {
  2553. SensorInfo.ComparisonStatus |= BIT4;
  2554. }
  2555. }
  2556. if((pSensor.DeassertionEventEnablesByte2 & BIT4) == BIT4 )
  2557. {
  2558. if (CompareValues(SensorIsSigned, SensorInfo.SensorReading, pSensor.UpperNonCritical) >= 0)
  2559. {
  2560. SensorInfo.ComparisonStatus |= BIT3;
  2561. }
  2562. }
  2563. if((pSensor.AssertionEventEnablesByte2 & BIT6) == BIT6 )
  2564. {
  2565. if (CompareValues(SensorIsSigned, SensorInfo.SensorReading, pSensor.LowerNonRecoverable) <= 0)
  2566. {
  2567. SensorInfo.ComparisonStatus |= BIT2;
  2568. }
  2569. }
  2570. if((pSensor.AssertionEventEnablesByte2 & BIT5) == BIT5 )
  2571. {
  2572. if (CompareValues(SensorIsSigned, SensorInfo.SensorReading, pSensor.LowerCritical) <= 0)
  2573. {
  2574. SensorInfo.ComparisonStatus |= BIT1;
  2575. }
  2576. }
  2577. if((pSensor.AssertionEventEnablesByte2 & BIT4) == BIT4 )
  2578. {
  2579. if (CompareValues(SensorIsSigned, SensorInfo.SensorReading, pSensor.LowerNonCritical) <= 0)
  2580. {
  2581. SensorInfo.ComparisonStatus |= BIT0;
  2582. }
  2583. }
  2584. SensorInfo.ComparisonStatus &= ((pSensor.SettableThreshMask >> 8) & 0xFF);
  2585. SensorInfo.OptionalStatus = 0;
  2586. // For Threshold sensor, [7:6] - reserved. Returned as 1b. Ignore on read.
  2587. SensorInfo.ComparisonStatus |= THRESHOLD_RESERVED_BIT;
  2588. }
  2589. else
  2590. {
  2591. SensorInfo.ComparisonStatus = (((INT8U) (SensorReading & 0x00FF)) & ((INT8U) (pSensor.SettableThreshMask & 0x00FF)) );
  2592. SensorInfo.OptionalStatus = (((INT8U) (SensorReading >> 8)) & ((INT8U) (pSensor.SettableThreshMask >> 8)) );
  2593. // For Discrete sensor, [7] - reserved. Returned as 1b. Ignore on read.
  2594. SensorInfo.OptionalStatus |= DISCRETE_RESERVED_BIT;
  2595. }
  2596. if((pSensor.EventFlags & BIT7) == 0)
  2597. {
  2598. SensorInfo.AssertionEventByte1 = 0;
  2599. SensorInfo.AssertionEventByte2 = 0;
  2600. SensorInfo.DeassertionEventByte1 = 0;
  2601. SensorInfo.DeassertionEventByte2 = 0;
  2602. }
  2603. if((pSensor.SensorCaps & BIT6) == 0)
  2604. {
  2605. SensorInfo.AssertionEventByte1 = (pSensor.AssertionHistoryByte1 & pSensor.AssertionEventEnablesByte1);
  2606. SensorInfo.AssertionEventByte2 = (pSensor.AssertionHistoryByte2 & pSensor.AssertionEventEnablesByte2);
  2607. SensorInfo.DeassertionEventByte1 = (pSensor.DeassertionHistoryByte1 & pSensor.DeassertionEventEnablesByte1);
  2608. SensorInfo.DeassertionEventByte2 = (pSensor.DeassertionHistoryByte2 & pSensor.DeassertionEventEnablesByte2);
  2609. }
  2610. else
  2611. {
  2612. SensorInfo.AssertionEventByte1 = (pSensor.AssertionEventOccuredByte1 & pSensor.AssertionEventEnablesByte1);
  2613. SensorInfo.AssertionEventByte2 = (pSensor.AssertionEventOccuredByte2 & pSensor.AssertionEventEnablesByte2);
  2614. SensorInfo.DeassertionEventByte1 = (pSensor.DeassertionEventOccuredByte1 & pSensor.DeassertionEventEnablesByte1);
  2615. SensorInfo.DeassertionEventByte2 = (pSensor.DeassertionEventOccuredByte2 & pSensor.DeassertionEventEnablesByte2);
  2616. }
  2617. pSDRRec = GetSDRRec(pSensor.SDRRec->ID,BMCInst);
  2618. if(pSensor.SDRRec->Type == FULL_SDR_REC) /*Full SDR*/
  2619. {
  2620. FullSDR = (_FAR_ FullSensorRec_T *)pSDRRec;
  2621. SensorInfo.OwnerID = FullSDR->OwnerID;
  2622. SensorInfo.OwnerLUN= FullSDR->OwnerLUN;
  2623. SensorInfo.MaxReading = FullSDR->MaxReading;
  2624. SensorInfo.MinReading = FullSDR->MinReading;
  2625. SensorInfo.Linearization = FullSDR->Linearization;
  2626. memset(SensorInfo.SensorName,0,MAX_ID_STR_LEN);
  2627. strncpy(SensorInfo.SensorName,FullSDR->IDStr, MAX_ID_STR_LEN - (sizeof(FullSensorRec_T) - sizeof(SDRRecHdr_T) - FullSDR->hdr.Len));
  2628. }
  2629. else if(pSensor.SDRRec->Type == COMPACT_SDR_REC) /*Compact SDR*/
  2630. {
  2631. CompSDR = (_FAR_ CompactSensorRec_T *)pSDRRec;
  2632. SensorInfo.OwnerID = CompSDR->OwnerID;
  2633. SensorInfo.OwnerLUN= CompSDR->OwnerLUN;
  2634. SensorInfo.MaxReading = 0;
  2635. SensorInfo.MinReading = 0;
  2636. SensorInfo.Linearization = 0;
  2637. memset(SensorInfo.SensorName,0,MAX_ID_STR_LEN);
  2638. strncpy(SensorInfo.SensorName,CompSDR->IDStr, MAX_ID_STR_LEN - (sizeof(CompactSensorRec_T) - sizeof(SDRRecHdr_T) - CompSDR->hdr.Len));
  2639. }
  2640. memcpy(pValidSensor,(INT8U *)&SensorInfo,sizeof(SenInfo_T));
  2641. pValidSensor = pValidSensor + sizeof(SenInfo_T);
  2642. }
  2643. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->m_hSMSharedMemMutex);
  2644. pAMIGetSensorInfoRes->CompletionCode = CC_NORMAL;
  2645. pAMIGetSensorInfoRes->Noofentries = pBMCInfo->SenConfig.ValidSensorCnt;
  2646. return sizeof(AMIGetSensorInfoRes_T) + (sizeof(SenInfo_T) * pBMCInfo->SenConfig.ValidSensorCnt);
  2647. }
  2648. /**
  2649. * @fn AMIGetIPMISessionTimeOut
  2650. * @brief This function Gets IPMI session timeout.
  2651. * @param Request message and BMC instance
  2652. * @return Proper completion code
  2653. */
  2654. int AMIGetIPMISessionTimeOut(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes, int BMCInst)
  2655. {
  2656. AMIGetIPMISessionTimeOutRes_T * pAMIGetIPMISessionTimeOutRes = (AMIGetIPMISessionTimeOutRes_T *)pRes;
  2657. /* Chk request Length */
  2658. if( ReqLen != 0 )
  2659. {
  2660. *pRes = CC_REQ_INV_LEN;
  2661. return sizeof (INT8U);
  2662. }
  2663. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  2664. pAMIGetIPMISessionTimeOutRes->IPMISessionTimeOut = pBMCInfo->IpmiConfig.SessionTimeOut;
  2665. pAMIGetIPMISessionTimeOutRes->CompletionCode = CC_NORMAL;
  2666. return sizeof( AMIGetIPMISessionTimeOutRes_T );
  2667. }
  2668. /**
  2669. * @fn AMIGetUDSInfo
  2670. * @brief This function Gets UDS Info for Requesting IP's.
  2671. * @param IPV4/IPV6 Address and BMC instance
  2672. * @return Channel Number,BMC Instance and Completion Code
  2673. */
  2674. int AMIGetUDSInfo(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes, int BMCInst)
  2675. {
  2676. AMIGetUDSInfoReq_T *pAMIGetUDSInfoReq = (AMIGetUDSInfoReq_T *)pReq;
  2677. AMIGetUDSInfoRes_T *pAMIGetUDSInfoRes = (AMIGetUDSInfoRes_T *)pRes;
  2678. int ChannelNum = -1;
  2679. INT8U NoofBMC = 1;
  2680. _FAR_ ChannelInfo_T* pChannelInfo;
  2681. for(NoofBMC = 1;NoofBMC <= MAX_NUM_BMC; NoofBMC++)
  2682. {
  2683. ChannelNum = GetChannelByAddr((char *)&pAMIGetUDSInfoReq->SessionIPAddr[0],NoofBMC);
  2684. if(ChannelNum == -1)
  2685. {
  2686. if(g_corefeatures.global_ipv6 == ENABLED)
  2687. {
  2688. ChannelNum = GetChannelByIPv6Addr((char *)&pAMIGetUDSInfoReq->SessionIPAddr[0], NoofBMC);
  2689. if(ChannelNum != -1)
  2690. {
  2691. TDBG("IPV6 Address Found and Channel Number is %x\n",ChannelNum);
  2692. break;
  2693. }
  2694. }
  2695. }
  2696. else
  2697. {
  2698. TDBG("IPV4 Address Found and Channel Number is %d\n",ChannelNum);
  2699. break;
  2700. }
  2701. }
  2702. if(ChannelNum != -1)
  2703. {
  2704. pChannelInfo = getChannelInfo(ChannelNum,NoofBMC);
  2705. if(NULL == pChannelInfo)
  2706. {
  2707. *pRes = CC_INV_DATA_FIELD;
  2708. return sizeof (*pRes);
  2709. }
  2710. pAMIGetUDSInfoRes->CompletionCode = CC_NORMAL;
  2711. pAMIGetUDSInfoRes->ChannelNum = ChannelNum;
  2712. pAMIGetUDSInfoRes->ChannelType = pChannelInfo->ChannelType;
  2713. pAMIGetUDSInfoRes->BMCInstance = NoofBMC;
  2714. }
  2715. else
  2716. {
  2717. pAMIGetUDSInfoRes->CompletionCode = CC_INV_DATA_FIELD;
  2718. return sizeof(INT8U);
  2719. }
  2720. return sizeof(AMIGetUDSInfoRes_T);
  2721. }
  2722. /**
  2723. * @fn AMIGetUDSSessionInfo
  2724. * @brief This function Gets UDS Session Info for Requesting Session Handle
  2725. * /Session Index/Session ID.
  2726. * @param Parameter Selector and BMC instance
  2727. * @return UDS Session Information and Completion Code
  2728. */
  2729. int AMIGetUDSSessionInfo(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes, int BMCInst)
  2730. {
  2731. AMIGetUDSSessionInfoReq_T *pAMIGetUDSSessionInfoReq = (AMIGetUDSSessionInfoReq_T *)pReq;
  2732. AMIGetUDSSessionInfoRes_T *pAMIGetUDSSessionInfoRes = ( AMIGetUDSSessionInfoRes_T *)pRes;
  2733. UDSSessionTbl_T *pUDSSessionTblInfo = NULL;
  2734. INT8U ArgType =0xFF;
  2735. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  2736. INT8U Index,ResLen;
  2737. if( ReqLen != UDSSessionInfoParamLength[pAMIGetUDSSessionInfoReq->UDSSessionParam])
  2738. {
  2739. *pRes = CC_REQ_INV_LEN;
  2740. return sizeof(*pRes);
  2741. }
  2742. pAMIGetUDSSessionInfoRes->CompletionCode = CC_NORMAL;
  2743. switch(pAMIGetUDSSessionInfoReq->UDSSessionParam)
  2744. {
  2745. case UDS_SESSION_COUNT_INFO:
  2746. pAMIGetUDSSessionInfoRes->UDSLoggedInInfo.UDSSessionCountInfo.MaxAllowedSession = pBMCInfo->IpmiConfig.MaxSession;
  2747. pAMIGetUDSSessionInfoRes->UDSLoggedInInfo.UDSSessionCountInfo.ActiveSessionCount = pBMCInfo->UDSSessionTblInfo.SessionCount;
  2748. return sizeof(INT8U )+sizeof(UDSSessionCount_T);
  2749. case UDS_SESSION_ID_INFO:
  2750. ArgType = UDS_SESSION_ID_INFO;
  2751. break;
  2752. case UDS_SESSION_HANDLE_INFO:
  2753. ArgType = UDS_SESSION_HANDLE_INFO;
  2754. break;
  2755. case UDS_SESSION_INDEX_INFO:
  2756. ArgType = UDS_SESSION_INDEX_INFO;
  2757. break;
  2758. case UDS_SOCKET_ID_INFO:
  2759. ArgType = UDS_SOCKET_ID_INFO;
  2760. break;
  2761. case UDS_SESSION_PID_INFO:
  2762. ArgType = UDS_SESSION_INDEX_INFO;
  2763. pUDSSessionTblInfo = GetUDSSessionInfo(ArgType,(void *)&pAMIGetUDSSessionInfoReq->UDSSessionHandleOrIDOrIndex[0],BMCInst);
  2764. if(NULL == pUDSSessionTblInfo)
  2765. {
  2766. *pRes =CC_INV_DATA_FIELD;
  2767. return sizeof(*pRes);
  2768. }
  2769. pAMIGetUDSSessionInfoRes->UDSLoggedInInfo.UDSSessionPIDInfo.ProcessID = ipmitoh_u32(pUDSSessionTblInfo->ProcessID);
  2770. pAMIGetUDSSessionInfoRes->UDSLoggedInInfo.UDSSessionPIDInfo.ThreadID = ipmitoh_u32(pUDSSessionTblInfo->ThreadID);
  2771. return sizeof(INT8U )+sizeof(UDSSessionPIDInfo_T);
  2772. break;
  2773. case UDS_ACTIVE_SESSION_INDEX_LIST:
  2774. pRes[0] = CC_NORMAL;
  2775. for(Index = 0, ResLen = 1; Index < pBMCInfo->IpmiConfig.MaxSession; Index++)
  2776. {
  2777. if(FALSE == pBMCInfo->UDSSessionTblInfo.UDSSessionTbl[Index].Activated)
  2778. {
  2779. continue;
  2780. }
  2781. pRes[ResLen] = Index;
  2782. ResLen++;
  2783. }
  2784. return ResLen;
  2785. break;
  2786. default:
  2787. *pRes=CC_INV_DATA_FIELD;
  2788. return sizeof (*pRes);
  2789. }
  2790. pUDSSessionTblInfo = GetUDSSessionInfo(ArgType,(void *)&pAMIGetUDSSessionInfoReq->UDSSessionHandleOrIDOrIndex[0],BMCInst);
  2791. if(NULL == pUDSSessionTblInfo)
  2792. {
  2793. *pRes =CC_INV_DATA_FIELD;
  2794. return sizeof(*pRes);
  2795. }
  2796. /* Filling up the required Session Related Response for the requested Session ID/Session Handle/Session Index */
  2797. pAMIGetUDSSessionInfoRes->UDSLoggedInInfo.UDSLoggedInSessionInfo.LoggedInSessionID = pUDSSessionTblInfo->SessionID;
  2798. pAMIGetUDSSessionInfoRes->UDSLoggedInInfo.UDSLoggedInSessionInfo.LoggedInSessionHandle = pUDSSessionTblInfo->LoggedInSessionHandle;
  2799. pAMIGetUDSSessionInfoRes->UDSLoggedInInfo.UDSLoggedInSessionInfo.LoggedInTime = pUDSSessionTblInfo->LoggedInTime;
  2800. pAMIGetUDSSessionInfoRes->UDSLoggedInInfo.UDSLoggedInSessionInfo.LoggedInUserID = pUDSSessionTblInfo->LoggedInUserID;
  2801. pAMIGetUDSSessionInfoRes->UDSLoggedInInfo.UDSLoggedInSessionInfo.LoggedInPrivilege = pUDSSessionTblInfo->LoggedInPrivilege;
  2802. pAMIGetUDSSessionInfoRes->UDSLoggedInInfo.UDSLoggedInSessionInfo.AuthenticationMechanism = pUDSSessionTblInfo->AuthenticationMechanism;
  2803. pAMIGetUDSSessionInfoRes->UDSLoggedInInfo.UDSLoggedInSessionInfo.UDSChannelNum = pUDSSessionTblInfo->UDSChannelNum;
  2804. pAMIGetUDSSessionInfoRes->UDSLoggedInInfo.UDSLoggedInSessionInfo.ChannelNum = pUDSSessionTblInfo->LoggedInChannel;
  2805. pAMIGetUDSSessionInfoRes->UDSLoggedInInfo.UDSLoggedInSessionInfo.SessionTimeoutValue = pUDSSessionTblInfo->SessionTimeoutValue;
  2806. return sizeof(INT8U)+sizeof(UDSLoggedInSessionInfo_T);
  2807. }
  2808. /**
  2809. * @fn RISServiceStatus
  2810. * @brief This function Gets Remote Image service feature supported and enable informations
  2811. */
  2812. int
  2813. RISServiceStatus()
  2814. {
  2815. VMediaCfg_T media_cfg;
  2816. int ServiceErr = 0;
  2817. /*Check for Feature is supported*/
  2818. if(ENABLED != g_corefeatures.rmedia_support )
  2819. {
  2820. TCRIT("Remote Images Service is Not Supported\n");
  2821. return CC_INV_CMD;
  2822. }
  2823. memset(&media_cfg, 0, sizeof(VMediaCfg_T));
  2824. ServiceErr = GetVMediaCfg(&media_cfg,g_corefeatures.lmedia_support,g_corefeatures.rmedia_support);
  2825. if(ServiceErr < 0)
  2826. {
  2827. TCRIT("Error in Getting Vmedia Configuration\n");
  2828. return CC_UNSPECIFIED_ERR;
  2829. }
  2830. /*Check for RIS Sevice is Enabled*/
  2831. if(ENABLED != media_cfg.rmedia_enable )
  2832. {
  2833. TCRIT("Remote Images Service is Not Enabled\n");
  2834. return CC_SERVICE_NOT_ENABLED;
  2835. }
  2836. return CC_SUCCESS;
  2837. }
  2838. /**
  2839. * @fn RISSetServiceStatus
  2840. * @brief This function Sets Remote Image service feature supported and enable informations
  2841. */
  2842. int
  2843. RISSetServiceStatus(INT8U Status)
  2844. {
  2845. VMediaCfg_T media_cfg;
  2846. int ServiceErr = 0;
  2847. /*Check for Feature is supported*/
  2848. if(ENABLED != g_corefeatures.rmedia_support )
  2849. {
  2850. TCRIT("Remote Images Service is Not Supported\n");
  2851. return CC_INV_CMD;
  2852. }
  2853. memset(&media_cfg, 0, sizeof(VMediaCfg_T));
  2854. ServiceErr = GetVMediaCfg(&media_cfg,g_corefeatures.lmedia_support,g_corefeatures.rmedia_support);
  2855. if(ServiceErr < 0)
  2856. {
  2857. TCRIT("Error in Getting Vmedia Configuration\n");
  2858. return CC_UNSPECIFIED_ERR;
  2859. }
  2860. /*Check for RIS Sevice Status*/
  2861. if(Status != media_cfg.rmedia_enable )
  2862. {
  2863. media_cfg.rmedia_enable = Status;
  2864. ServiceErr = SetVMediaCfg(&media_cfg,g_corefeatures.lmedia_support,g_corefeatures.rmedia_support);
  2865. if(ServiceErr < 0)
  2866. {
  2867. TCRIT("Error in Getting Vmedia Configuration\n");
  2868. return CC_UNSPECIFIED_ERR;
  2869. }
  2870. }
  2871. return CC_SUCCESS;
  2872. }
  2873. /**
  2874. * @fn AMIGetRISConf
  2875. * @brief This function Gets Remote Image service configuration Info for Requesting Session Handle
  2876. * /Session Index/Session ID.
  2877. * @param Parameter Selector
  2878. * @return Remote Image service configuration Information and Completion Code
  2879. */
  2880. int
  2881. AMIGetRISConf( _NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
  2882. {
  2883. _NEAR_ AMIGetRISConfReq_T* pAMIGetRISConfReq = (_NEAR_ AMIGetRISConfReq_T*) pReq;
  2884. _NEAR_ AMIGetRISConfRes_T* pAMIGetRISConfRes = (_NEAR_ AMIGetRISConfRes_T*) pRes;
  2885. MediaCfg_T conf;
  2886. INT32U Value = 0;
  2887. INT8U MediaTypeBit = 0;
  2888. int ServiceErr = 0;
  2889. /* Match the service_id byte with ServiceName */
  2890. Value = (pAMIGetRISConfReq->MediaType);
  2891. ServiceErr = GetINT32UBitsNum (Value, &MediaTypeBit);
  2892. if(ServiceErr < 0)
  2893. {
  2894. TCRIT("Error in getting bit number from service_id\n");
  2895. *pRes = CC_UNSPECIFIED_ERR;
  2896. return sizeof (INT8U);
  2897. }
  2898. if(ServiceList[MediaTypeBit] == NULL)
  2899. {
  2900. TCRIT("MediaName is not found in ServiceList\n");
  2901. *pRes = CC_INVALID_MEDIA_TYPE;
  2902. return sizeof (INT8U);
  2903. }
  2904. /*Check for Feature is supported*/
  2905. if(ENABLED != g_corefeatures.rmedia_support )
  2906. {
  2907. TCRIT("Remote Images Service is Not Supported\n");
  2908. *pRes = CC_INV_CMD;
  2909. return sizeof (INT8U);
  2910. }
  2911. ServiceErr = GetMediaCfg(&conf,ServiceList[MediaTypeBit]);
  2912. if(ServiceErr < 0)
  2913. {
  2914. *pRes = CC_UNSPECIFIED_ERR;
  2915. return sizeof (INT8U);
  2916. }
  2917. memset(pAMIGetRISConfRes, 0, sizeof(AMIGetRISConfRes_T));
  2918. pAMIGetRISConfRes->MediaType= pAMIGetRISConfReq->MediaType;
  2919. pAMIGetRISConfRes->ParameterSelect= pAMIGetRISConfReq->ParameterSelect;
  2920. pAMIGetRISConfRes->CompletionCode = CC_SUCCESS;
  2921. switch(pAMIGetRISConfReq->ParameterSelect)
  2922. {
  2923. case RIS_IMAGE_NAME:
  2924. _fmemcpy(pAMIGetRISConfRes->Config.ImageName, conf.Image_Name,MAX_IMAGE_NAME_LEN);
  2925. return (sizeof(AMIGetRISConfRes_T) - sizeof(RISConfig_T) + MAX_IMAGE_NAME_LEN);
  2926. case RIS_REMOTE_PATH:
  2927. _fmemcpy(pAMIGetRISConfRes->Config.MountPath, conf.Image_Path,MAX_IMAGE_PATH_SIZE);
  2928. return (sizeof(AMIGetRISConfRes_T) - sizeof(RISConfig_T) + MAX_IMAGE_PATH_SIZE);
  2929. case RIS_IP_ADDR:
  2930. _fmemcpy(pAMIGetRISConfRes->Config.RemoteIP, conf.Ip_Addr,MAX_IP_ADDR_LEN);
  2931. return (sizeof(AMIGetRISConfRes_T) - sizeof(RISConfig_T) + MAX_IP_ADDR_LEN);
  2932. case RIS_USER_NAME:
  2933. _fmemcpy(pAMIGetRISConfRes->Config.UserName, conf.Username,MAX_RMS_USERNAME_LEN);
  2934. return (sizeof(AMIGetRISConfRes_T) - sizeof(RISConfig_T) + MAX_RMS_USERNAME_LEN);
  2935. case RIS_PASSWORD:
  2936. // Should not expose password don't enable below line
  2937. //_fmemcpy(pAMIGetRISConfRes->Config.Password, conf.Password,MAX_RMS_PASSWORD_LEN);
  2938. return (sizeof(AMIGetRISConfRes_T) - sizeof(RISConfig_T) + MAX_RMS_PASSWORD_LEN);
  2939. case RIS_SHARE_TYPE:
  2940. _fmemcpy(pAMIGetRISConfRes->Config.ShareType, conf.Share_Type,MAX_SHARE_TYPE_LEN);
  2941. return (sizeof(AMIGetRISConfRes_T) - sizeof(RISConfig_T) + MAX_SHARE_TYPE_LEN);
  2942. case RIS_DOMAIN:
  2943. _fmemcpy(pAMIGetRISConfRes->Config.Domain, conf.Domain,MAX_DOMAIN_LEN);
  2944. return(MAX_DOMAIN_LEN+3);
  2945. default:
  2946. pAMIGetRISConfRes->CompletionCode = CC_PARAM_NOT_SUPPORTED;
  2947. return sizeof(INT8U);
  2948. }
  2949. }
  2950. /**
  2951. * @fn VerifyData
  2952. * @brief This function checks for presence of multiple string in the given array
  2953. * @param Data
  2954. * @return 0 on success and -1 on failure
  2955. */
  2956. int VerifyData(INT8S *Data)
  2957. {
  2958. int trace;
  2959. for( trace=MAX_DOMAIN_BLOCK_SIZE*MAX_BLOCK;trace>=0;trace--) /*Finds last Non-NULL Char from last*/
  2960. {
  2961. if(Data[trace]!='\0')
  2962. break;
  2963. }
  2964. if(trace==-1)
  2965. {
  2966. TDBG("String does't have any NULL termination\n");
  2967. return trace;
  2968. }
  2969. if(trace+1==strlen(Data))
  2970. {
  2971. return 0;
  2972. }
  2973. else
  2974. {
  2975. TDBG("First NULL at =%d, Last NULL at =%d,String =%s\n",strlen(Data),trace+1,Data);
  2976. return -1;
  2977. }
  2978. }
  2979. /**
  2980. * @fn SetBlockData
  2981. * @brief This function sets Block of data nad progress bit
  2982. * @param Request message BMCShared memory parameter bit , data , BMC instance ,errcode, Datalen
  2983. * @outparam ValidData
  2984. * @return success completion code
  2985. */
  2986. int
  2987. SetBlockData(AMISetRISConfReq_T* Req,INT8U *SharedBit,INT8U *SharedData,int BMCInst,INT8U ErrCode,INT8S *ValidData, int Datalen)
  2988. {
  2989. struct addrinfo *pResult;
  2990. INT8U RetVal = CC_SUCCESS;
  2991. /* Progress Bit From Shared Memory*/
  2992. INT8U ProgressBit = *SharedBit ;
  2993. /*If Blockselector is zero .its for setting ProgressBit*/
  2994. if( 0x0 == Req->Blockselector )
  2995. {
  2996. /*Validate ProgressBit*/
  2997. if( ( SET_COMPLETE != Req->config.ProgressBit) && ( SET_IN_PROGRESS != Req->config.ProgressBit) )
  2998. {
  2999. RetVal = CC_INV_PROGRESS_BIT;
  3000. }
  3001. /* Valid Progress BIt .Process the request*/
  3002. else
  3003. {
  3004. /* ProgressBit and request progressBit are equal*/
  3005. if(Req->config.ProgressBit == ProgressBit)
  3006. {
  3007. /* ProgressBit is Already set as SET_IN_PROGRESS Dont allow to set data*/
  3008. if(( SET_IN_PROGRESS == ProgressBit ) &&
  3009. ( SET_IN_PROGRESS == Req->config.ProgressBit ))
  3010. {
  3011. RetVal = CC_SET_IN_PROGRESS;
  3012. }
  3013. /* IF SET_COMPLETE Bit is set already send success code as response*/
  3014. else if(( SET_COMPLETE == ProgressBit ) &&
  3015. ( SET_COMPLETE == Req->config.ProgressBit ))
  3016. {
  3017. memset(SharedData,0,MAX_DOMAIN_BLOCK_SIZE*MAX_BLOCK);
  3018. RetVal = CC_SUCCESS;
  3019. }
  3020. }
  3021. /* Allow ProgressBit to set if both are not equal*/
  3022. else
  3023. {
  3024. /* Update the progress bit*/
  3025. LOCK_BMC_SHARED_MEM(BMCInst);
  3026. *SharedBit = Req->config.ProgressBit;
  3027. UNLOCK_BMC_SHARED_MEM(BMCInst);
  3028. /* IF SET_COMPLETE Bit is set write data from shared memory to file*/
  3029. if(SET_COMPLETE == Req->config.ProgressBit )
  3030. {
  3031. _fmemcpy(ValidData,SharedData,(MAX_DOMAIN_BLOCK_SIZE*MAX_BLOCK)+1);
  3032. memset(SharedData,0,MAX_DOMAIN_BLOCK_SIZE*MAX_BLOCK);
  3033. if(0 != strlen(ValidData))
  3034. {
  3035. /*Validation Completed Write data to file*/
  3036. RetVal = WRITE_TO_FILE;
  3037. if(Req->ParameterSelect == RIS_DOMAIN)
  3038. {
  3039. if (0 != getaddrinfo((char *)ValidData, NULL, NULL, &pResult))
  3040. {
  3041. RetVal = CC_INVALID_DOMAIN;
  3042. }
  3043. }
  3044. }
  3045. else
  3046. {
  3047. RetVal = ErrCode ;
  3048. }
  3049. }
  3050. /* IF SET_IN_PROGRESS Bit is send success code as response*/
  3051. else
  3052. {
  3053. RetVal = CC_SUCCESS;
  3054. }
  3055. }
  3056. }
  3057. }
  3058. /*If Blockselector is 1 to 4 .its for setting data*/
  3059. else if(( Req->Blockselector > 0x0) && ( Req->Blockselector <= MAX_BLOCK) )
  3060. {
  3061. /* SET_IN_PROGRESS BIT is not set.Dont allow to set data*/
  3062. if(SET_IN_PROGRESS != ProgressBit)
  3063. {
  3064. RetVal = CC_PROGRESS_BIT_NOT_SET;
  3065. }
  3066. /* SET_IN_PROGRESS BIT is set. Update data inShared memory*/
  3067. else
  3068. {
  3069. LOCK_BMC_SHARED_MEM(BMCInst);
  3070. memset(SharedData+(MAX_DOMAIN_BLOCK_SIZE * (Req->Blockselector - 1)), 0,MAX_DOMAIN_BLOCK_SIZE);
  3071. switch(Req->ParameterSelect)
  3072. {
  3073. case RIS_IMAGE_NAME:
  3074. _fmemcpy( SharedData+(MAX_DOMAIN_BLOCK_SIZE * (Req->Blockselector - 1)),Req->config.ImageName,Datalen);
  3075. break;
  3076. case RIS_REMOTE_PATH:
  3077. _fmemcpy( SharedData+(MAX_DOMAIN_BLOCK_SIZE * (Req->Blockselector - 1)),Req->config.MountPath,Datalen);
  3078. break;
  3079. case RIS_USER_NAME:
  3080. _fmemcpy( SharedData+(MAX_DOMAIN_BLOCK_SIZE * (Req->Blockselector - 1)),Req->config.UserName,Datalen);
  3081. break;
  3082. case RIS_DOMAIN:
  3083. _fmemcpy( SharedData+(MAX_DOMAIN_BLOCK_SIZE * (Req->Blockselector - 1)),Req->config.Domain,Datalen);
  3084. break;
  3085. default:
  3086. break;
  3087. }
  3088. UNLOCK_BMC_SHARED_MEM(BMCInst);
  3089. }
  3090. }
  3091. else
  3092. {
  3093. RetVal = CC_INVALID_BLOCK_SELECTOR;
  3094. }
  3095. return RetVal;
  3096. }
  3097. /**
  3098. * @fn AMISetRISConf
  3099. * @brief This function sets the RIS configurations
  3100. * @param Parameter selector and Request message and BMC instance
  3101. * @return success completion code
  3102. */
  3103. int
  3104. AMISetRISConf( _NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
  3105. {
  3106. _NEAR_ AMISetRISConfReq_T* pAMISetRISConfReq = (_NEAR_ AMISetRISConfReq_T*) pReq;
  3107. _NEAR_ AMISetRISConfRes_T* pAMISetRISConfRes = (_NEAR_ AMISetRISConfRes_T*) pRes;
  3108. MediaCfg_T conf;
  3109. INT32U Value = 0;
  3110. INT8U ServiceTypeBit = 0;
  3111. int ServiceErr = 0;
  3112. int DataLen = 0;
  3113. INT8U MediaType = 0;
  3114. INT8U done = 0;
  3115. INT8S IPV4[sizeof(struct in_addr)];
  3116. INT8 IPV6[sizeof(struct in6_addr)];
  3117. INT8S IPAddr[MAX_IP_ADDR_LEN];
  3118. INT8U ValidIP = 0;
  3119. INT8S *EndsWith = NULL;
  3120. INT8U EndsWithLen = 0;
  3121. INT8U ValidImage = 0;
  3122. INT8S ValidData[MAX_DOMAIN_BLOCK_SIZE*MAX_BLOCK+1];
  3123. /* Match the service_id byte with ServiceName */
  3124. Value = (pAMISetRISConfReq->MediaType);
  3125. ServiceErr = GetINT32UBitsNum (Value, &ServiceTypeBit);
  3126. if(ServiceErr < 0)
  3127. {
  3128. TCRIT("Error in Getting Bit Number from Service ID\n");
  3129. if (ReqLen <=0)
  3130. *pRes = CC_REQ_INV_LEN;
  3131. else
  3132. *pRes = CC_UNSPECIFIED_ERR;
  3133. return sizeof (INT8U);
  3134. }
  3135. else
  3136. {
  3137. if ( ReqLen >= ServiceLen[ServiceTypeBit])
  3138. {
  3139. DataLen = ReqLen - ServiceLen[ServiceTypeBit];
  3140. }
  3141. else
  3142. {
  3143. *pRes = CC_REQ_INV_LEN;
  3144. return sizeof (INT8U);
  3145. }
  3146. }
  3147. if(ServiceList[ServiceTypeBit] == NULL)
  3148. {
  3149. TCRIT("Service Name Not Available for the Requested Service ID\n");
  3150. *pRes = CC_INVALID_MEDIA_TYPE;
  3151. return sizeof (INT8U);
  3152. }
  3153. /* Enable/Disable Remote Images Service*/
  3154. if(0 == memcmp(ServiceList[ServiceTypeBit],RMS_SET,strlen(RMS_SET)))
  3155. {
  3156. /* Check For parameter Field length*/
  3157. if(DataLen > 0)
  3158. {
  3159. *pRes = CC_REQ_FIELD_LEN_EXCEEDED;
  3160. return sizeof (INT8U);
  3161. }
  3162. /* Check for valid start/stop bit*/
  3163. if ((pAMISetRISConfReq->ParameterSelect != RIS_START) && (pAMISetRISConfReq->ParameterSelect != RIS_STOP ))
  3164. {
  3165. *pRes = CC_INVALID_COMMAND;
  3166. return sizeof (INT8U);
  3167. }
  3168. /* Set RIS Status*/
  3169. ServiceErr = RISSetServiceStatus(pAMISetRISConfReq->ParameterSelect);
  3170. *pRes = ServiceErr;
  3171. return sizeof (INT8U);
  3172. }
  3173. /*Validate the Block selector*/
  3174. if( 0 != pAMISetRISConfReq->Blockselector
  3175. && (pAMISetRISConfReq->ParameterSelect != RIS_IMAGE_NAME )
  3176. && (pAMISetRISConfReq->ParameterSelect != RIS_REMOTE_PATH )
  3177. && (pAMISetRISConfReq->ParameterSelect != RIS_USER_NAME)
  3178. && (pAMISetRISConfReq->ParameterSelect != RIS_DOMAIN))
  3179. {
  3180. *pRes = CC_INV_DATA_FIELD;
  3181. return sizeof(INT8U);
  3182. }
  3183. if((pAMISetRISConfReq->Blockselector==0)
  3184. && (pAMISetRISConfReq->ParameterSelect != RIS_IP_ADDR )
  3185. && (pAMISetRISConfReq->ParameterSelect != RIS_PASSWORD )
  3186. && (pAMISetRISConfReq->ParameterSelect !=RIS_SHARE_TYPE )
  3187. && (ReqLen!=4))
  3188. {
  3189. *pRes = CC_REQ_INV_LEN;
  3190. return sizeof (INT8U);
  3191. }
  3192. /* Check For RIS support*/
  3193. ServiceErr = RISServiceStatus();
  3194. if(ServiceErr != 0)
  3195. {
  3196. *pRes = ServiceErr;
  3197. return sizeof (INT8U);
  3198. }
  3199. /* Check For parameter Field length*/
  3200. if(DataLen <=0)
  3201. {
  3202. *pRes = CC_REQ_INV_LEN;
  3203. return sizeof (INT8U);
  3204. }
  3205. else if (DataLen > ServiceParamLength [pAMISetRISConfReq->ParameterSelect ])
  3206. {
  3207. *pRes = CC_REQ_FIELD_LEN_EXCEEDED;
  3208. TDBG("Your entered Parameter %d is not a valid data \n",pAMISetRISConfReq->ParameterSelect);
  3209. return sizeof (INT8U);
  3210. }
  3211. else
  3212. {
  3213. TDBG("Your entered Parameter %d is a valid data... \n",pAMISetRISConfReq->ParameterSelect);
  3214. }
  3215. //set image name to particular service structure
  3216. if(pAMISetRISConfReq->ParameterSelect == RIS_IMAGE_NAME)
  3217. {
  3218. memset(ValidData,0,(MAX_DOMAIN_BLOCK_SIZE*MAX_BLOCK) + 1);
  3219. *pRes = SetBlockData(pAMISetRISConfReq, &(BMC_GET_SHARED_MEM (BMCInst)->RISconf.ImageNameBit),&BMC_GET_SHARED_MEM (BMCInst)->RISconf.ImageName[0], BMCInst,CC_INVALID_IMAGE_FILE_NAME,ValidData, DataLen);
  3220. if(*pRes != WRITE_TO_FILE)
  3221. {
  3222. return sizeof (INT8U);
  3223. }
  3224. if(VerifyData(ValidData)==-1)
  3225. {
  3226. *pRes = CC_INVALID_IMAGE_FILE_NAME;
  3227. return sizeof (INT8U);
  3228. }
  3229. EndsWith = strrchr(ValidData, '.');
  3230. if( EndsWith != NULL )
  3231. {
  3232. EndsWithLen = strlen(EndsWith);
  3233. if( EndsWithLen != strlen(".iso") )
  3234. {
  3235. *pRes = CC_INVALID_IMAGE_FILE_NAME;
  3236. return sizeof (INT8U);
  3237. }
  3238. if(0 == memcmp(ServiceList[ServiceTypeBit],RMS_CD_SECTION_NAME,strlen(RMS_CD_SECTION_NAME)))
  3239. {
  3240. if((0 == memcmp(EndsWith, ".iso",EndsWithLen)) || ( 0 == memcmp(EndsWith, ".ISO",EndsWithLen)))
  3241. ValidImage = 1;
  3242. }
  3243. else
  3244. {
  3245. if((0 == memcmp(EndsWith, ".img",EndsWithLen)) || ( 0 == memcmp(EndsWith, ".IMG",EndsWithLen)))
  3246. ValidImage = 1;
  3247. }
  3248. }
  3249. if ((EndsWith == NULL ) || ( !ValidImage ))
  3250. {
  3251. *pRes = CC_INVALID_IMAGE_FILE_NAME;
  3252. return sizeof (INT8U);
  3253. }
  3254. MediaType = ServiceTypeBit;
  3255. done = 1;
  3256. }
  3257. else if(pAMISetRISConfReq->ParameterSelect == RIS_REMOTE_PATH)
  3258. {
  3259. memset(ValidData,0,MAX_DOMAIN_BLOCK_SIZE*MAX_BLOCK);
  3260. *pRes = SetBlockData(pAMISetRISConfReq, &(BMC_GET_SHARED_MEM (BMCInst)->RISconf.MountPathBit),&BMC_GET_SHARED_MEM (BMCInst)->RISconf.MountPath[0], BMCInst,CC_INVALID_IMG_PATH,ValidData, DataLen);
  3261. if(*pRes != WRITE_TO_FILE)
  3262. {
  3263. return sizeof (INT8U);
  3264. }
  3265. if(VerifyData(ValidData)==-1)
  3266. {
  3267. *pRes = CC_INVALID_IMG_PATH;
  3268. return sizeof (INT8U);
  3269. }
  3270. }
  3271. else if(pAMISetRISConfReq->ParameterSelect == RIS_USER_NAME)
  3272. {
  3273. memset(ValidData,0,MAX_DOMAIN_BLOCK_SIZE*MAX_BLOCK);
  3274. *pRes = SetBlockData(pAMISetRISConfReq, &(BMC_GET_SHARED_MEM (BMCInst)->RISconf.UserNameBit),&BMC_GET_SHARED_MEM (BMCInst)->RISconf.UserName[0], BMCInst,CC_INVALID_USR_NAME,ValidData, DataLen);
  3275. if(*pRes != WRITE_TO_FILE)
  3276. {
  3277. return sizeof (INT8U);
  3278. }
  3279. if(VerifyData(ValidData)==-1)
  3280. {
  3281. *pRes = CC_INVALID_USR_NAME;
  3282. return sizeof (INT8U);
  3283. }
  3284. }
  3285. else if(pAMISetRISConfReq->ParameterSelect == RIS_PASSWORD)
  3286. {
  3287. pAMISetRISConfReq->config.Password[DataLen]='\0';
  3288. if(0 == strlen(pAMISetRISConfReq->config.Password))
  3289. {
  3290. *pRes = CC_INVALID_PASSWD;
  3291. return sizeof (INT8U);
  3292. }
  3293. }
  3294. else if(pAMISetRISConfReq->ParameterSelect == RIS_SHARE_TYPE)
  3295. {
  3296. pAMISetRISConfReq->config.ShareType[DataLen]='\0';
  3297. if(0 == strlen(pAMISetRISConfReq->config.ShareType))
  3298. {
  3299. *pRes = CC_INVALID_SHARE_TYPE;
  3300. return sizeof (INT8U);
  3301. }
  3302. if((strncmp(pAMISetRISConfReq->config.ShareType, SHARE_TYPE_NFS,DataLen) == 0) ||
  3303. (strncmp(pAMISetRISConfReq->config.ShareType, SHARE_TYPE_CIFS,DataLen) == 0) )
  3304. {
  3305. }
  3306. else
  3307. {
  3308. *pRes = CC_INVALID_SHARE_TYPE;
  3309. return sizeof (INT8U);
  3310. }
  3311. }
  3312. else if(pAMISetRISConfReq->ParameterSelect == RIS_IP_ADDR)
  3313. {
  3314. pAMISetRISConfReq->config.RemoteIP[DataLen]='\0';
  3315. if(0 == strlen(pAMISetRISConfReq->config.RemoteIP))
  3316. {
  3317. *pRes = CC_INVALID_IP_ADDR;
  3318. return sizeof (INT8U);
  3319. }
  3320. memset(IPAddr,0,MAX_IP_ADDR_LEN);
  3321. _fmemcpy(IPAddr,pAMISetRISConfReq->config.RemoteIP,DataLen);
  3322. if (inet_pton (AF_INET6, IPAddr, (char*)IPV6))
  3323. {
  3324. ValidIP ++;
  3325. }
  3326. if ( inet_pton (AF_INET, IPAddr, (char*)IPV4))
  3327. {
  3328. ValidIP ++;
  3329. }
  3330. if( !ValidIP)
  3331. {
  3332. *pRes = CC_INVALID_IP_ADDR;
  3333. return sizeof (INT8U);
  3334. }
  3335. }
  3336. else if(pAMISetRISConfReq->ParameterSelect == RIS_DOMAIN)
  3337. {
  3338. memset(ValidData,0,MAX_DOMAIN_BLOCK_SIZE*MAX_BLOCK);
  3339. *pRes = SetBlockData(pAMISetRISConfReq, &(BMC_GET_SHARED_MEM (BMCInst)->RISconf.DomainNameBit),&BMC_GET_SHARED_MEM (BMCInst)->RISconf.DomainName[0], BMCInst,CC_INVALID_DOMAIN,ValidData, DataLen);
  3340. if(*pRes != WRITE_TO_FILE)
  3341. {
  3342. return sizeof (INT8U);
  3343. }
  3344. if(VerifyData(ValidData)==-1)
  3345. {
  3346. *pRes = CC_INVALID_DOMAIN;
  3347. return sizeof (INT8U);
  3348. }
  3349. }
  3350. pAMISetRISConfRes->CompletionCode = CC_SUCCESS;
  3351. /*ParameterSelect is other then RIS_IMAGE_NAME need to set it for CD,FD,HD structure*/
  3352. do
  3353. {
  3354. memset(&conf,0,sizeof(MediaCfg_T));
  3355. ServiceErr = GetMediaCfg(&conf,ServiceList[MediaType]);
  3356. if(ServiceErr < 0)
  3357. {
  3358. *pRes = CC_UNSPECIFIED_ERR;
  3359. return sizeof (INT8U);
  3360. }
  3361. switch (pAMISetRISConfReq->ParameterSelect)
  3362. {
  3363. case RIS_IMAGE_NAME:
  3364. memset(conf.Image_Name ,0,MAX_IMAGE_NAME_LEN);
  3365. _fmemcpy(conf.Image_Name,ValidData,strlen(ValidData)+1);
  3366. break;
  3367. case RIS_REMOTE_PATH:
  3368. memset(conf.Image_Path ,0,MAX_IMAGE_PATH_SIZE);
  3369. _fmemcpy(conf.Image_Path,ValidData,strlen(ValidData)+1);
  3370. break;
  3371. case RIS_IP_ADDR:
  3372. memset(conf.Ip_Addr,0,MAX_IP_ADDR_LEN );
  3373. _fmemcpy(conf.Ip_Addr,pAMISetRISConfReq->config.RemoteIP,DataLen);
  3374. break;
  3375. case RIS_USER_NAME:
  3376. memset(conf.Username,0,MAX_RMS_USERNAME_LEN );
  3377. _fmemcpy(conf.Username,ValidData,strlen(ValidData)+1);
  3378. break;
  3379. case RIS_PASSWORD:
  3380. memset(conf.Password,0,MAX_RMS_PASSWORD_LEN );
  3381. _fmemcpy(conf.Password,pAMISetRISConfReq->config.Password,DataLen);
  3382. break;
  3383. case RIS_SHARE_TYPE:
  3384. memset(conf.Share_Type,0,MAX_SHARE_TYPE_LEN );
  3385. _fmemcpy(conf.Share_Type,pAMISetRISConfReq->config.ShareType,DataLen);
  3386. break;
  3387. case RIS_DOMAIN:
  3388. memset(conf.Domain,0,MAX_DOMAIN_LEN);
  3389. _fmemcpy(conf.Domain,ValidData,strlen(ValidData)+1);
  3390. break;
  3391. default:
  3392. pAMISetRISConfRes->CompletionCode = CC_PARAM_NOT_SUPPORTED;
  3393. return sizeof(INT8U);
  3394. }
  3395. ServiceErr = SetMediaCfg(&conf,ServiceList[MediaType]);
  3396. if(ServiceErr < 0)
  3397. {
  3398. *pRes = CC_UNSPECIFIED_ERR;
  3399. return sizeof (INT8U);
  3400. }
  3401. /*Stop the service only if its running*/
  3402. if(1 == conf.Start_Mount )
  3403. {
  3404. ServiceErr = RMediaStartAndStop(ServiceParam[MediaType], RIS_STOP );
  3405. if(ServiceErr < 0)
  3406. {
  3407. *pRes = CC_UNSPECIFIED_ERR;
  3408. return sizeof (INT8U);
  3409. }
  3410. }
  3411. MediaType++;
  3412. }while((MediaType < MAX_SERVICE_COUNT) && (!done));
  3413. return(sizeof(AMISetServiceConfRes_T));
  3414. }
  3415. int
  3416. AMIRISStartStop( _NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
  3417. {
  3418. _NEAR_ AMIRISStartStopReq_T* pAMIRISStartStopReq = (_NEAR_ AMIRISStartStopReq_T*) pReq;
  3419. _NEAR_ AMIRISStartStopRes_T* pAMIRISStartStopRes = (_NEAR_ AMIRISStartStopRes_T*) pRes;
  3420. MediaCfg_T conf;
  3421. INT32U Value = 0;
  3422. INT8U MediaTypeBit = 0;
  3423. int ServiceErr = 0;
  3424. if ( ReqLen < 2 )
  3425. {
  3426. *pRes = CC_REQ_INV_LEN;
  3427. return sizeof (INT8U);
  3428. }
  3429. /* Match the service_id byte with ServiceName */
  3430. Value = (pAMIRISStartStopReq->MediaType);
  3431. ServiceErr = GetINT32UBitsNum (Value, &MediaTypeBit);
  3432. if(ServiceErr < 0)
  3433. {
  3434. TCRIT("Error in Getting Bit Number from Service ID\n");
  3435. *pRes = CC_UNSPECIFIED_ERR;
  3436. return sizeof (INT8U);
  3437. }
  3438. if(ServiceList[MediaTypeBit] == NULL)
  3439. {
  3440. TCRIT("Service Name Not Available for the Requested Service ID\n");
  3441. *pRes = CC_INVALID_MEDIA_TYPE;
  3442. return sizeof (INT8U);
  3443. }
  3444. /* Check For RIS support*/
  3445. ServiceErr = RISServiceStatus();
  3446. if(ServiceErr != 0)
  3447. {
  3448. *pRes = ServiceErr;
  3449. return sizeof (INT8U);
  3450. }
  3451. if ((pAMIRISStartStopReq->ParameterSelect != RIS_START) && (pAMIRISStartStopReq->ParameterSelect != RIS_STOP ))
  3452. {
  3453. *pRes = CC_INVALID_COMMAND;
  3454. return sizeof (INT8U);
  3455. }
  3456. memset(&conf,0,sizeof(MediaCfg_T));
  3457. ServiceErr = GetMediaCfg(&conf,ServiceList[MediaTypeBit]);
  3458. if(ServiceErr < 0)
  3459. {
  3460. *pRes = CC_UNSPECIFIED_ERR;
  3461. return sizeof (INT8U);
  3462. }
  3463. /*Return incase minumum configuration is not met*/
  3464. if((0 ==strlen(conf.Image_Name)) ||( 0 == strlen(conf.Image_Path )) ||( 0 ==strlen( conf.Ip_Addr)) ||( 0 == strlen(conf.Share_Type )))
  3465. {
  3466. *pRes = CC_INVALID_CONFIGURATION;
  3467. return sizeof (INT8U);
  3468. }
  3469. /*If Request command start/stop bit and configuration start/stop bit are same */
  3470. if(pAMIRISStartStopReq->ParameterSelect == conf.Start_Mount )
  3471. {
  3472. *pRes = CC_SUCCESS;
  3473. return sizeof (INT8U);
  3474. }
  3475. ServiceErr = RMediaStartAndStop(ServiceParam[MediaTypeBit],pAMIRISStartStopReq->ParameterSelect );
  3476. if(ServiceErr < 0)
  3477. {
  3478. *pRes = CC_UNSPECIFIED_ERR;
  3479. return sizeof (INT8U);
  3480. }
  3481. pAMIRISStartStopRes->CompletionCode = CC_SUCCESS;
  3482. return(sizeof(AMIRISStartStopRes_T));
  3483. }
  3484. /*---------------------------------------
  3485. * AMIControlDebugMsg
  3486. *---------------------------------------*/
  3487. int AMIControlDebugMsg(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes, int BMCInst)
  3488. {
  3489. AMIControlDebugMsgReq_T *pAMIControlDebugMsgReq = (AMIControlDebugMsgReq_T *)pReq;
  3490. AMIControlDebugMsgRes_T *pAMIControlDebugMsgRes = (AMIControlDebugMsgRes_T*)pRes;
  3491. char Cmd[MAX_STRING_LEN] = {0};
  3492. if(g_corefeatures.runtime_dbgmsg_support == ENABLED)
  3493. {
  3494. pAMIControlDebugMsgRes->CompletionCode = CC_NORMAL;
  3495. if(pAMIControlDebugMsgReq->CtrlDebugMsg == 1)
  3496. {
  3497. snprintf(Cmd,sizeof(Cmd),"touch %s",ENABLE_DBG_MSG);
  3498. safe_system(Cmd);
  3499. pAMIControlDebugMsgRes->DebugMsgStatus = DEBUG_MSG_ENABLED;
  3500. }
  3501. else if(pAMIControlDebugMsgReq->CtrlDebugMsg == 0)
  3502. {
  3503. unlink(ENABLE_DBG_MSG);
  3504. pAMIControlDebugMsgRes->DebugMsgStatus = DEBUG_MSG_DISABLED;
  3505. }
  3506. else
  3507. {
  3508. pAMIControlDebugMsgRes->CompletionCode = CC_INV_DATA_FIELD;
  3509. }
  3510. return sizeof(AMIControlDebugMsgRes_T);
  3511. }
  3512. else
  3513. {
  3514. *pRes = CC_INV_CMD;
  3515. return sizeof(*pRes);
  3516. }
  3517. }
  3518. /*---------------------------------------
  3519. * AMIGetDebugMsgStatus
  3520. *---------------------------------------*/
  3521. int AMIGetDebugMsgStatus(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes, int BMCInst)
  3522. {
  3523. struct stat buff;
  3524. AMIGetDebugMsgStatusRes_T *pAMIGetDebugMsgStatusRes = (AMIGetDebugMsgStatusRes_T *)pRes;
  3525. if(g_corefeatures.runtime_dbgmsg_support == ENABLED)
  3526. {
  3527. if(stat(ENABLE_DBG_MSG,&buff) == 0)
  3528. {
  3529. pAMIGetDebugMsgStatusRes->DebugMsgStatus = DEBUG_MSG_ENABLED;
  3530. }
  3531. else
  3532. {
  3533. pAMIGetDebugMsgStatusRes->DebugMsgStatus = DEBUG_MSG_DISABLED;
  3534. }
  3535. pAMIGetDebugMsgStatusRes->CompletionCode = CC_NORMAL;
  3536. return sizeof(AMIGetDebugMsgStatusRes_T);
  3537. }
  3538. else
  3539. {
  3540. *pRes = CC_INV_CMD;
  3541. return sizeof(*pRes);
  3542. }
  3543. }
  3544. /*
  3545. *@fn AMI_SET_EXTENDED_PRIV
  3546. *@brief This command helps to get users shell
  3547. * @param pReq - Request for the command
  3548. * @param ReqLen - Request length for the command
  3549. * @param pRes - Respose for the command
  3550. * @param BMCInst- BMC Instance
  3551. * @return Returns size of AMIGetUserShelltypeRes_T
  3552. */
  3553. int AMIGetExtendedPrivilege(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
  3554. {
  3555. _NEAR_ AMISetExtendedPrivReq_T* pGetExtendedprivReq = (_NEAR_ AMISetExtendedPrivReq_T*)pReq;
  3556. _NEAR_ AMIGetExtendedPrivRes_T* pGetExtendedprivRes = (_NEAR_ AMIGetExtendedPrivRes_T*)pRes;
  3557. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  3558. _FAR_ UserInfo_T* pUserInfo = NULL;
  3559. INT8U UserId=0;
  3560. UserId = pGetExtendedprivReq->UserID & 0x3F;
  3561. /* if user ID exceeded the Max limit */
  3562. if (pGetExtendedprivReq->UserID > pBMCInfo->IpmiConfig.MaxUsers)
  3563. {
  3564. pGetExtendedprivRes->CompletionCode = CC_INV_DATA_FIELD ;
  3565. return sizeof (*pRes);/* Invalied user id */
  3566. }
  3567. pUserInfo = getUserIdInfo(UserId, BMCInst);
  3568. /* User with given ID is not created */
  3569. if ( NULL == pUserInfo )
  3570. {
  3571. *pRes = CC_INV_DATA_FIELD;
  3572. return sizeof (*pRes);
  3573. }
  3574. LOCK_BMC_SHARED_MEM(BMCInst);
  3575. pGetExtendedprivRes->CompletionCode = CC_NORMAL;
  3576. pGetExtendedprivRes->Extendedpriv = pUserInfo->ExtendedPrivilege;
  3577. UNLOCK_BMC_SHARED_MEM(BMCInst);
  3578. return sizeof (AMIGetExtendedPrivRes_T);
  3579. }
  3580. /*
  3581. *@fn AMISetExtendedpriv
  3582. *@brief This command helps to set users shell
  3583. * @param pReq - Request for the command
  3584. * @param ReqLen - Request length for the command
  3585. * @param pRes - Respose for the command
  3586. * @param BMCInst- BMC Instance
  3587. * @return Returns size of AMISetUserShelltypeRes_T
  3588. */
  3589. int AMISetExtendedPrivilege(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
  3590. {
  3591. _NEAR_ AMISetExtendedPrivReq_T* pSetExtendedprivReq = (_NEAR_ AMISetExtendedPrivReq_T*)pReq;
  3592. _FAR_ UserInfo_T* pUserInfo = NULL;
  3593. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  3594. INT8U UserId=0;
  3595. INT32U oldExtendedprivstatus =0;
  3596. UserId = pSetExtendedprivReq->UserID & 0x3F;
  3597. /* if user ID exceeded the Max limit */
  3598. if (pSetExtendedprivReq->UserID > pBMCInfo->IpmiConfig.MaxUsers)
  3599. {
  3600. *pRes = CC_INV_DATA_FIELD ;
  3601. return sizeof (*pRes);/* Invalid user id */
  3602. }
  3603. if(pSetExtendedprivReq->Extendedpriv & INVALID_PRIV_REQUEST)
  3604. {
  3605. *pRes = CC_INV_DATA_FIELD ;
  3606. return sizeof (*pRes);/* Invalid Extended Privilege requested*/
  3607. }
  3608. pUserInfo = getUserIdInfo(UserId, BMCInst);
  3609. /* If User is not created */
  3610. if ( NULL == pUserInfo )
  3611. {
  3612. *pRes = CC_INV_DATA_FIELD;
  3613. return sizeof (*pRes);
  3614. }
  3615. /* Skipping Updation If older and newer privilege same */
  3616. if(pUserInfo->ExtendedPrivilege == pSetExtendedprivReq->Extendedpriv )
  3617. {
  3618. *pRes = CC_NORMAL;
  3619. return sizeof (*pRes);
  3620. }
  3621. LOCK_BMC_SHARED_MEM(BMCInst);
  3622. oldExtendedprivstatus = pUserInfo->ExtendedPrivilege;
  3623. pUserInfo->ExtendedPrivilege = pSetExtendedprivReq->Extendedpriv;
  3624. if ( 0 != pUserInfo->UserName[0])
  3625. {
  3626. AddIPMIUsrtoFlagsGrp((char *)pUserInfo->UserName, oldExtendedprivstatus, pUserInfo->ExtendedPrivilege);
  3627. }
  3628. UNLOCK_BMC_SHARED_MEM(BMCInst);
  3629. FlushIPMI((INT8U*)&pBMCInfo->UserInfo[0],(INT8U*)&pBMCInfo->UserInfo[0],pBMCInfo->IPMIConfLoc.UserInfoAddr,
  3630. sizeof(UserInfo_T)*MAX_USER_CFG_MDS,BMCInst);
  3631. *pRes = CC_NORMAL;
  3632. return sizeof (*pRes);
  3633. }
  3634. /**
  3635. * OnGethostlockvalue_dynm
  3636. * @brief This method helpd to get the adviser configuration
  3637. * @param AdviserCfg - adviserd conf structure
  3638. */
  3639. int OnGethostlockvalue_dynm(int *hostlock_feature)
  3640. {
  3641. void *dl_handle = NULL;
  3642. int ( *dl_func )( void *);
  3643. dl_handle = NULL;
  3644. int retval =0;
  3645. int value=0;
  3646. dl_handle = dlopen ( "/usr/local/lib/libadvisercfg.so", RTLD_NOW );
  3647. if(NULL == dl_handle)
  3648. {
  3649. return -1;
  3650. }
  3651. dl_func = dlsym( dl_handle, "OnGethostlockfeature_dynm" );
  3652. if(NULL == dl_func)
  3653. {
  3654. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  3655. dlclose(dl_handle);
  3656. return -1;
  3657. }
  3658. retval= dl_func ( (void *)&value);
  3659. if(retval < 0)
  3660. return retval;
  3661. *hostlock_feature = value;
  3662. return retval;
  3663. }
  3664. /**
  3665. * OnGethostlockvalue_dynm
  3666. * @brief This method helpd to get the adviser configuration
  3667. * @param AdviserCfg - adviserd conf structure
  3668. */
  3669. int OnSethostlockvalue_dynm(int hostlock_feature)
  3670. {
  3671. void *dl_handle = NULL;
  3672. int ( *dl_func )( void *);
  3673. dl_handle = NULL;
  3674. int retval =0;
  3675. dl_handle = dlopen ( "/usr/local/lib/libadvisercfg.so", RTLD_NOW );
  3676. if(NULL == dl_handle)
  3677. {
  3678. return -1;
  3679. }
  3680. dl_func = dlsym( dl_handle, "OnSethostlockfeature_dynm" );
  3681. if(NULL == dl_func)
  3682. {
  3683. IPMI_ERROR("Error in getting symbol %s \n", dlerror());
  3684. dlclose(dl_handle);
  3685. return -1;
  3686. }
  3687. retval= dl_func ( (void *)hostlock_feature);
  3688. return retval;
  3689. }
  3690. /*
  3691. *@fn AMIGetHostLockFeatureStatus
  3692. *@brief This command helps to get host monitor lock Feature status
  3693. * @param pReq - Request for the command
  3694. * @param ReqLen - Request length for the command
  3695. * @param pRes - Respose for the command
  3696. * @param BMCInst- BMC Instance
  3697. * @return Returns size of AMIGetHostLockFeatureStatusRes_T
  3698. */
  3699. int AMIGetHostLockFeatureStatus(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes, int BMCInst)
  3700. {
  3701. AMIGetHostLockFeatureStatusRes_T *pAMIGetHLFeatureStsRes = (AMIGetHostLockFeatureStatusRes_T *)pRes;
  3702. int status =-1;
  3703. int hostlockfeatureStatus=0;
  3704. int retval=0;
  3705. if(g_corefeatures.host_lock_feature != ENABLED)
  3706. {
  3707. *pRes = CC_INV_CMD;
  3708. return sizeof (INT8U);
  3709. }
  3710. if ( ReqLen > 0 )
  3711. {
  3712. *pRes = CC_REQ_INV_LEN;
  3713. return sizeof (INT8U);
  3714. }
  3715. retval = OnGethostlockvalue_dynm(&hostlockfeatureStatus);
  3716. if(retval <0)
  3717. {
  3718. *pRes = CC_UNSPECIFIED_ERR;
  3719. return sizeof (INT8U);
  3720. }
  3721. status = hostlockfeatureStatus & (1<<0);
  3722. pAMIGetHLFeatureStsRes->LockFeatureStatus =status;
  3723. pAMIGetHLFeatureStsRes->CompletionCode = CC_NORMAL;
  3724. return sizeof(AMIGetHostLockFeatureStatusRes_T);
  3725. }
  3726. /*
  3727. *@fn AMISetHostLockFeatureStatus
  3728. *@brief This command helps to set host monitor lock feature
  3729. * @param pReq - Request for the command
  3730. * @param ReqLen - Request length for the command
  3731. * @param pRes - Respose for the command
  3732. * @param BMCInst- BMC Instance
  3733. * @return Returns completion code
  3734. */
  3735. int AMISetHostLockFeatureStatus(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
  3736. {
  3737. _NEAR_ AMISetHostLockFeatureStatusReq_T* pAMISetHLFeatureStsReq = (_NEAR_ AMISetHostLockFeatureStatusReq_T*)pReq;
  3738. int ret = -1;
  3739. *pRes = CC_NORMAL;
  3740. int status=0,hostlockfeatureStatus=0;
  3741. INT8U *curchannel;
  3742. RestartService_T Service;
  3743. if(g_corefeatures.host_lock_feature != ENABLED)
  3744. {
  3745. *pRes = CC_INV_CMD;
  3746. return sizeof (INT8U);
  3747. }
  3748. // check incoming Feature status to Enable/Disable
  3749. if ( (HLENABLED != pAMISetHLFeatureStsReq->LockFeatureStatus) && (HLDISABLED != pAMISetHLFeatureStsReq->LockFeatureStatus) )
  3750. {
  3751. *pRes = CC_INV_FEATURE_CMD;
  3752. return sizeof (INT8U);
  3753. }
  3754. ret = OnGethostlockvalue_dynm(&hostlockfeatureStatus);
  3755. if(ret <0)
  3756. {
  3757. *pRes = CC_UNSPECIFIED_ERR;
  3758. return sizeof (INT8U);
  3759. }
  3760. status = hostlockfeatureStatus & (1<<0);
  3761. // check incoming lockstatus to same as existing
  3762. if(status == pAMISetHLFeatureStsReq->LockFeatureStatus)
  3763. {
  3764. *pRes = CC_SUCCESS;
  3765. return sizeof (INT8U);
  3766. }
  3767. if(pAMISetHLFeatureStsReq->LockFeatureStatus == 1)
  3768. {
  3769. hostlockfeatureStatus |= (1<<0);
  3770. }
  3771. else if(pAMISetHLFeatureStsReq->LockFeatureStatus == 0)
  3772. {
  3773. hostlockfeatureStatus &= ~(1 << 0);
  3774. }
  3775. ret = OnSethostlockvalue_dynm(hostlockfeatureStatus);
  3776. if(ret < 0)
  3777. {
  3778. *pRes = CC_UNSPECIFIED_ERR;
  3779. return sizeof (INT8U);
  3780. }
  3781. else
  3782. {
  3783. //Post BMC Reboot task to Pend task
  3784. Service.ServiceName = ADVISER_CONF;
  3785. Service.SleepSeconds = 3; // Sleep for 3 Seconds
  3786. SetPendStatus(PEND_OP_RESTART_SERVICES, PEND_STATUS_PENDING);
  3787. OS_THREAD_TLS_GET(g_tls.CurChannel,curchannel);
  3788. PostPendTask(PEND_OP_RESTART_SERVICES, (INT8U *) &Service, sizeof(RestartService_T),*curchannel & 0xF,BMCInst);
  3789. }
  3790. *pRes = CC_NORMAL;
  3791. return sizeof (*pRes);
  3792. }
  3793. /*
  3794. *@fn AMIGetHostLockStatus
  3795. *@brief This command helps to get host monitor lock status
  3796. * @param pReq - Request for the command
  3797. * @param ReqLen - Request length for the command
  3798. * @param pRes - Respose for the command
  3799. * @param BMCInst- BMC Instance
  3800. * @return Returns size of AMIGetHostLockStatusRes_T
  3801. */
  3802. int AMIGetHostAutoLockStatus(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes, int BMCInst)
  3803. {
  3804. AMIGetHostAutoLockStatusRes_T *pAMIGetHostLockStatusRes = (AMIGetHostAutoLockStatusRes_T *)pRes;
  3805. int status =-1;
  3806. int hostlockfeature=0,hostlockfeatureStatus=0;
  3807. int ret=-1;
  3808. if(g_corefeatures.host_auto_lock != ENABLED)
  3809. {
  3810. *pRes = CC_INV_CMD;
  3811. return sizeof (INT8U);
  3812. }
  3813. if ( ReqLen > 0 )
  3814. {
  3815. *pRes = CC_REQ_INV_LEN;
  3816. return sizeof (INT8U);
  3817. }
  3818. ret = OnGethostlockvalue_dynm(&hostlockfeatureStatus);
  3819. if(ret <0)
  3820. {
  3821. *pRes = CC_UNSPECIFIED_ERR;
  3822. return sizeof (INT8U);
  3823. }
  3824. hostlockfeature = hostlockfeatureStatus & (1<<0);
  3825. //If Host Lock Feature is Disabled return error code
  3826. if(HLDISABLED == hostlockfeature)
  3827. {
  3828. *pRes = CC_FEATURE_NOT_ENABLED;
  3829. return sizeof (INT8U);
  3830. }
  3831. status = hostlockfeatureStatus & (1<<1);
  3832. if(status == (1<<1))
  3833. {
  3834. pAMIGetHostLockStatusRes->LockStatus =1;
  3835. }
  3836. else
  3837. pAMIGetHostLockStatusRes->LockStatus =0;
  3838. pAMIGetHostLockStatusRes->CompletionCode = CC_NORMAL;
  3839. return sizeof(AMIGetHostAutoLockStatusRes_T);
  3840. }
  3841. /*@fn AMISetHostLockStatus
  3842. *@brief This command helps to set host monitor lock
  3843. * @param pReq - Request for the command
  3844. * @param ReqLen - Request length for the command
  3845. * @param pRes - Respose for the command
  3846. * @param BMCInst- BMC Instance
  3847. * @return Returns completion code
  3848. */
  3849. int AMISetHostAutoLockStatus(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes,int BMCInst)
  3850. {
  3851. _NEAR_ AMISetHostAutoLockStatusReq_T* pAMISetHostLockStatusReq = (_NEAR_ AMISetHostAutoLockStatusReq_T*)pReq;
  3852. int ret = -1;
  3853. int hostlockfeature=0,hostlockfeatureStatus=0;
  3854. int prev_autolock_status = 0;
  3855. *pRes = CC_NORMAL;
  3856. RestartService_T Service;
  3857. INT8U *curchannel;
  3858. if(g_corefeatures.host_auto_lock != ENABLED)
  3859. {
  3860. *pRes = CC_INV_CMD;
  3861. return sizeof (INT8U);
  3862. }
  3863. ret = OnGethostlockvalue_dynm(&hostlockfeatureStatus);
  3864. if(ret <0)
  3865. {
  3866. *pRes = CC_UNSPECIFIED_ERR;
  3867. return sizeof (INT8U);
  3868. }
  3869. hostlockfeature = hostlockfeatureStatus & (1<<0);
  3870. //If Host Lock Feature is Disabled return error code
  3871. if(HLDISABLED == hostlockfeature)
  3872. {
  3873. *pRes = CC_FEATURE_NOT_ENABLED;
  3874. return sizeof (INT8U);
  3875. }
  3876. // check incoming lockstatus to lock/unlock
  3877. if ( (HOSTLOCK_CMD !=pAMISetHostLockStatusReq->LockStatus) && (HOSTUNLOCK_CMD !=pAMISetHostLockStatusReq->LockStatus) )
  3878. {
  3879. *pRes = CC_INV_LOCK_CMD;
  3880. return sizeof (INT8U);
  3881. }
  3882. prev_autolock_status = hostlockfeatureStatus & (1<<1);
  3883. // check incoming lockstatus to same as existing
  3884. if ( prev_autolock_status == pAMISetHostLockStatusReq->LockStatus)
  3885. {
  3886. *pRes = CC_SUCCESS;
  3887. return sizeof (INT8U);
  3888. }
  3889. if(pAMISetHostLockStatusReq->LockStatus == 1)
  3890. {
  3891. hostlockfeatureStatus |= (1<<1);
  3892. }
  3893. else if(pAMISetHostLockStatusReq->LockStatus == 0)
  3894. {
  3895. hostlockfeatureStatus &= ~(1 << 1);
  3896. }
  3897. else
  3898. {
  3899. *pRes = CC_INV_DATA_FIELD;
  3900. return sizeof (INT8U);
  3901. }
  3902. ret = OnSethostlockvalue_dynm(hostlockfeatureStatus);
  3903. if(ret < 0)
  3904. {
  3905. *pRes = CC_UNSPECIFIED_ERR;
  3906. return sizeof (INT8U);
  3907. }
  3908. else
  3909. {
  3910. //Post BMC Reboot task to Pend task
  3911. Service.ServiceName = ADVISER_CONF;
  3912. Service.SleepSeconds = 3; // Sleep for 3 Seconds
  3913. SetPendStatus(PEND_OP_RESTART_SERVICES, PEND_STATUS_PENDING);
  3914. OS_THREAD_TLS_GET(g_tls.CurChannel,curchannel);
  3915. PostPendTask(PEND_OP_RESTART_SERVICES, (INT8U *) &Service, sizeof(RestartService_T),*curchannel & 0xF,BMCInst);
  3916. }
  3917. *pRes = CC_NORMAL;
  3918. return sizeof (*pRes);
  3919. }
  3920. int AMIGetChannelType(_NEAR_ INT8U *pReq, INT32U ReqLen, _NEAR_ INT8U *pRes, int BMCInst)
  3921. {
  3922. _NEAR_ AMIGetChannelTypeReq_T *pAMIGetChTypeReq = (_NEAR_ AMIGetChannelTypeReq_T*)pReq;
  3923. _NEAR_ AMIGetChannelTypeRes_T *pAMIGetChTypeRes = (_NEAR_ AMIGetChannelTypeRes_T*)pRes;
  3924. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  3925. _FAR_ ChannelInfo_T* pChannelInfo;
  3926. if((pAMIGetChTypeReq->ChannelNumber & 0xF0) || (CURRENT_CHANNEL_NUM == pAMIGetChTypeReq->ChannelNumber))
  3927. {
  3928. pAMIGetChTypeRes->CompletionCode = CC_INV_DATA_FIELD;
  3929. return sizeof(*pRes);
  3930. }
  3931. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->ChUserMutex,WAIT_INFINITE);
  3932. pChannelInfo = getChannelInfo(pAMIGetChTypeReq->ChannelNumber, BMCInst);
  3933. if (NULL == pChannelInfo)
  3934. {
  3935. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
  3936. pAMIGetChTypeRes->CompletionCode = CC_INV_DATA_FIELD ;
  3937. return sizeof (*pRes);
  3938. }
  3939. pAMIGetChTypeRes->CompletionCode = CC_NORMAL;
  3940. pAMIGetChTypeRes->ChannelType = pChannelInfo->ChannelType;
  3941. pAMIGetChTypeRes->ChannelNumber = pAMIGetChTypeReq->ChannelNumber;
  3942. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->ChUserMutex);
  3943. return sizeof (AMIGetChannelTypeRes_T);
  3944. }