<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda="http://www.passport.com/NameSpace.xsd" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]-->
<style>
<!--
/* Font Definitions */
@font-face
{font-family:Helvetica;
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:Courier;
panose-1:2 7 4 9 2 2 5 2 4 4;}
@font-face
{font-family:"Tms Rmn";
panose-1:2 2 6 3 4 5 5 2 3 4;}
@font-face
{font-family:Helv;
panose-1:2 11 6 4 2 2 2 3 2 4;}
@font-face
{font-family:"New York";
panose-1:2 4 5 3 6 5 6 2 3 4;}
@font-face
{font-family:System;
panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:"MS Mincho";
panose-1:2 2 6 9 4 2 5 8 3 4;}
@font-face
{font-family:Batang;
panose-1:2 3 6 0 0 1 1 1 1 1;}
@font-face
{font-family:SimSun;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:PMingLiU;
panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
{font-family:"MS Gothic";
panose-1:2 11 6 9 7 2 5 8 2 4;}
@font-face
{font-family:Dotum;
panose-1:2 11 6 0 0 1 1 1 1 1;}
@font-face
{font-family:SimHei;
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
{font-family:MingLiU;
panose-1:2 2 5 9 0 0 0 0 0 0;}
@font-face
{font-family:Mincho;
panose-1:2 2 6 9 4 3 5 8 3 5;}
@font-face
{font-family:Gulim;
panose-1:2 11 6 0 0 1 1 1 1 1;}
@font-face
{font-family:Century;
panose-1:2 4 6 4 5 5 5 2 3 4;}
@font-face
{font-family:"Angsana New";
panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
{font-family:"Cordia New";
panose-1:2 11 3 4 2 2 2 2 2 4;}
@font-face
{font-family:Mangal;
panose-1:2 4 5 3 5 2 3 3 2 2;}
@font-face
{font-family:Latha;
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:Sylfaen;
panose-1:1 10 5 2 5 3 6 3 3 3;}
@font-face
{font-family:Vrinda;
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:Raavi;
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:Shruti;
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:Sendnya;
panose-1:0 0 4 0 0 0 0 0 0 0;}
@font-face
{font-family:Gautami;
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:Tunga;
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:"Estrangelo Edessa";
panose-1:3 8 6 0 0 0 0 0 0 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:"Arial Unicode MS";
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:Cambria;
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Tahoma;
panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
{font-family:\5B8B\4F53;}
@font-face
{font-family:"\@\5B8B\4F53";}
@font-face
{font-family:"Segoe Print";
panose-1:2 0 6 0 0 0 0 0 0 0;}
@font-face
{font-family:"Trebuchet MS";
panose-1:2 11 6 3 2 2 2 2 2 4;}
@font-face
{font-family:"\@SimSun";
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:Verdana;
panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
{font-family:"Century Gothic";
panose-1:2 11 5 2 2 2 2 2 2 4;}
@font-face
{font-family:"\@MS Mincho";
panose-1:2 2 6 9 4 2 5 8 3 4;}
@font-face
{font-family:"Lucida Sans";
panose-1:2 11 6 2 3 5 4 2 2 4;}
@font-face
{font-family:"Segoe UI";
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:"Arial Black";
panose-1:2 11 10 4 2 1 2 2 2 4;}
@font-face
{font-family:"MS PGothic";
panose-1:2 11 6 0 7 2 5 8 2 4;}
@font-face
{font-family:"\FF2D\FF33 \660E\671D";}
@font-face
{font-family:\30E1\30A4\30EA\30AA;}
@font-face
{font-family:"\@\30E1\30A4\30EA\30AA";}
@font-face
{font-family:"\@\FF2D\FF33 \660E\671D";}
@font-face
{font-family:"MS Shell Dlg 2";
panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
{font-family:Garamond;
panose-1:2 2 4 4 3 3 1 1 8 3;}
@font-face
{font-family:"Lucida Console";
panose-1:2 11 6 9 4 5 4 2 2 4;}
@font-face
{font-family:Meiryo;
panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
{font-family:"\@Meiryo";
panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
{font-family:"\@MS Gothic";
panose-1:2 11 6 9 7 2 5 8 2 4;}
@font-face
{font-family:"Comic Sans MS";
panose-1:3 15 7 2 3 3 2 2 2 4;}
@font-face
{font-family:"Script MT Bold";
panose-1:3 4 6 2 4 6 7 8 9 4;}
@font-face
{font-family:"Lucida Calligraphy";
panose-1:3 1 1 1 1 1 1 1 1 1;}
@font-face
{font-family:"Times New Roman CE";}
@font-face
{font-family:"Times New Roman CYR";}
@font-face
{font-family:"Times New Roman Greek";}
@font-face
{font-family:"Times New Roman TUR";}
@font-face
{font-family:"Times New Roman \(Hebrew\)";}
@font-face
{font-family:"Times New Roman Baltic";}
@font-face
{font-family:"Arial CE";}
@font-face
{font-family:"Arial CYR";}
@font-face
{font-family:"Arial Greek";}
@font-face
{font-family:"Arial TUR";}
@font-face
{font-family:"Arial \(Hebrew\)";}
@font-face
{font-family:"Arial Baltic";}
@font-face
{font-family:"Bookman Old Style";
panose-1:2 5 6 4 5 5 5 2 2 4;}
@font-face
{font-family:"Monotype Corsiva";
panose-1:3 1 1 1 1 2 1 1 1 1;}
@font-face
{font-family:Huxtable;}
@font-face
{font-family:Mufferaw;}
@font-face
{font-family:"Planet Benson 2";}
@font-face
{font-family:Marlett;
panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:BatangChe;
panose-1:2 3 6 9 0 1 1 1 1 1;}
@font-face
{font-family:Gungsuh;
panose-1:2 3 6 0 0 1 1 1 1 1;}
@font-face
{font-family:GungsuhChe;
panose-1:2 3 6 9 0 1 1 1 1 1;}
@font-face
{font-family:DaunPenh;
panose-1:1 1 1 1 1 1 1 1 1 1;}
@font-face
{font-family:DokChampa;
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:Euphemia;
panose-1:2 11 5 3 4 1 2 2 1 4;}
@font-face
{font-family:Vani;
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:GulimChe;
panose-1:2 11 6 9 0 1 1 1 1 1;}
@font-face
{font-family:DotumChe;
panose-1:2 11 6 9 0 1 1 1 1 1;}
@font-face
{font-family:Impact;
panose-1:2 11 8 6 3 9 2 5 2 4;}
@font-face
{font-family:"Iskoola Pota";
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:Kalinga;
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:Kartika;
panose-1:2 2 5 3 3 4 4 6 2 3;}
@font-face
{font-family:"Khmer UI";
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:"Lao UI";
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:"Malgun Gothic";
panose-1:2 11 5 3 2 0 0 2 0 4;}
@font-face
{font-family:"Meiryo UI";
panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
{font-family:"Microsoft Himalaya";
panose-1:1 1 1 0 1 1 1 1 1 1;}
@font-face
{font-family:"Microsoft JhengHei";
panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
{font-family:"Microsoft YaHei";
panose-1:2 11 5 3 2 2 4 2 2 4;}
@font-face
{font-family:MingLiU_HKSCS;
panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
{font-family:MingLiU-ExtB;
panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
{font-family:PMingLiU-ExtB;
panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
{font-family:MingLiU_HKSCS-ExtB;
panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
{font-family:"Mongolian Baiti";
panose-1:3 0 5 0 0 0 0 0 0 0;}
@font-face
{font-family:"MS UI Gothic";
panose-1:2 11 6 0 7 2 5 8 2 4;}
@font-face
{font-family:"MS PMincho";
panose-1:2 2 6 0 4 2 5 8 3 4;}
@font-face
{font-family:"MV Boli";
panose-1:2 0 5 0 3 2 0 9 0 0;}
@font-face
{font-family:"Microsoft New Tai Lue";
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:Nyala;
panose-1:2 0 5 4 7 3 0 2 0 3;}
@font-face
{font-family:"Microsoft PhagsPa";
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:"Plantagenet Cherokee";
panose-1:2 2 6 2 7 1 0 0 0 0;}
@font-face
{font-family:"Segoe Script";
panose-1:2 11 5 4 2 0 0 0 0 3;}
@font-face
{font-family:"Segoe UI Semibold";
panose-1:2 11 7 2 4 2 4 2 2 3;}
@font-face
{font-family:"Segoe UI Light";
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:"Segoe UI Symbol";
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:NSimSun;
panose-1:2 1 6 9 3 1 1 1 1 1;}
@font-face
{font-family:SimSun-ExtB;
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
{font-family:"Microsoft Tai Le";
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:"Shonar Bangla";
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:"Microsoft Yi Baiti";
panose-1:3 0 5 0 0 0 0 0 0 0;}
@font-face
{font-family:"Microsoft Sans Serif";
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:Aparajita;
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:Ebrima;
panose-1:2 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:Gisha;
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:Kokila;
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:Leelawadee;
panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
{font-family:"Microsoft Uighur";
panose-1:2 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:MoolBoran;
panose-1:2 11 1 0 1 1 1 1 1 1;}
@font-face
{font-family:Utsaah;
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:Vijaya;
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:Andalus;
panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
{font-family:"Arabic Typesetting";
panose-1:3 2 4 2 4 4 6 3 2 3;}
@font-face
{font-family:"Simplified Arabic";
panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
{font-family:"Simplified Arabic Fixed";
panose-1:2 7 3 9 2 2 5 2 4 4;}
@font-face
{font-family:"Sakkal Majalla";
panose-1:2 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:"Traditional Arabic";
panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
{font-family:Aharoni;
panose-1:2 1 8 3 2 1 4 3 2 3;}
@font-face
{font-family:David;
panose-1:2 14 5 2 6 4 1 1 1 1;}
@font-face
{font-family:FrankRuehl;
panose-1:2 14 5 3 6 1 1 1 1 1;}
@font-face
{font-family:"Levenim MT";
panose-1:2 1 5 2 6 1 1 1 1 1;}
@font-face
{font-family:Miriam;
panose-1:2 11 5 2 5 1 1 1 1 1;}
@font-face
{font-family:"Miriam Fixed";
panose-1:2 11 5 9 5 1 1 1 1 1;}
@font-face
{font-family:Narkisim;
panose-1:2 14 5 2 5 1 1 1 1 1;}
@font-face
{font-family:Rod;
panose-1:2 3 5 9 5 1 1 1 1 1;}
@font-face
{font-family:FangSong;
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
{font-family:KaiTi;
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
{font-family:AngsanaUPC;
panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
{font-family:"Browallia New";
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:BrowalliaUPC;
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:CordiaUPC;
panose-1:2 11 3 4 2 2 2 2 2 4;}
@font-face
{font-family:DilleniaUPC;
panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
{font-family:EucrosiaUPC;
panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
{font-family:FreesiaUPC;
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:IrisUPC;
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:JasmineUPC;
panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
{font-family:KodchiangUPC;
panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
{font-family:LilyUPC;
panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
{font-family:DFKai-SB;
panose-1:3 0 5 9 0 0 0 0 0 0;}
@font-face
{font-family:"Lucida Sans Unicode";
panose-1:2 11 6 2 3 5 4 2 2 4;}
@font-face
{font-family:Candara;
panose-1:2 14 5 2 3 3 3 2 2 4;}
@font-face
{font-family:Constantia;
panose-1:2 3 6 2 5 3 6 3 3 3;}
@font-face
{font-family:Corbel;
panose-1:2 11 5 3 2 2 4 2 2 4;}
@font-face
{font-family:"Franklin Gothic Medium";
panose-1:2 11 6 3 2 1 2 2 2 4;}
@font-face
{font-family:Gabriola;
panose-1:4 4 6 5 5 16 2 2 13 2;}
@font-face
{font-family:Georgia;
panose-1:2 4 5 2 5 4 5 2 3 3;}
@font-face
{font-family:"Palatino Linotype";
panose-1:2 4 5 2 5 5 5 3 3 4;}
@font-face
{font-family:Webdings;
panose-1:5 3 1 2 1 5 9 6 7 3;}
@font-face
{font-family:"MT Extra";
panose-1:5 5 1 2 1 2 5 2 2 2;}
@font-face
{font-family:"Bookshelf Symbol 7";
panose-1:5 1 1 1 1 1 1 1 1 1;}
@font-face
{font-family:"MS Reference Sans Serif";
panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
{font-family:"MS Reference Specialty";
panose-1:5 0 5 0 0 0 0 0 0 0;}
@font-face
{font-family:"MS Outlook";
panose-1:5 1 1 0 1 0 0 0 0 0;}
@font-face
{font-family:"Book Antiqua";
panose-1:2 4 6 2 5 3 5 3 3 4;}
@font-face
{font-family:"Wingdings 2";
panose-1:5 2 1 2 1 5 7 7 7 7;}
@font-face
{font-family:"Wingdings 3";
panose-1:5 4 1 2 1 8 7 7 7 7;}
@font-face
{font-family:"Arial Narrow";
panose-1:2 11 6 6 2 2 2 3 2 4;}
@font-face
{font-family:Amienne;}
@font-face
{font-family:Arnprior;}
@font-face
{font-family:Baveuse;}
@font-face
{font-family:Berylium;}
@font-face
{font-family:"Blue Highway";}
@font-face
{font-family:"Blue Highway Condensed";}
@font-face
{font-family:"Blue Highway D Type";}
@font-face
{font-family:"Blue Highway Linocut";}
@font-face
{font-family:"Burnstown Dam";}
@font-face
{font-family:"Carbon Block";}
@font-face
{font-family:"Credit Valley";}
@font-face
{font-family:"Earwig Factory";}
@font-face
{font-family:"Hurry Up";}
@font-face
{font-family:"Heavy Heap";}
@font-face
{font-family:Kredit;}
@font-face
{font-family:"Minya Nouvelle";}
@font-face
{font-family:Neuropol;}
@font-face
{font-family:Pupcat;}
@font-face
{font-family:Stereofidelic;}
@font-face
{font-family:"Sybil Green";}
@font-face
{font-family:Teen;}
@font-face
{font-family:"Teen Light";}
@font-face
{font-family:"Velvenda Cooler";}
@font-face
{font-family:Biondi;}
@font-face
{font-family:Boopee;}
@font-face
{font-family:Byington;}
@font-face
{font-family:Catriel;}
@font-face
{font-family:"Euphorigenic S";}
@font-face
{font-family:Ligurino;}
@font-face
{font-family:"Ligurino Condensed";}
@font-face
{font-family:Tandelle;}
@font-face
{font-family:Waker;}
@font-face
{font-family:Times;
panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
{font-family:"Guttman Stam";}
@font-face
{font-family:"ms sans serif";}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal;
font-family:"Calibri","sans-serif";
color:windowtext;}
span.EmailStyle18
{mso-style-type:personal-reply;
font-family:"Calibri","sans-serif";
color:#1F497D;}
span.msoIns
{mso-style-type:export-only;
mso-style-name:"";
text-decoration:underline;
color:teal;}
span.msoDel
{mso-style-type:export-only;
mso-style-name:"";
text-decoration:line-through;
color:red;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.25in 1.0in 1.25in;}
div.WordSection1
{page:WordSection1;}
-->
</style>
<!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang=EN-US link=blue vlink=purple>
<div class=WordSection1>
<p class=MsoNormal><span style='color:#1F497D'>Don’t use a work item. Just create
a DPC object, and queue it yourself after processing a certain number of
completions. Look at the SMI code – it does exactly this.<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-Fab<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<div>
<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>
<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
ofw-bounces@lists.openfabrics.org [mailto:ofw-bounces@lists.openfabrics.org] <b>On
Behalf Of </b>Smith, Stan<br>
<b>Sent:</b> Wednesday, August 25, 2010 8:54 AM<br>
<b>To:</b> urih@mellanox.co.il<br>
<b>Cc:</b> ofw@lists.openfabrics.org<br>
<b>Subject:</b> [ofw] FW: fixing a system clock assert that is raised when the
receive function stays in DPC too much time<o:p></o:p></span></p>
</div>
</div>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Resend as original email bounced.</span><span style='font-size:
12.0pt;font-family:"Times New Roman","serif"'><o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>stan.</span><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'> <o:p></o:p></span></p>
<div class=MsoNormal align=center style='text-align:center'><span
style='font-size:12.0pt;font-family:"Times New Roman","serif"'>
<hr size=2 width="100%" align=center>
</span></div>
<p class=MsoNormal style='margin-bottom:12.0pt'><b><span style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'> Uri Habusha [mailto:urih@mellanox.co.il] <br>
<b>Sent:</b> Wednesday, August 25, 2010 8:12 AM<br>
<b>To:</b> ofw@lists.openfabrics.org<br>
<b>Subject:</b> fixing a system clock assert that is raised when the receive
function stays in DPC too much time</span><span style='font-size:12.0pt;
font-family:"Times New Roman","serif"'><o:p></o:p></span></p>
<p class=MsoNormal>The purpose of this check in is to fix a system clock assert
that is raised when the function stays in DPC too much time.<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>When
processing of receive packet in DPC take too much time the OS throw an assert
warning that too much time is spent in DPC and it may affect the system.<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>The
fix move the receive processing to a workitem. so the IPOIB give-up after some
time and return to process receive packet in workitem. that allows other DPCs
and workitems too run in parallel. <o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>Uri</span><o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_adapter.c<o:p></o:p></p>
<p class=MsoNormal>===================================================================<o:p></o:p></p>
<p class=MsoNormal>---
ulp/ipoib/kernel/ipoib_adapter.c (revision
6314)<o:p></o:p></p>
<p class=MsoNormal>+++ ulp/ipoib/kernel/ipoib_adapter.c
(working copy)<o:p></o:p></p>
<p class=MsoNormal>@@ -224,6 +224,9 @@<o:p></o:p></p>
<p class=MsoNormal>
}<o:p></o:p></p>
<p class=MsoNormal>
}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>+ NdisMGetDeviceProperty(h_adapter,
&p_adapter->pdo, NULL, NULL, NULL, NULL);<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(p_adapter->pdo != NULL);<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal>
p_adapter->p_stat = ipoib_st_dev_add();<o:p></o:p></p>
<p class=MsoNormal>
if ( p_adapter->p_stat ) <o:p></o:p></p>
<p class=MsoNormal>
p_adapter->p_stat->p_adapter = p_adapter;<o:p></o:p></p>
<p class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_adapter.h<o:p></o:p></p>
<p class=MsoNormal>===================================================================<o:p></o:p></p>
<p class=MsoNormal>---
ulp/ipoib/kernel/ipoib_adapter.h (revision 6314)<o:p></o:p></p>
<p class=MsoNormal>+++ ulp/ipoib/kernel/ipoib_adapter.h (working
copy)<o:p></o:p></p>
<p class=MsoNormal>@@ -150,6 +150,7 @@<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>
cl_obj_t
obj;<o:p></o:p></p>
<p class=MsoNormal>
NDIS_HANDLE
h_adapter;<o:p></o:p></p>
<p class=MsoNormal>+
PDEVICE_OBJECT pdo;<o:p></o:p></p>
<p class=MsoNormal>
ipoib_ifc_data_t
guids;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>
cl_list_item_t
entry;<o:p></o:p></p>
<p class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_port.c<o:p></o:p></p>
<p class=MsoNormal>===================================================================<o:p></o:p></p>
<p class=MsoNormal>---
ulp/ipoib/kernel/ipoib_port.c
(revision 6314)<o:p></o:p></p>
<p class=MsoNormal>+++
ulp/ipoib/kernel/ipoib_port.c
(working copy)<o:p></o:p></p>
<p class=MsoNormal>@@ -605,6 +605,8 @@<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>
__endpt_mgr_construct( p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>+
p_port->pPoWorkItem = NULL;<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal>
KeInitializeEvent( &p_port->sa_event, NotificationEvent, TRUE );<o:p></o:p></p>
<p class=MsoNormal>
KeInitializeEvent( &p_port->leave_mcast_event, NotificationEvent, TRUE
);<o:p></o:p></p>
<p class=MsoNormal>
<o:p></o:p></p>
<p class=MsoNormal>@@ -626,6 +628,12 @@<o:p></o:p></p>
<p class=MsoNormal>
p_port->port_num = p_pnp_rec->p_port_attr->port_num;<o:p></o:p></p>
<p class=MsoNormal>
p_port->p_adapter = p_adapter;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>+ p_port->pPoWorkItem =
IoAllocateWorkItem(p_adapter->pdo);<o:p></o:p></p>
<p class=MsoNormal>+
if( p_port->pPoWorkItem == NULL ) {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("IoAllocateWorkItem
returned NULL\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>
cl_status = cl_spinlock_init( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>
if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>
{<o:p></o:p></p>
<p class=MsoNormal>@@ -682,9 +690,6 @@<o:p></o:p></p>
<p class=MsoNormal>
return status;<o:p></o:p></p>
<p class=MsoNormal>
}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
KeInitializeDpc(&p_port->recv_dpc,(PKDEFERRED_ROUTINE)__recv_cb_dpc,p_port);<o:p></o:p></p>
<p class=MsoNormal>-<o:p></o:p></p>
<p class=MsoNormal>-<o:p></o:p></p>
<p class=MsoNormal>
/* Initialize multicast garbage collector timer and DPC object */<o:p></o:p></p>
<p class=MsoNormal>
KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);<o:p></o:p></p>
<p class=MsoNormal>
KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);<o:p></o:p></p>
<p class=MsoNormal>@@ -795,6 +800,7 @@<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>
cl_obj_deinit( p_obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>+ IoFreeWorkItem( p_port->pPoWorkItem
);<o:p></o:p></p>
<p class=MsoNormal>
cl_free( p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>@@ -1628,10 +1634,43 @@<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>+static BOOLEAN<o:p></o:p></p>
<p class=MsoNormal>+__recv_cb_internal(<o:p></o:p></p>
<p class=MsoNormal>+
IN
const ib_cq_handle_t
h_cq,<o:p></o:p></p>
<p class=MsoNormal>+
IN
void
*cq_context,<o:p></o:p></p>
<p class=MsoNormal>+
IN
uint32_t*
p_recv_cnt );<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal>-__recv_cb(<o:p></o:p></p>
<p class=MsoNormal>+__iopoib_WorkItem(<o:p></o:p></p>
<p class=MsoNormal>+
IN
DEVICE_OBJECT*
p_dev_obj,<o:p></o:p></p>
<p class=MsoNormal>+
IN
void*
context )<o:p></o:p></p>
<p class=MsoNormal>+{<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_t *p_port = ( ipoib_port_t* ) context;<o:p></o:p></p>
<p class=MsoNormal>+ int WorkToDo = true;<o:p></o:p></p>
<p class=MsoNormal>+ KIRQL irql;<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t recv_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t total_recv_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal>+
UNREFERENCED_PARAMETER(p_dev_obj);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ while (WorkToDo && total_recv_cnt
< 512) {<o:p></o:p></p>
<p class=MsoNormal>+ irql =
KeRaiseIrqlToDpcLevel();<o:p></o:p></p>
<p class=MsoNormal>+ WorkToDo =
__recv_cb_internal(NULL, p_port, &recv_cnt);<o:p></o:p></p>
<p class=MsoNormal>+
KeLowerIrql(irql);<o:p></o:p></p>
<p class=MsoNormal>+ total_recv_cnt
+= recv_cnt;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal>+ if (WorkToDo) {<o:p></o:p></p>
<p class=MsoNormal>+ IoQueueWorkItem(
p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue, p_port);<o:p></o:p></p>
<p class=MsoNormal>+
} <o:p></o:p></p>
<p class=MsoNormal>+}<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal>+static BOOLEAN<o:p></o:p></p>
<p class=MsoNormal>+__recv_cb_internal(<o:p></o:p></p>
<p class=MsoNormal>
IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></p>
<p class=MsoNormal>-
IN
void
*cq_context )<o:p></o:p></p>
<p class=MsoNormal>+
IN
void
*cq_context,<o:p></o:p></p>
<p class=MsoNormal>+
IN
uint32_t*
p_recv_cnt)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>
ipoib_port_t
*p_port;<o:p></o:p></p>
<p class=MsoNormal>
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>@@ -1639,6 +1678,8 @@<o:p></o:p></p>
<p class=MsoNormal>
int32_t
pkt_cnt, recv_cnt = 0, shortage, discarded;<o:p></o:p></p>
<p class=MsoNormal>
cl_qlist_t
done_list, bad_list;<o:p></o:p></p>
<p class=MsoNormal>
size_t
i;<o:p></o:p></p>
<p class=MsoNormal>+ BOOLEAN WorkToDo = FALSE;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>
PERF_DECLARE( RecvCompBundle );<o:p></o:p></p>
<p class=MsoNormal>
PERF_DECLARE( RecvCb );<o:p></o:p></p>
<p class=MsoNormal>
PERF_DECLARE( PollRecv );<o:p></o:p></p>
<p class=MsoNormal>@@ -1655,8 +1696,6 @@<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>
cl_perf_start( RecvCb );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
UNUSED_PARAM( h_cq );<o:p></o:p></p>
<p class=MsoNormal>-<o:p></o:p></p>
<p class=MsoNormal>
p_port = (ipoib_port_t*)cq_context;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>
cl_qlist_init( &done_list );<o:p></o:p></p>
<p class=MsoNormal>@@ -1785,13 +1824,30 @@<o:p></o:p></p>
<p class=MsoNormal>
ipoib_port_deref( p_port, ref_recv_cb );<o:p></o:p></p>
<p class=MsoNormal>
} else {<o:p></o:p></p>
<p class=MsoNormal>
// Please note the reference is still up<o:p></o:p></p>
<p class=MsoNormal>-
KeInsertQueueDpc(&p_port->recv_dpc, NULL, NULL);<o:p></o:p></p>
<p class=MsoNormal>+ if (h_cq) {<o:p></o:p></p>
<p class=MsoNormal>+
IoQueueWorkItem( p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue,
p_port);<o:p></o:p></p>
<p class=MsoNormal>+
WorkToDo = FALSE;<o:p></o:p></p>
<p class=MsoNormal>+ } else {<o:p></o:p></p>
<p class=MsoNormal>+
WorkToDo = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>
}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>
cl_perf_stop( &p_port->p_adapter->perf, RecvCb );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ return WorkToDo;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+static void<o:p></o:p></p>
<p class=MsoNormal>+__recv_cb(<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></p>
<p class=MsoNormal>+
IN
void
*cq_context )<o:p></o:p></p>
<p class=MsoNormal>+{<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t recv_cnt;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ __recv_cb_internal(h_cq, cq_context,
&recv_cnt);<o:p></o:p></p>
<p class=MsoNormal>+}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_port.h<o:p></o:p></p>
<p class=MsoNormal>===================================================================<o:p></o:p></p>
<p class=MsoNormal>---
ulp/ipoib/kernel/ipoib_port.h
(revision 6314)<o:p></o:p></p>
<p class=MsoNormal>+++
ulp/ipoib/kernel/ipoib_port.h
(working copy)<o:p></o:p></p>
<p class=MsoNormal>@@ -502,8 +502,6 @@<o:p></o:p></p>
<p class=MsoNormal>
ipoib_recv_mgr_t
recv_mgr;<o:p></o:p></p>
<p class=MsoNormal>
ipoib_send_mgr_t
send_mgr;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
KDPC
recv_dpc;<o:p></o:p></p>
<p class=MsoNormal>-<o:p></o:p></p>
<p class=MsoNormal>
ipoib_endpt_mgr_t
endpt_mgr;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>
ipoib_endpt_t
*p_local_endpt;<o:p></o:p></p>
<p class=MsoNormal>@@ -520,6 +518,7 @@<o:p></o:p></p>
<p class=MsoNormal>
KTIMER
gc_timer;<o:p></o:p></p>
<p class=MsoNormal>
uint32_t
bc_join_retry_cnt;<o:p></o:p></p>
<p class=MsoNormal>
ib_net16_t
base_lid;<o:p></o:p></p>
<p class=MsoNormal>+
PIO_WORKITEM
pPoWorkItem;<o:p></o:p></p>
<p class=MsoNormal>
ipoib_hdr_t
hdr[1]; /* Must be last! */<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> }
ipoib_port_t;<o:p></o:p></p>
<p class=MsoNormal>Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp<o:p></o:p></p>
<p class=MsoNormal>===================================================================<o:p></o:p></p>
<p class=MsoNormal>---
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp
(revision 6314)<o:p></o:p></p>
<p class=MsoNormal>+++
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp
(working copy)<o:p></o:p></p>
<p class=MsoNormal>@@ -216,6 +216,9 @@<o:p></o:p></p>
<p class=MsoNormal>
}<o:p></o:p></p>
<p class=MsoNormal>
}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>+ NdisMGetDeviceProperty(h_adapter,
&p_adapter->pdo, NULL, NULL, NULL, NULL);<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(p_adapter->pdo != NULL);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>
p_adapter->p_stat = ipoib_st_dev_add();<o:p></o:p></p>
<p class=MsoNormal>
if ( p_adapter->p_stat ) <o:p></o:p></p>
<p class=MsoNormal>
p_adapter->p_stat->p_adapter = p_adapter;<o:p></o:p></p>
<p class=MsoNormal>Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h<o:p></o:p></p>
<p class=MsoNormal>===================================================================<o:p></o:p></p>
<p class=MsoNormal>--- ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h
(revision 6314)<o:p></o:p></p>
<p class=MsoNormal>+++
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h
(working copy)<o:p></o:p></p>
<p class=MsoNormal>@@ -185,6 +185,7 @@<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>
cl_obj_t
obj;<o:p></o:p></p>
<p class=MsoNormal>
NDIS_HANDLE
h_adapter;<o:p></o:p></p>
<p class=MsoNormal>+
PDEVICE_OBJECT pdo;<o:p></o:p></p>
<p class=MsoNormal>
ipoib_ifc_data_t
guids;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>
cl_list_item_t
entry;<o:p></o:p></p>
<p class=MsoNormal>Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp<o:p></o:p></p>
<p class=MsoNormal>===================================================================<o:p></o:p></p>
<p class=MsoNormal>---
ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp
(revision 6314)<o:p></o:p></p>
<p class=MsoNormal>+++
ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp
(working copy)<o:p></o:p></p>
<p class=MsoNormal>@@ -3126,7 +3126,7 @@<o:p></o:p></p>
<p class=MsoNormal>
if( p_adapter->state != IB_PNP_PORT_ACTIVE || !p_adapter->p_port )<o:p></o:p></p>
<p class=MsoNormal>
{<o:p></o:p></p>
<p class=MsoNormal>
cl_obj_unlock( &p_adapter->obj );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>
("Got send during port non-active, complete with error \n") );<o:p></o:p></p>
<p class=MsoNormal>
status = NDIS_STATUS_FAILURE; <o:p></o:p></p>
<p class=MsoNormal>
goto compl_status;<o:p></o:p></p>
<p class=MsoNormal>@@ -3172,7 +3172,7 @@<o:p></o:p></p>
<p class=MsoNormal> if (status != NDIS_STATUS_SUCCESS)<o:p></o:p></p>
<p class=MsoNormal>
{<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>
("Got bad status, g_NBL=%d, g_NBL_completed=%d \n", g_NBL,
g_NBL_complete) );<o:p></o:p></p>
<p class=MsoNormal>
send_complete_flags = 0;<o:p></o:p></p>
<p class=MsoNormal>
<o:p></o:p></p>
<p class=MsoNormal>Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp<o:p></o:p></p>
<p class=MsoNormal>===================================================================<o:p></o:p></p>
<p class=MsoNormal>---
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp
(revision 6314)<o:p></o:p></p>
<p class=MsoNormal>+++ ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp
(working copy)<o:p></o:p></p>
<p class=MsoNormal>@@ -58,50 +58,48 @@<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-ib_gid_t
bcast_mgid_template = {<o:p></o:p></p>
<p class=MsoNormal>-
0xff,
/* multicast field */<o:p></o:p></p>
<p class=MsoNormal>-
0x12,
/* scope (to be filled in) */<o:p></o:p></p>
<p class=MsoNormal>-
0x40,
0x1b,
/* IPv4 signature */<o:p></o:p></p>
<p class=MsoNormal>-
0xff,
0xff,
/* 16 bits of P_Key (to be filled in) */<o:p></o:p></p>
<p class=MsoNormal>-
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, /* 48 bits of
zeros */<o:p></o:p></p>
<p class=MsoNormal>-
0xff, 0xff, 0xff,
0xff,
/* 32 bit IPv4 broadcast address */<o:p></o:p></p>
<p class=MsoNormal>+ib_gid_t bcast_mgid_template = {<o:p></o:p></p>
<p class=MsoNormal>+
0xff,
/* multicast field */<o:p></o:p></p>
<p class=MsoNormal>+
0x12,
/* scope (to be filled in) */<o:p></o:p></p>
<p class=MsoNormal>+ 0x40,
0x1b,
/* IPv4 signature
*/<o:p></o:p></p>
<p class=MsoNormal>+ 0xff,
0xff,
/* 16 bits of P_Key (to be filled in) */<o:p></o:p></p>
<p class=MsoNormal>+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*
48 bits of zeros */<o:p></o:p></p>
<p class=MsoNormal>+ 0xff, 0xff, 0xff,
0xff,
/* 32 bit IPv4 broadcast address */<o:p></o:p></p>
<p class=MsoNormal> };<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #ifdef _DEBUG_<o:p></o:p></p>
<p class=MsoNormal> /* Handy pointer for debug use. */<o:p></o:p></p>
<p class=MsoNormal>-ipoib_port_t *gp_ipoib_port;<o:p></o:p></p>
<p class=MsoNormal>+ipoib_port_t *gp_ipoib_port;<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void __port_mcast_garbage_dpc(KDPC
*p_gc_dpc,void *context,void *s_arg1, void *s_arg2);<o:p></o:p></p>
<p class=MsoNormal>-static void __port_do_mcast_garbage(ipoib_port_t*
const p_port );<o:p></o:p></p>
<p class=MsoNormal>+static void __port_do_mcast_garbage(ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void
*s_arg1, void *s_arg2);<o:p></o:p></p>
<p class=MsoNormal>-<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal> #ifndef _IPOIB_DEBUG_NDIS6<o:p></o:p></p>
<p class=MsoNormal> #define _IPOIB_DEBUG_NDIS6<o:p></o:p></p>
<p class=MsoNormal> CL_INLINE void CL_API<o:p></o:p></p>
<p class=MsoNormal> cl_qlist_check_validity(<o:p></o:p></p>
<p class=MsoNormal>-
IN cl_qlist_t*
const
p_list )<o:p></o:p></p>
<p class=MsoNormal>+ IN cl_qlist_t* const
p_list )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
cl_list_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>-
size_t cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>+ cl_list_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>+ size_t cnt = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* CL_ASSERT that a non-null pointer is provided. */<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_list );<o:p></o:p></p>
<p class=MsoNormal>-
/* CL_ASSERT that the list was initialized. */<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_list->state == CL_INITIALIZED );<o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qlist_head(p_list);<o:p></o:p></p>
<p class=MsoNormal>-
while(p_item != cl_qlist_end(p_list)) {<o:p></o:p></p>
<p class=MsoNormal>-
++cnt;<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT(p_item->p_list == p_list);<o:p></o:p></p>
<p class=MsoNormal>-
p_item = p_item->p_next;<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT (cnt <= p_list->count);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT (cnt == p_list->count);<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>+ /* CL_ASSERT that a non-null pointer is
provided. */<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_list );<o:p></o:p></p>
<p class=MsoNormal>+ /* CL_ASSERT that the list was
initialized. */<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_list->state ==
CL_INITIALIZED );<o:p></o:p></p>
<p class=MsoNormal>+ p_item = cl_qlist_head(p_list);<o:p></o:p></p>
<p class=MsoNormal>+ while(p_item != cl_qlist_end(p_list)) {<o:p></o:p></p>
<p class=MsoNormal>+ ++cnt;<o:p></o:p></p>
<p class=MsoNormal>+
CL_ASSERT(p_item->p_list == p_list);<o:p></o:p></p>
<p class=MsoNormal>+ p_item =
p_item->p_next;<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT (cnt
<= p_list->count);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT (cnt == p_list->count);<o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal>@@ -112,34 +110,34 @@<o:p></o:p></p>
<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __port_construct(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __port_init(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_adapter_t* const
p_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_pnp_port_rec_t* const
p_pnp_rec );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_adapter_t* const p_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_pnp_port_rec_t* const p_pnp_rec );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __port_destroying(<o:p></o:p></p>
<p class=MsoNormal>-
IN
cl_obj_t* const
p_obj );<o:p></o:p></p>
<p class=MsoNormal>+
IN
cl_obj_t*
const
p_obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __port_cleanup(<o:p></o:p></p>
<p class=MsoNormal>-
IN
cl_obj_t* const
p_obj );<o:p></o:p></p>
<p class=MsoNormal>+
IN
cl_obj_t*
const
p_obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __port_free(<o:p></o:p></p>
<p class=MsoNormal>-
IN
cl_obj_t* const
p_obj );<o:p></o:p></p>
<p class=MsoNormal>+
IN
cl_obj_t*
const
p_obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __port_query_ca_attrs( <o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_ca_attr_t**
pp_ca_attrs );<o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
ib_ca_attr_t**
pp_ca_attrs );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __srq_async_event_cb(<o:p></o:p></p>
<p class=MsoNormal>-IN
ib_async_event_rec_t
*p_event_rec );<o:p></o:p></p>
<p class=MsoNormal>+IN
ib_async_event_rec_t *p_event_rec );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> /******************************************************************************<o:p></o:p></p>
<p class=MsoNormal> *<o:p></o:p></p>
<p class=MsoNormal>@@ -148,27 +146,27 @@<o:p></o:p></p>
<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __ib_mgr_construct(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __ib_mgr_init(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __ib_mgr_destroy(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __qp_event(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_async_event_rec_t
*p_event_rec );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_async_event_rec_t *p_event_rec );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __cq_event(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_async_event_rec_t
*p_event_rec );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_async_event_rec_t *p_event_rec );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __ib_mgr_activate(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> /******************************************************************************<o:p></o:p></p>
<p class=MsoNormal> *<o:p></o:p></p>
<p class=MsoNormal>@@ -177,58 +175,58 @@<o:p></o:p></p>
<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_construct(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_init(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_destroy(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static cl_status_t<o:p></o:p></p>
<p class=MsoNormal> __recv_ctor(<o:p></o:p></p>
<p class=MsoNormal>-
IN
void* const
p_object,<o:p></o:p></p>
<p class=MsoNormal>-
IN
void*
context,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
cl_pool_item_t**
const
pp_pool_item );<o:p></o:p></p>
<p class=MsoNormal>+
IN
void*
const
p_object,<o:p></o:p></p>
<p class=MsoNormal>+
IN
void*
context,<o:p></o:p></p>
<p class=MsoNormal>+
OUT cl_pool_item_t**
const pp_pool_item );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #if !IPOIB_INLINE_RECV<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __recv_dtor(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const cl_pool_item_t*
const
p_pool_item,<o:p></o:p></p>
<p class=MsoNormal>-
IN
void
*context );<o:p></o:p></p>
<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+ IN
const cl_pool_item_t* const
p_pool_item,<o:p></o:p></p>
<p class=MsoNormal>+
IN
void
*context );<o:p></o:p></p>
<p class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline ipoib_send_desc_t*<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_get_send(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline void<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_put_send(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_send_desc_t* const
p_desc );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_send_desc_t* const p_desc );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline ipoib_recv_desc_t*<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_get_recv(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline void<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_put_recv(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_recv_desc_t* const
p_desc,<o:p></o:p></p>
<p class=MsoNormal>-
IN
NET_BUFFER_LIST* const
p_net_buffer_list OPTIONAL );<o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_port_t*
const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc,<o:p></o:p></p>
<p class=MsoNormal>+
IN
NET_BUFFER_LIST* const p_net_buffer_list OPTIONAL
);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline void<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_put_recv_list(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
cl_qlist_t* const
p_list );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
cl_qlist_t* const
p_list );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> //NDIS60<o:p></o:p></p>
<p class=MsoNormal> static inline NET_BUFFER_LIST*<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_get_NBL(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_recv_desc_t*
const p_desc
);<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> /******************************************************************************<o:p></o:p></p>
<p class=MsoNormal>@@ -238,76 +236,76 @@<o:p></o:p></p>
<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __recv_mgr_construct(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __recv_mgr_init(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __recv_mgr_destroy(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> /* Posts receive buffers to the receive queue. */<o:p></o:p></p>
<p class=MsoNormal> int32_t<o:p></o:p></p>
<p class=MsoNormal> __recv_mgr_repost(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __recv_cb(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></p>
<p class=MsoNormal>-
IN
void
*cq_context );<o:p></o:p></p>
<p class=MsoNormal>+ IN const
ib_cq_handle_t
h_cq,<o:p></o:p></p>
<p class=MsoNormal>+
IN
void
*cq_context );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __recv_get_endpts(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_recv_desc_t* const
p_desc,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_wc_t* const
p_wc,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
ipoib_endpt_t**
const
pp_src,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
ipoib_endpt_t**
const
pp_dst );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_wc_t*
const
p_wc,<o:p></o:p></p>
<p class=MsoNormal>+
OUT ipoib_endpt_t**
const pp_src,<o:p></o:p></p>
<p class=MsoNormal>+ OUT
ipoib_endpt_t** const pp_dst );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static int32_t<o:p></o:p></p>
<p class=MsoNormal> __recv_mgr_filter(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_wc_t*
const
p_done_wc_list,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
cl_qlist_t*
const
p_done_list,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
cl_qlist_t*
const
p_bad_list );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_wc_t*
const
p_done_wc_list,<o:p></o:p></p>
<p class=MsoNormal>+
OUT
cl_qlist_t* const
p_done_list,<o:p></o:p></p>
<p class=MsoNormal>+
OUT cl_qlist_t*
const p_bad_list );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __recv_gen(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
eth_pkt_t*
const
p_eth,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t* const
p_src,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t* const
p_dst );<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ipoib_pkt_t*
const p_ipoib,<o:p></o:p></p>
<p class=MsoNormal>+
OUT eth_pkt_t*
const p_eth,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_src,<o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_endpt_t*
const p_dst );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __recv_dhcp(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
eth_pkt_t*
const
p_eth,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t* const
p_src,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_dst );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ipoib_pkt_t*
const p_ipoib,<o:p></o:p></p>
<p class=MsoNormal>+
OUT eth_pkt_t* const
p_eth,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_src,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_dst );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __recv_arp(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_wc_t* const
p_wc,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
eth_pkt_t*
const
p_eth,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t** const
p_src,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t* const
p_dst );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_wc_t*
const
p_wc,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ipoib_pkt_t*
const p_ipoib,<o:p></o:p></p>
<p class=MsoNormal>+
OUT eth_pkt_t*
const p_eth,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t** const p_src,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_dst );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __recv_mgr_prepare_NBL(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_recv_desc_t*
const p_desc,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
NET_BUFFER_LIST**
const
pp_net_buffer_list );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc,<o:p></o:p></p>
<p class=MsoNormal>+
OUT NET_BUFFER_LIST**
const pp_net_buffer_list );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static uint32_t<o:p></o:p></p>
<p class=MsoNormal> __recv_mgr_build_NBL_array(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
cl_qlist_t*
p_done_list,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
int32_t*
const
p_discarded );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
OUT
cl_qlist_t*
p_done_list,<o:p></o:p></p>
<p class=MsoNormal>+
OUT int32_t*
const
p_discarded );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> /******************************************************************************<o:p></o:p></p>
<p class=MsoNormal> *<o:p></o:p></p>
<p class=MsoNormal>@@ -316,128 +314,128 @@<o:p></o:p></p>
<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_construct(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_init(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_destroy(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_gen(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_send_NB_SG *
s_buf,<o:p></o:p></p>
<p class=MsoNormal>-
IN
INT
lso_data_index,<o:p></o:p></p>
<p class=MsoNormal>-
IN
UINT
lso_header_size OPTIONAL);<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_send_NB_SG * s_buf,<o:p></o:p></p>
<p class=MsoNormal>+
IN
INT
lso_data_index,<o:p></o:p></p>
<p class=MsoNormal>+
IN
UINT
lso_header_size OPTIONAL);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_filter_ip(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>-
IN
OUT
ipoib_send_NB_SG*
const
s_buf);<o:p></o:p></p>
<p class=MsoNormal>+ IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+ IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>+ IN
OUT ipoib_send_NB_SG*
const s_buf);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_filter_igmp_v2(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
IN
size_t
iph_options_size,<o:p></o:p></p>
<p class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
IN
size_t
buf_len );<o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_port_t*
const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
IN
size_t
iph_options_size,<o:p></o:p></p>
<p class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+
IN
size_t
buf_len );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_filter_udp(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>-
IN
OUT
ipoib_send_NB_SG*
const
s_buf);<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ip_hdr_t* const
p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>+ IN
OUT ipoib_send_NB_SG*
const s_buf);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_filter_dhcp(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const udp_hdr_t*
const
p_udp_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>-
IN
OUT
ipoib_send_NB_SG*
const
s_buf );<o:p></o:p></p>
<p class=MsoNormal>+ IN
const udp_hdr_t*
const
p_udp_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>+ IN
OUT ipoib_send_NB_SG*
const s_buf );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_filter_arp(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>-
IN
OUT
ipoib_send_NB_SG*
const
s_buf );<o:p></o:p></p>
<p class=MsoNormal>+ IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>+ IN
OUT ipoib_send_NB_SG*
const s_buf );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline void <o:p></o:p></p>
<p class=MsoNormal> __send_complete_net_buffer(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_send_NB_SG *s_buf, <o:p></o:p></p>
<p class=MsoNormal>-
IN NDIS_STATUS
status,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ULONG
compl_flags,<o:p></o:p></p>
<p class=MsoNormal>-
IN
boolean_t
bLock );<o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_send_NB_SG *s_buf, <o:p></o:p></p>
<p class=MsoNormal>+ IN
NDIS_STATUS status,<o:p></o:p></p>
<p class=MsoNormal>+ IN ULONG
compl_flags,<o:p></o:p></p>
<p class=MsoNormal>+ IN
boolean_t
bLock );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_queue(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
eth_hdr_t* const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
ipoib_endpt_t** const
pp_endpt );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
OUT ipoib_endpt_t**
const pp_endpt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __build_send_desc(<o:p></o:p></p>
<p class=MsoNormal>-
IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
IN
MDL* const
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
size_t
mdl_len,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_send_NB_SG
*s_buf);<o:p></o:p></p>
<p class=MsoNormal>+
IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
IN
MDL*
const
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
size_t
mdl_len,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_send_NB_SG
*s_buf);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __send_cb(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></p>
<p class=MsoNormal>-
IN
void
*cq_context );<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></p>
<p class=MsoNormal>+
IN
void
*cq_context );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS <o:p></o:p></p>
<p class=MsoNormal> GetLsoHeaderSize(<o:p></o:p></p>
<p class=MsoNormal>-
IN
PNET_BUFFER
pNetBuffer,<o:p></o:p></p>
<p class=MsoNormal>-
IN
LsoData
*pLsoData,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
UINT
*IndexOfData,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_hdr_t *ipoib_hdr );<o:p></o:p></p>
<p class=MsoNormal>+ IN
PNET_BUFFER pNetBuffer,<o:p></o:p></p>
<p class=MsoNormal>+ IN
LsoData *pLsoData,<o:p></o:p></p>
<p class=MsoNormal>+ OUT
UINT
*IndexOfData,<o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_hdr_t *ipoib_hdr );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __build_lso_desc(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ULONG
mss,<o:p></o:p></p>
<p class=MsoNormal>-
IN
int32_t
hdr_idx,<o:p></o:p></p>
<p class=MsoNormal>-
IN PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info,<o:p></o:p></p>
<p class=MsoNormal>-
IN
NET_BUFFER
*p_netbuf);<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ULONG
mss,<o:p></o:p></p>
<p class=MsoNormal>+
IN
int32_t
hdr_idx,<o:p></o:p></p>
<p class=MsoNormal>+ IN PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO
p_lso_info,<o:p></o:p></p>
<p class=MsoNormal>+
IN
NET_BUFFER
*p_netbuf);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> //TODO CM Restore<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_fragments(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_send_desc_t*
const
p_desc,<o:p></o:p></p>
<p class=MsoNormal>-
IN
eth_hdr_t* const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ip_hdr_t* const
p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
IN
uint32_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>-
IN
NDIS_BUFFER*
p_ndis_buf );<o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_send_desc_t*
const p_desc,<o:p></o:p></p>
<p class=MsoNormal>+ IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>+ IN
ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>+ IN
uint32_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>+ IN
NDIS_BUFFER*
p_ndis_buf );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __update_fragment_ip_hdr(<o:p></o:p></p>
<p class=MsoNormal>-IN
ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>-IN
uint16_t
fragment_size, <o:p></o:p></p>
<p class=MsoNormal>-IN
uint16_t
fragment_offset, <o:p></o:p></p>
<p class=MsoNormal>-IN
BOOLEAN
more_fragments );<o:p></o:p></p>
<p class=MsoNormal>+IN ip_hdr_t*
const p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>+IN
uint16_t
fragment_size, <o:p></o:p></p>
<p class=MsoNormal>+IN
uint16_t
fragment_offset, <o:p></o:p></p>
<p class=MsoNormal>+IN
BOOLEAN
more_fragments );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __copy_ip_options(<o:p></o:p></p>
<p class=MsoNormal>-IN
uint8_t*
p_buf,<o:p></o:p></p>
<p class=MsoNormal>-IN
uint8_t*
p_options,<o:p></o:p></p>
<p class=MsoNormal>-IN
uint32_t
options_len,<o:p></o:p></p>
<p class=MsoNormal>-IN
BOOLEAN
copy_all );<o:p></o:p></p>
<p class=MsoNormal>+IN
uint8_t*
p_buf,<o:p></o:p></p>
<p class=MsoNormal>+IN
uint8_t*
p_options,<o:p></o:p></p>
<p class=MsoNormal>+IN uint32_t
options_len,<o:p></o:p></p>
<p class=MsoNormal>+IN
BOOLEAN
copy_all );<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> /******************************************************************************<o:p></o:p></p>
<p class=MsoNormal> *<o:p></o:p></p>
<p class=MsoNormal>@@ -446,85 +444,85 @@<o:p></o:p></p>
<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_construct(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_init(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_destroy(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> /****f* IPoIB/__endpt_mgr_remove_all<o:p></o:p></p>
<p class=MsoNormal> * NAME<o:p></o:p></p>
<p class=MsoNormal>-*
__endpt_mgr_remove_all<o:p></o:p></p>
<p class=MsoNormal>+* __endpt_mgr_remove_all<o:p></o:p></p>
<p class=MsoNormal> *<o:p></o:p></p>
<p class=MsoNormal> * DESCRIPTION<o:p></o:p></p>
<p class=MsoNormal>-*
Removes all enpoints from the port, dereferencing them to initiate<o:p></o:p></p>
<p class=MsoNormal>-*
destruction.<o:p></o:p></p>
<p class=MsoNormal>+* Removes all enpoints from the port, dereferencing
them to initiate<o:p></o:p></p>
<p class=MsoNormal>+* destruction.<o:p></o:p></p>
<p class=MsoNormal> *<o:p></o:p></p>
<p class=MsoNormal> * SYNOPSIS<o:p></o:p></p>
<p class=MsoNormal> */<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_remove_all(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> /*<o:p></o:p></p>
<p class=MsoNormal> ********/<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_remove(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_endpt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_reset_all(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_ref(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
ipoib_endpt_t**
const
pp_endpt );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>+
OUT ipoib_endpt_t**
const pp_endpt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_get_gid_qpn(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
ib_gid_t* const
p_gid,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
UNALIGNED net32_t* const p_qpn );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>+
OUT ib_gid_t*
const
p_gid,<o:p></o:p></p>
<p class=MsoNormal>+
OUT UNALIGNED net32_t*
const p_qpn );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline ipoib_endpt_t*<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_get_by_gid(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const ib_gid_t*
const
p_gid );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ib_gid_t*
const
p_gid );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline ipoib_endpt_t*<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_get_by_lid(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
net16_t
lid );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const net16_t
lid );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_insert_locked(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t* const
p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_endpt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_insert(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_endpt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_add_local(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_port_info_t* const
p_port_info );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_port_info_t* const p_port_info );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_add_bcast(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_mcast_rec_t
*p_mcast_rec );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_mcast_rec_t
*p_mcast_rec );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> /******************************************************************************<o:p></o:p></p>
<p class=MsoNormal> *<o:p></o:p></p>
<p class=MsoNormal>@@ -533,85 +531,85 @@<o:p></o:p></p>
<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __port_get_bcast(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __port_join_bcast(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_member_rec_t* const
p_member_rec );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_member_rec_t* const p_member_rec );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __port_create_bcast(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port );<o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_port_t* const p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __bcast_get_cb(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_query_rec_t
*p_query_rec );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_query_rec_t
*p_query_rec );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __bcast_cb(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_mcast_rec_t
*p_mcast_rec );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_mcast_rec_t
*p_mcast_rec );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __mcast_cb(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_mcast_rec_t
*p_mcast_rec );<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_mcast_rec_t
*p_mcast_rec );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> void<o:p></o:p></p>
<p class=MsoNormal> __leave_error_mcast_cb(<o:p></o:p></p>
<p class=MsoNormal>-
IN
void
*context );<o:p></o:p></p>
<p class=MsoNormal>+
IN
void
*context );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static int<o:p></o:p></p>
<p class=MsoNormal> __gid_cmp(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const void*
const
p_key1,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const void*
const
p_key2 )<o:p></o:p></p>
<p class=MsoNormal>+ IN
const void*
const
p_key1,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const void*
const
p_key2 )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
return cl_memcmp( p_key1, p_key2, sizeof(ib_gid_t) );<o:p></o:p></p>
<p class=MsoNormal>+ return cl_memcmp( p_key1, p_key2,
sizeof(ib_gid_t) );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> inline void ipoib_port_ref( ipoib_port_t * p_port, int
type )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_ref( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_ref( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> #if DBG<o:p></o:p></p>
<p class=MsoNormal>-
cl_atomic_inc( &p_port->ref[type % ref_mask] );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></p>
<p class=MsoNormal>-
("Port[%d] refcount raised to %d\n", p_port->port_num,
p_port->obj.ref_cnt));<o:p></o:p></p>
<p class=MsoNormal>+ cl_atomic_inc( &p_port->ref[type
% ref_mask] );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></p>
<p class=MsoNormal>+
("Port[%d] refcount raised to %d\n", p_port->port_num,
p_port->obj.ref_cnt));<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if ((p_port->obj.ref_cnt % 20)==0)<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></p>
<p class=MsoNormal>-
("ref type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></p>
<p class=MsoNormal>+ if ((p_port->obj.ref_cnt % 20)==0)<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></p>
<p class=MsoNormal>+ ("ref type
%d ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></p>
<p class=MsoNormal> #else<o:p></o:p></p>
<p class=MsoNormal>-
UNREFERENCED_PARAMETER(type);<o:p></o:p></p>
<p class=MsoNormal>+ UNREFERENCED_PARAMETER(type);<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> inline void ipoib_port_deref(ipoib_port_t * p_port,
int type)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_deref( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_deref( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> #if DBG<o:p></o:p></p>
<p class=MsoNormal>-
cl_atomic_dec( &p_port->ref[type % ref_mask] );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></p>
<p class=MsoNormal>-
("Port[%d] refcount decremented to %d\n", p_port->port_num,
p_port->obj.ref_cnt));<o:p></o:p></p>
<p class=MsoNormal>-
if ((p_port->obj.ref_cnt % 20) == 0)<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></p>
<p class=MsoNormal>-
("deref type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></p>
<p class=MsoNormal>+ cl_atomic_dec( &p_port->ref[type
% ref_mask] );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></p>
<p class=MsoNormal>+
("Port[%d] refcount decremented to %d\n", p_port->port_num,
p_port->obj.ref_cnt));<o:p></o:p></p>
<p class=MsoNormal>+ if ((p_port->obj.ref_cnt % 20) == 0)<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></p>
<p class=MsoNormal>+ ("deref
type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></p>
<p class=MsoNormal> #else<o:p></o:p></p>
<p class=MsoNormal>-
UNREFERENCED_PARAMETER(type);<o:p></o:p></p>
<p class=MsoNormal>+ UNREFERENCED_PARAMETER(type);<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> /* function returns pointer to payload that is going
after IP header.<o:p></o:p></p>
<p class=MsoNormal> * asssuming that payload and IP header are in
the same buffer<o:p></o:p></p>
<p class=MsoNormal> */<o:p></o:p></p>
<p class=MsoNormal>-static void*
GetIpPayloadPtr(const ip_hdr_t*
const
p_ip_hdr)<o:p></o:p></p>
<p class=MsoNormal>+static void* GetIpPayloadPtr(const ip_hdr_t* const
p_ip_hdr)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
return (void*)((uint8_t*)p_ip_hdr + IP_HEADER_LENGTH(p_ip_hdr));<o:p></o:p></p>
<p class=MsoNormal>+ return (void*)((uint8_t*)p_ip_hdr +
IP_HEADER_LENGTH(p_ip_hdr));<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> /******************************************************************************<o:p></o:p></p>
<p class=MsoNormal>@@ -621,316 +619,324 @@<o:p></o:p></p>
<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>
<p class=MsoNormal> ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> ipoib_create_port(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_adapter_t* const
p_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_pnp_port_rec_t* const
p_pnp_rec,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
ipoib_port_t** const
pp_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_adapter_t* const p_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_pnp_port_rec_t* const p_pnp_rec,<o:p></o:p></p>
<p class=MsoNormal>+
OUT ipoib_port_t**
const pp_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( !p_adapter->p_port );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( !p_adapter->p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port = (ipoib_port_t *) cl_zalloc( sizeof(ipoib_port_t) +<o:p></o:p></p>
<p class=MsoNormal>-
(sizeof(ipoib_hdr_t) * (p_adapter->params.sq_depth - 1)) );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_port )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to allocate ipoib_port_t (%d bytes)\n",<o:p></o:p></p>
<p class=MsoNormal>-
sizeof(ipoib_port_t)) );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ p_port = (ipoib_port_t *) cl_zalloc(
sizeof(ipoib_port_t) +<o:p></o:p></p>
<p class=MsoNormal>+
(sizeof(ipoib_hdr_t) * (p_adapter->params.sq_depth - 1)) );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_port )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to allocate ipoib_port_t (%d bytes)\n",<o:p></o:p></p>
<p class=MsoNormal>+
sizeof(ipoib_port_t)) );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #ifdef _DEBUG_<o:p></o:p></p>
<p class=MsoNormal>-
gp_ipoib_port = p_port;<o:p></o:p></p>
<p class=MsoNormal>+ gp_ipoib_port = p_port;<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
__port_construct( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ __port_construct( p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
status = __port_init( p_port, p_adapter, p_pnp_rec );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ipoib_port_init returned %s.\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
__port_cleanup( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
__port_free( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ status = __port_init( p_port, p_adapter,
p_pnp_rec );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ipoib_port_init returned %s.\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ __port_cleanup(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ __port_free(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
*pp_port = p_port;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ *pp_port = p_port;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> void<o:p></o:p></p>
<p class=MsoNormal> ipoib_port_destroy(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( !p_port->p_adapter->p_port );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
!p_port->p_adapter->p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_destroy( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_destroy( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __port_construct(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port->state = IB_QPS_RESET;<o:p></o:p></p>
<p class=MsoNormal>+ p_port->state = IB_QPS_RESET;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_construct( &p_port->obj, IPOIB_OBJ_PORT );<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_construct( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_construct( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>-
__ib_mgr_construct( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
__buf_mgr_construct( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_construct( &p_port->obj,
IPOIB_OBJ_PORT );<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_construct(
&p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_construct(
&p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+ __ib_mgr_construct( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ __buf_mgr_construct( p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
__recv_mgr_construct( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
__send_mgr_construct( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ __recv_mgr_construct( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ __send_mgr_construct( p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_construct( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ __endpt_mgr_construct( p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
KeInitializeEvent( &p_port->sa_event, NotificationEvent, TRUE );<o:p></o:p></p>
<p class=MsoNormal>-
KeInitializeEvent( &p_port->leave_mcast_event, NotificationEvent, TRUE
);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ p_port->pPoWorkItem = NULL;<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal>+ KeInitializeEvent(
&p_port->sa_event, NotificationEvent, TRUE );<o:p></o:p></p>
<p class=MsoNormal>+ KeInitializeEvent(
&p_port->leave_mcast_event, NotificationEvent, TRUE );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __port_init(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_adapter_t* const
p_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_pnp_port_rec_t* const
p_pnp_rec )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_adapter_t* const p_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_pnp_port_rec_t* const p_pnp_rec )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
cl_status_t
cl_status;<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+
cl_status_t cl_status;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port->port_num = p_pnp_rec->p_port_attr->port_num;<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter = p_adapter;<o:p></o:p></p>
<p class=MsoNormal>+ p_port->port_num =
p_pnp_rec->p_port_attr->port_num;<o:p></o:p></p>
<p class=MsoNormal>+ p_port->p_adapter = p_adapter;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_status = cl_spinlock_init( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ p_port->pPoWorkItem =
IoAllocateWorkItem(p_adapter->pdo);<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->pPoWorkItem == NULL
) {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("IoAllocateWorkItem returned NULL\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_status = cl_spinlock_init( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ cl_status = cl_spinlock_init(
&p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+ if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Initialize the IB resource manager. */<o:p></o:p></p>
<p class=MsoNormal>-
status = __ib_mgr_init( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__ib_mgr_init returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ cl_status = cl_spinlock_init(
&p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+ if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Initialize the buffer manager. */<o:p></o:p></p>
<p class=MsoNormal>-
status = __buf_mgr_init( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__buf_mgr_init returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Initialize the IB resource manager.
*/<o:p></o:p></p>
<p class=MsoNormal>+ status = __ib_mgr_init( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__ib_mgr_init returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Initialize the receive manager. */<o:p></o:p></p>
<p class=MsoNormal>-
status = __recv_mgr_init( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__recv_mgr_init returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
status =__send_mgr_init( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__send_mgr_init returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Initialize the buffer manager. */<o:p></o:p></p>
<p class=MsoNormal>+ status = __buf_mgr_init( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__buf_mgr_init returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Initialize the endpoint manager. */<o:p></o:p></p>
<p class=MsoNormal>-
status = __endpt_mgr_init( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__endpt_mgr_init returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Initialize the receive manager. */<o:p></o:p></p>
<p class=MsoNormal>+ status = __recv_mgr_init( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__recv_mgr_init returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ status =__send_mgr_init( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__send_mgr_init returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
KeInitializeDpc(&p_port->recv_dpc,(PKDEFERRED_ROUTINE)__recv_cb_dpc,p_port);<o:p></o:p></p>
<p class=MsoNormal>+ /* Initialize the endpoint manager. */<o:p></o:p></p>
<p class=MsoNormal>+ status = __endpt_mgr_init( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__endpt_mgr_init returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>+ /* Initialize multicast garbage
collector timer and DPC object */<o:p></o:p></p>
<p class=MsoNormal>+
KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);<o:p></o:p></p>
<p class=MsoNormal>+
KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Initialize multicast garbage collector timer and DPC object */<o:p></o:p></p>
<p class=MsoNormal>-
KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);<o:p></o:p></p>
<p class=MsoNormal>-
KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);<o:p></o:p></p>
<p class=MsoNormal>+ /* We only ever destroy from the PnP
callback thread. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_status = cl_obj_init(
&p_port->obj, CL_DESTROY_SYNC,<o:p></o:p></p>
<p class=MsoNormal>+
__port_destroying, __port_cleanup, __port_free );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* We only ever destroy from the PnP callback thread. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_status = cl_obj_init( &p_port->obj, CL_DESTROY_SYNC,<o:p></o:p></p>
<p class=MsoNormal>-
__port_destroying, __port_cleanup, __port_free );<o:p></o:p></p>
<p class=MsoNormal>-<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal>-
cl_atomic_inc( &p_port->ref[ref_init] );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></p>
<p class=MsoNormal>-
("ref type %d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></p>
<p class=MsoNormal>+ cl_atomic_inc(
&p_port->ref[ref_init] );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></p>
<p class=MsoNormal>+ ("ref type
%d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("cl_obj_init returned %#x\n", cl_status) );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("cl_obj_init returned %#x\n", cl_status) );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_status = cl_obj_insert_rel( &p_port->rel, &p_adapter->obj,
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("cl_obj_insert_rel returned %#x\n", cl_status) );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_destroy( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ cl_status = cl_obj_insert_rel(
&p_port->rel, &p_adapter->obj, &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("cl_obj_insert_rel
returned %#x\n", cl_status) );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_destroy(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal>-
cl_atomic_inc( &p_port->ref[ref_init] );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_OBJ,<o:p></o:p></p>
<p class=MsoNormal>-
("ref type %d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></p>
<p class=MsoNormal>+ cl_atomic_inc(
&p_port->ref[ref_init] );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_ERROR,
IPOIB_DBG_OBJ,<o:p></o:p></p>
<p class=MsoNormal>+ ("ref type
%d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
// The port is started as paused and NDIS calls latter to ipoib_restart. We<o:p></o:p></p>
<p class=MsoNormal>-
// shut the recv_shuter for now and alive it on ipoib_restart. We did<o:p></o:p></p>
<p class=MsoNormal>-
// it in this way since MpInitializeInternal also calls in reset and than<o:p></o:p></p>
<p class=MsoNormal>-
// we need to set the rec ref count to 1 //TODO !!!!!!!!!!1<o:p></o:p></p>
<p class=MsoNormal>-
//<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if ( p_adapter->ipoib_state == IPOIB_INIT) {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>-
("Shutter shut, state = %d\n", p_adapter->ipoib_state));<o:p></o:p></p>
<p class=MsoNormal>-
shutter_shut ( &p_adapter->recv_shutter );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>-
("*****Shutter wasn't shut, state = %d*****\n", p_adapter->ipoib_state));<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ // The port is started as paused and
NDIS calls latter to ipoib_restart. We<o:p></o:p></p>
<p class=MsoNormal>+ // shut the recv_shuter for now and
alive it on ipoib_restart. We did<o:p></o:p></p>
<p class=MsoNormal>+ // it in this way since
MpInitializeInternal also calls in reset and than<o:p></o:p></p>
<p class=MsoNormal>+ // we need to set the rec ref count to 1
//TODO !!!!!!!!!!1<o:p></o:p></p>
<p class=MsoNormal>+ //<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if ( p_adapter->ipoib_state ==
IPOIB_INIT) {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>+ ("Shutter
shut, state = %d\n", p_adapter->ipoib_state));<o:p></o:p></p>
<p class=MsoNormal>+ shutter_shut (
&p_adapter->recv_shutter );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_WARNING, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>+
("*****Shutter wasn't shut, state = %d*****\n",
p_adapter->ipoib_state));<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __port_destroying(<o:p></o:p></p>
<p class=MsoNormal>-
IN
cl_obj_t* const
p_obj )<o:p></o:p></p>
<p class=MsoNormal>+
IN
cl_obj_t*
const
p_obj )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t *p_port;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_t *p_port;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_obj );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );<o:p></o:p></p>
<p class=MsoNormal>+ p_port = PARENT_STRUCT( p_obj,
ipoib_port_t, obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_down( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_down( p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_remove_all( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ __endpt_mgr_remove_all( p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
endpt_cm_buf_mgr_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_srq_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->endpt_mgr.thread_is_done = 1;<o:p></o:p></p>
<p class=MsoNormal>-
cl_event_signal( &p_port->endpt_mgr.event );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
endpt_cm_buf_mgr_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_srq_destroy(
p_port );<o:p></o:p></p>
<p class=MsoNormal>+
p_port->endpt_mgr.thread_is_done = 1;<o:p></o:p></p>
<p class=MsoNormal>+ cl_event_signal(
&p_port->endpt_mgr.event );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_resume( p_port, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></p>
<p class=MsoNormal>+
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_resume( p_port, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __port_cleanup(<o:p></o:p></p>
<p class=MsoNormal>-
IN
cl_obj_t* const
p_obj )<o:p></o:p></p>
<p class=MsoNormal>+
IN
cl_obj_t*
const
p_obj )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t *p_port;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_t *p_port;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_obj );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );<o:p></o:p></p>
<p class=MsoNormal>+ p_port = PARENT_STRUCT( p_obj,
ipoib_port_t, obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Wait for all sends and receives to get flushed. */<o:p></o:p></p>
<p class=MsoNormal>-
while( p_port->send_mgr.depth || p_port->recv_mgr.depth )<o:p></o:p></p>
<p class=MsoNormal>-
cl_thread_suspend( 0 );<o:p></o:p></p>
<p class=MsoNormal>+ /* Wait for all sends and receives to
get flushed. */<o:p></o:p></p>
<p class=MsoNormal>+ while( p_port->send_mgr.depth ||
p_port->recv_mgr.depth )<o:p></o:p></p>
<p class=MsoNormal>+
cl_thread_suspend( 0 );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Destroy the send and receive managers before closing the CA. */<o:p></o:p></p>
<p class=MsoNormal>-
__ib_mgr_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ /* Destroy the send and receive managers
before closing the CA. */<o:p></o:p></p>
<p class=MsoNormal>+ __ib_mgr_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __port_free(<o:p></o:p></p>
<p class=MsoNormal>-
IN
cl_obj_t* const
p_obj )<o:p></o:p></p>
<p class=MsoNormal>+
IN
cl_obj_t*
const
p_obj )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t *p_port;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_t *p_port;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_obj );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );<o:p></o:p></p>
<p class=MsoNormal>+ p_port = PARENT_STRUCT( p_obj,
ipoib_port_t, obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
KeCancelTimer(&p_port->gc_timer);<o:p></o:p></p>
<p class=MsoNormal>-
KeFlushQueuedDpcs();<o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
__recv_mgr_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
__send_mgr_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
__buf_mgr_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ KeCancelTimer(&p_port->gc_timer);<o:p></o:p></p>
<p class=MsoNormal>+ KeFlushQueuedDpcs();<o:p></o:p></p>
<p class=MsoNormal>+ __endpt_mgr_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ __recv_mgr_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ __send_mgr_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ __buf_mgr_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_destroy( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_destroy( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_destroy(
&p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_destroy(
&p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_deinit( p_obj );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_ca_attrs )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_free ( p_port->p_ca_attrs );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_free( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_deinit( p_obj );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->p_ca_attrs )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_free (
p_port->p_ca_attrs );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IoFreeWorkItem( p_port->pPoWorkItem
);<o:p></o:p></p>
<p class=MsoNormal>+ cl_free( p_port );<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>@@ -942,338 +948,338 @@<o:p></o:p></p>
<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __ib_mgr_construct(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_memclr( &p_port->ib_mgr, sizeof(ipoib_ib_mgr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ cl_memclr( &p_port->ib_mgr,
sizeof(ipoib_ib_mgr_t) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __ib_mgr_init(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
ib_cq_create_t
cq_create;<o:p></o:p></p>
<p class=MsoNormal>-
ib_qp_create_t
qp_create;<o:p></o:p></p>
<p class=MsoNormal>-
ib_phys_create_t
phys_create;<o:p></o:p></p>
<p class=MsoNormal>-
ib_phys_range_t
phys_range;<o:p></o:p></p>
<p class=MsoNormal>-
uint64_t
vaddr;<o:p></o:p></p>
<p class=MsoNormal>-
net32_t
rkey;<o:p></o:p></p>
<p class=MsoNormal>-
ib_qp_attr_t
qp_attr;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+
ib_cq_create_t cq_create;<o:p></o:p></p>
<p class=MsoNormal>+ ib_qp_create_t
qp_create;<o:p></o:p></p>
<p class=MsoNormal>+ ib_phys_create_t
phys_create;<o:p></o:p></p>
<p class=MsoNormal>+ ib_phys_range_t
phys_range;<o:p></o:p></p>
<p class=MsoNormal>+
uint64_t
vaddr;<o:p></o:p></p>
<p class=MsoNormal>+
net32_t
rkey;<o:p></o:p></p>
<p class=MsoNormal>+
ib_qp_attr_t qp_attr;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Open the CA. */<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->open_ca(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->h_al, p_port->p_adapter->guids.ca_guid,<o:p></o:p></p>
<p class=MsoNormal>-
NULL, p_port, &p_port->ib_mgr.h_ca );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_OPEN_CA, 1, status );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_open_ca returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Open the CA. */<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->open_ca(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->h_al, p_port->p_adapter->guids.ca_guid,<o:p></o:p></p>
<p class=MsoNormal>+ NULL, p_port,
&p_port->ib_mgr.h_ca );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_OPEN_CA, 1, status );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_open_ca returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
status = __port_query_ca_attrs( p_port, &p_port->p_ca_attrs );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Query CA attributes failed\n" ) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ status = __port_query_ca_attrs( p_port,
&p_port->p_ca_attrs );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Query CA attributes failed\n" ) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t payload_mtu = __port_attr_to_mtu_size( <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_ca_attrs->p_port_attr[p_port->port_num - 1].mtu )<o:p></o:p></p>
<p class=MsoNormal>-
- sizeof(ipoib_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>-
/* adjust ipoib UD payload MTU to actual port MTU size.
*/<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->params.payload_mtu = <o:p></o:p></p>
<p class=MsoNormal>-
max( DEFAULT_PAYLOAD_MTU, payload_mtu );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->params.xfer_block_size = <o:p></o:p></p>
<p class=MsoNormal>-
(sizeof(eth_hdr_t) + p_port->p_adapter->params.payload_mtu);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t
payload_mtu = __port_attr_to_mtu_size( <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_ca_attrs->p_port_attr[p_port->port_num - 1].mtu )<o:p></o:p></p>
<p class=MsoNormal>+
- sizeof(ipoib_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>+ /* adjust ipoib
UD payload MTU to actual port MTU size. */<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->params.payload_mtu = <o:p></o:p></p>
<p class=MsoNormal>+
max( DEFAULT_PAYLOAD_MTU, payload_mtu );<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->params.xfer_block_size = <o:p></o:p></p>
<p class=MsoNormal>+
(sizeof(eth_hdr_t) + p_port->p_adapter->params.payload_mtu);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> #if IPOIB_USE_DMA<o:p></o:p></p>
<p class=MsoNormal>-
/* init DMA only once while running MiniportInitialize */<o:p></o:p></p>
<p class=MsoNormal>-
if ( !p_port->p_adapter->reset )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ULONG max_phys_mapping;<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
max_phys_mapping = p_port->p_adapter->params.cm_xfer_block_size;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else if( p_port->p_adapter->params.lso )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
max_phys_mapping = LARGE_SEND_OFFLOAD_SIZE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
max_phys_mapping = p_port->p_adapter->params.xfer_block_size;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/*if( NdisMInitializeScatterGatherDma( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
TRUE, max_phys_mapping )!= NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("NdisMInitializeScatterGatherDma failed\n" ) );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>-
}*/<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* init DMA only once while running
MiniportInitialize */<o:p></o:p></p>
<p class=MsoNormal>+ if ( !p_port->p_adapter->reset )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ ULONG
max_phys_mapping;<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
max_phys_mapping = p_port->p_adapter->params.cm_xfer_block_size;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else if(
p_port->p_adapter->params.lso )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
max_phys_mapping = LARGE_SEND_OFFLOAD_SIZE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
max_phys_mapping = p_port->p_adapter->params.xfer_block_size;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ /*if(
NdisMInitializeScatterGatherDma( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
TRUE, max_phys_mapping )!= NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("NdisMInitializeScatterGatherDma failed\n" ) );<o:p></o:p></p>
<p class=MsoNormal>+
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>+ }*/<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Allocate the PD. */<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->alloc_pd(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_ca, IB_PDT_UD, p_port, &p_port->ib_mgr.h_pd );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_ALLOC_PD, 1, status );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_alloc_pd returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Allocate the PD. */<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->alloc_pd(<o:p></o:p></p>
<p class=MsoNormal>+ p_port->ib_mgr.h_ca,
IB_PDT_UD, p_port, &p_port->ib_mgr.h_pd );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_ALLOC_PD, 1, status );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_alloc_pd returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Allocate receive CQ. */<o:p></o:p></p>
<p class=MsoNormal>-
cq_create.size = p_port->p_adapter->params.rq_depth;<o:p></o:p></p>
<p class=MsoNormal>-
cq_create.pfn_comp_cb = __recv_cb;<o:p></o:p></p>
<p class=MsoNormal>-
cq_create.h_wait_obj = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ /* Allocate receive CQ. */<o:p></o:p></p>
<p class=MsoNormal>+ cq_create.size =
p_port->p_adapter->params.rq_depth;<o:p></o:p></p>
<p class=MsoNormal>+ cq_create.pfn_comp_cb = __recv_cb;<o:p></o:p></p>
<p class=MsoNormal>+ cq_create.h_wait_obj = NULL;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></p>
<p class=MsoNormal>-
__cq_event, &p_port->ib_mgr.h_recv_cq );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_CREATE_RECV_CQ, 1, status );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_create_cq returned %s.\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></p>
<p class=MsoNormal>+ __cq_event,
&p_port->ib_mgr.h_recv_cq );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_CREATE_RECV_CQ, 1, status );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_create_cq returned %s.\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Allocate send CQ. */<o:p></o:p></p>
<p class=MsoNormal>-
cq_create.size = p_port->p_adapter->params.sq_depth;<o:p></o:p></p>
<p class=MsoNormal>-
cq_create.pfn_comp_cb = __send_cb;<o:p></o:p></p>
<p class=MsoNormal>+ /* Allocate send CQ. */<o:p></o:p></p>
<p class=MsoNormal>+ cq_create.size =
p_port->p_adapter->params.sq_depth;<o:p></o:p></p>
<p class=MsoNormal>+ cq_create.pfn_comp_cb = __send_cb;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></p>
<p class=MsoNormal>-
__cq_event, &p_port->ib_mgr.h_send_cq );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_CREATE_SEND_CQ, 1, status );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_create_cq returned %s.\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
/* Allocate the QP. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_memclr( &qp_create, sizeof(qp_create) );<o:p></o:p></p>
<p class=MsoNormal>-
qp_create.qp_type = IB_QPT_UNRELIABLE_DGRM;<o:p></o:p></p>
<p class=MsoNormal>-
qp_create.rq_depth = p_port->p_adapter->params.rq_depth;<o:p></o:p></p>
<p class=MsoNormal>-
qp_create.rq_sge = 2; /* To support buffers spanning pages. */<o:p></o:p></p>
<p class=MsoNormal>-
qp_create.h_rq_cq = p_port->ib_mgr.h_recv_cq;<o:p></o:p></p>
<p class=MsoNormal>-
qp_create.sq_depth = p_port->p_adapter->params.sq_depth;<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></p>
<p class=MsoNormal>+ __cq_event,
&p_port->ib_mgr.h_send_cq );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_CREATE_SEND_CQ, 1, status );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_create_cq returned %s.\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ /* Allocate the QP. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_memclr( &qp_create,
sizeof(qp_create) );<o:p></o:p></p>
<p class=MsoNormal>+ qp_create.qp_type =
IB_QPT_UNRELIABLE_DGRM;<o:p></o:p></p>
<p class=MsoNormal>+ qp_create.rq_depth =
p_port->p_adapter->params.rq_depth;<o:p></o:p></p>
<p class=MsoNormal>+ qp_create.rq_sge = 2; /* To
support buffers spanning pages. */<o:p></o:p></p>
<p class=MsoNormal>+ qp_create.h_rq_cq =
p_port->ib_mgr.h_recv_cq;<o:p></o:p></p>
<p class=MsoNormal>+ qp_create.sq_depth =
p_port->p_adapter->params.sq_depth;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #define UD_QP_USED_SGE 3<o:p></o:p></p>
<p class=MsoNormal>-
qp_create.sq_sge = MAX_SEND_SGE < p_port->p_ca_attrs->max_sges ? <o:p></o:p></p>
<p class=MsoNormal>-
MAX_SEND_SGE : ( p_port->p_ca_attrs->max_sges - UD_QP_USED_SGE );<o:p></o:p></p>
<p class=MsoNormal>-
if ( !p_port->p_ca_attrs->ipoib_csum ) <o:p></o:p></p>
<p class=MsoNormal>-
{ <o:p></o:p></p>
<p class=MsoNormal>-
/* checksum is not supported by device<o:p></o:p></p>
<p class=MsoNormal>-
user must specify BYPASS to explicitly cancel checksum calculation */<o:p></o:p></p>
<p class=MsoNormal>-
if (p_port->p_adapter->params.send_chksum_offload == CSUM_ENABLED)<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->params.send_chksum_offload = CSUM_DISABLED;<o:p></o:p></p>
<p class=MsoNormal>-
if (p_port->p_adapter->params.recv_chksum_offload == CSUM_ENABLED)<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->params.recv_chksum_offload = CSUM_DISABLED;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ qp_create.sq_sge = MAX_SEND_SGE <
p_port->p_ca_attrs->max_sges ? <o:p></o:p></p>
<p class=MsoNormal>+
MAX_SEND_SGE : ( p_port->p_ca_attrs->max_sges - UD_QP_USED_SGE );<o:p></o:p></p>
<p class=MsoNormal>+ if (
!p_port->p_ca_attrs->ipoib_csum ) <o:p></o:p></p>
<p class=MsoNormal>+ { <o:p></o:p></p>
<p class=MsoNormal>+ /* checksum is
not supported by device<o:p></o:p></p>
<p class=MsoNormal>+ user must
specify BYPASS to explicitly cancel checksum calculation */<o:p></o:p></p>
<p class=MsoNormal>+ if
(p_port->p_adapter->params.send_chksum_offload == CSUM_ENABLED)<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->params.send_chksum_offload = CSUM_DISABLED;<o:p></o:p></p>
<p class=MsoNormal>+ if
(p_port->p_adapter->params.recv_chksum_offload == CSUM_ENABLED)<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->params.recv_chksum_offload = CSUM_DISABLED;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
// Now, params struct contains the intersection between the user definition<o:p></o:p></p>
<p class=MsoNormal>-
// and actual HW capabilites<o:p></o:p></p>
<p class=MsoNormal>-
// Remember these values for NDIS OID requests<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->offload_cap.lso =
!!(p_port->p_adapter->params.lso);<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->offload_cap.send_chksum_offload = <o:p></o:p></p>
<p class=MsoNormal>-
!! (p_port->p_adapter->params.send_chksum_offload);<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->offload_cap.recv_chksum_offload = <o:p></o:p></p>
<p class=MsoNormal>-
!! (p_port->p_adapter->params.recv_chksum_offload);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
qp_create.h_sq_cq = p_port->ib_mgr.h_send_cq;<o:p></o:p></p>
<p class=MsoNormal>-
qp_create.sq_signaled = FALSE;<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->create_qp(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_pd, &qp_create, p_port,<o:p></o:p></p>
<p class=MsoNormal>-
__qp_event, &p_port->ib_mgr.h_qp );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_CREATE_QP, 1, status );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_create_qp returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* Query the QP so we can get our QPN. */<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->query_qp(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_qp, &qp_attr );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_QUERY_QP, 1, status );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_query_qp returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.qpn = qp_attr.num;<o:p></o:p></p>
<p class=MsoNormal>+ // Now, params struct contains the
intersection between the user definition<o:p></o:p></p>
<p class=MsoNormal>+ // and actual HW capabilites<o:p></o:p></p>
<p class=MsoNormal>+ // Remember these values for NDIS OID
requests<o:p></o:p></p>
<p class=MsoNormal>+ p_port->p_adapter->offload_cap.lso
= !!(p_port->p_adapter->params.lso);<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->offload_cap.send_chksum_offload = <o:p></o:p></p>
<p class=MsoNormal>+ !!
(p_port->p_adapter->params.send_chksum_offload);<o:p></o:p></p>
<p class=MsoNormal>+ p_port->p_adapter->offload_cap.recv_chksum_offload
= <o:p></o:p></p>
<p class=MsoNormal>+ !!
(p_port->p_adapter->params.recv_chksum_offload);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ qp_create.h_sq_cq =
p_port->ib_mgr.h_send_cq;<o:p></o:p></p>
<p class=MsoNormal>+ qp_create.sq_signaled = FALSE;<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->create_qp(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.h_pd, &qp_create, p_port,<o:p></o:p></p>
<p class=MsoNormal>+ __qp_event,
&p_port->ib_mgr.h_qp );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_CREATE_QP, 1, status );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_create_qp returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ /* Query the QP so we can get our QPN.
*/<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->query_qp(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.h_qp, &qp_attr );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_QUERY_QP, 1, status );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_query_qp returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ p_port->ib_mgr.qpn = qp_attr.num;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Register all of physical memory */<o:p></o:p></p>
<p class=MsoNormal>-
phys_create.length = MEM_REG_SIZE;<o:p></o:p></p>
<p class=MsoNormal>-
phys_create.num_ranges = 1;<o:p></o:p></p>
<p class=MsoNormal>-
phys_create.range_array = &phys_range;<o:p></o:p></p>
<p class=MsoNormal>-
phys_create.buf_offset = 0;<o:p></o:p></p>
<p class=MsoNormal>-
phys_create.hca_page_size = PAGE_SIZE;<o:p></o:p></p>
<p class=MsoNormal>-
phys_create.access_ctrl = IB_AC_LOCAL_WRITE;<o:p></o:p></p>
<p class=MsoNormal>-
phys_range.base_addr = 0;<o:p></o:p></p>
<p class=MsoNormal>-
phys_range.size = MEM_REG_SIZE;<o:p></o:p></p>
<p class=MsoNormal>-
vaddr = 0;<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->reg_phys(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_pd, &phys_create, &vaddr,<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->ib_mgr.lkey, &rkey, &p_port->ib_mgr.h_mr );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_REG_PHYS, 1, status );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_reg_phys returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Register all of physical memory */<o:p></o:p></p>
<p class=MsoNormal>+ phys_create.length = MEM_REG_SIZE;<o:p></o:p></p>
<p class=MsoNormal>+ phys_create.num_ranges = 1;<o:p></o:p></p>
<p class=MsoNormal>+ phys_create.range_array =
&phys_range;<o:p></o:p></p>
<p class=MsoNormal>+ phys_create.buf_offset = 0;<o:p></o:p></p>
<p class=MsoNormal>+ phys_create.hca_page_size = PAGE_SIZE;<o:p></o:p></p>
<p class=MsoNormal>+ phys_create.access_ctrl =
IB_AC_LOCAL_WRITE;<o:p></o:p></p>
<p class=MsoNormal>+ phys_range.base_addr = 0;<o:p></o:p></p>
<p class=MsoNormal>+ phys_range.size = MEM_REG_SIZE;<o:p></o:p></p>
<p class=MsoNormal>+ vaddr = 0;<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->reg_phys(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.h_pd, &phys_create, &vaddr,<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->ib_mgr.lkey, &rkey, &p_port->ib_mgr.h_mr );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_REG_PHYS, 1, status );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_reg_phys returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
status = ipoib_port_srq_init( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ipoib_port_srq_init failed %s\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
/* disable further CM initialization */<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></p>
<p class=MsoNormal>+ status = ipoib_port_srq_init( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ipoib_port_srq_init failed %s\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ /* disable
further CM initialization */<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de1 );<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de1 );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> //CM<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
status = endpt_cm_buf_mgr_init( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("CM Init buf mgr failed status %#x\n", status ) );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_srq_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ status = endpt_cm_buf_mgr_init(
p_port );<o:p></o:p></p>
<p class=MsoNormal>+ if( status !=
IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("CM Init buf mgr failed status %#x\n", status ) );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_srq_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de2 );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else <o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
if ( p_port->p_adapter->params.send_chksum_offload )<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->params.send_chksum_offload = CSUM_DISABLED;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de2 );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else <o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
if ( p_port->p_adapter->params.send_chksum_offload )<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->params.send_chksum_offload = CSUM_DISABLED;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __srq_async_event_cb(<o:p></o:p></p>
<p class=MsoNormal>-IN
ib_async_event_rec_t
*p_event_rec )<o:p></o:p></p>
<p class=MsoNormal>+IN ib_async_event_rec_t
*p_event_rec )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t* p_port = <o:p></o:p></p>
<p class=MsoNormal>-
(ipoib_port_t *)p_event_rec->context;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_t* p_port = <o:p></o:p></p>
<p class=MsoNormal>+ (ipoib_port_t
*)p_event_rec->context;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
switch( p_event_rec->code )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
case IB_AE_SRQ_LIMIT_REACHED:<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_event_rec->code, "IB_AE_SRQ_LIMIT_REACHED" ) );<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
case IB_AE_SRQ_CATAS_ERROR:<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_event_rec->code, "IB_AE_SRQ_CATAS_ERROR" ) );<o:p></o:p></p>
<p class=MsoNormal>-
/*SRQ is in err state, must reinitialize */<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
case IB_AE_SRQ_QP_LAST_WQE_REACHED:<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_event_rec->code, "IB_AE_SRQ_QP_LAST_WQE_REACHED" ) );<o:p></o:p></p>
<p class=MsoNormal>-
/*SRQ is in err state, must reinitialize */<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
default:<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ASYNC EVENT CODE ARRIVED %d(%#x)\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_event_rec->code, p_event_rec->code ) );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ switch( p_event_rec->code )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ case IB_AE_SRQ_LIMIT_REACHED:<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_event_rec->code, "IB_AE_SRQ_LIMIT_REACHED" ) );<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ case IB_AE_SRQ_CATAS_ERROR:<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_event_rec->code, "IB_AE_SRQ_CATAS_ERROR" ) );<o:p></o:p></p>
<p class=MsoNormal>+
/*SRQ is in err state, must reinitialize */<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->hung
= TRUE;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ case IB_AE_SRQ_QP_LAST_WQE_REACHED:<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_event_rec->code, "IB_AE_SRQ_QP_LAST_WQE_REACHED" ) );<o:p></o:p></p>
<p class=MsoNormal>+
/*SRQ is in err state, must reinitialize */<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ default:<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ASYNC EVENT CODE ARRIVED %d(%#x)\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_event_rec->code, p_event_rec->code ) );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> ipoib_port_srq_init(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
ib_status;<o:p></o:p></p>
<p class=MsoNormal>-
ib_srq_handle_t
h_srq;<o:p></o:p></p>
<p class=MsoNormal>-
ib_srq_attr_t
srq_attr;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
ib_status;<o:p></o:p></p>
<p class=MsoNormal>+ ib_srq_handle_t
h_srq;<o:p></o:p></p>
<p class=MsoNormal>+
ib_srq_attr_t srq_attr;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if(
!p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
srq_attr.max_sge = min( 2, p_port->p_ca_attrs->max_srq_sges );<o:p></o:p></p>
<p class=MsoNormal>-
srq_attr.srq_limit = 10;<o:p></o:p></p>
<p class=MsoNormal>-
srq_attr.max_wr = <o:p></o:p></p>
<p class=MsoNormal>-
min( (uint32_t)p_port->p_adapter->params.rq_depth * 8,<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_ca_attrs->max_srq_wrs/2 );<o:p></o:p></p>
<p class=MsoNormal>+ srq_attr.max_sge = min( 2,
p_port->p_ca_attrs->max_srq_sges );<o:p></o:p></p>
<p class=MsoNormal>+ srq_attr.srq_limit = 10;<o:p></o:p></p>
<p class=MsoNormal>+ srq_attr.max_wr = <o:p></o:p></p>
<p class=MsoNormal>+ min(
(uint32_t)p_port->p_adapter->params.rq_depth * 8,<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_ca_attrs->max_srq_wrs/2 );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ib_status = p_port->p_adapter->p_ifc->create_srq( <o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_pd, <o:p></o:p></p>
<p class=MsoNormal>-
&srq_attr, <o:p></o:p></p>
<p class=MsoNormal>-
p_port, <o:p></o:p></p>
<p class=MsoNormal>-
__srq_async_event_cb, <o:p></o:p></p>
<p class=MsoNormal>-
&h_srq );<o:p></o:p></p>
<p class=MsoNormal>-
if( ib_status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_CREATE_QP, 1, ib_status );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_create_srq failed status %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return ib_status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_srq = h_srq;<o:p></o:p></p>
<p class=MsoNormal>+ ib_status =
p_port->p_adapter->p_ifc->create_srq( <o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.h_pd, <o:p></o:p></p>
<p class=MsoNormal>+
&srq_attr,
<o:p></o:p></p>
<p class=MsoNormal>+
p_port, <o:p></o:p></p>
<p class=MsoNormal>+
__srq_async_event_cb, <o:p></o:p></p>
<p class=MsoNormal>+
&h_srq );<o:p></o:p></p>
<p class=MsoNormal>+ if( ib_status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_CREATE_QP, 1, ib_status );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_create_srq failed status %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return
ib_status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ p_port->ib_mgr.h_srq = h_srq;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
return ib_status;<o:p></o:p></p>
<p class=MsoNormal>+ return ib_status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> /* __port_query_ca_attrs() <o:p></o:p></p>
<p class=MsoNormal>@@ -1282,82 +1288,82 @@<o:p></o:p></p>
<p class=MsoNormal> */<o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __port_query_ca_attrs( <o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_ca_attr_t**
pp_ca_attrs )<o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
ib_ca_attr_t**
pp_ca_attrs )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
ib_status;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
attr_size;<o:p></o:p></p>
<p class=MsoNormal>-
ib_ca_attr_t*
p_ca_attrs;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
ib_status;<o:p></o:p></p>
<p class=MsoNormal>+
uint32_t
attr_size;<o:p></o:p></p>
<p class=MsoNormal>+
ib_ca_attr_t* p_ca_attrs;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
*pp_ca_attrs = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ *pp_ca_attrs = NULL;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ib_status = <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, NULL ,
&attr_size );<o:p></o:p></p>
<p class=MsoNormal>-
if( ib_status != IB_INSUFFICIENT_MEMORY )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_query_ca failed status %s\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></p>
<p class=MsoNormal>-
goto done;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( attr_size );<o:p></o:p></p>
<p class=MsoNormal>+ ib_status = <o:p></o:p></p>
<p class=MsoNormal>+ p_port->p_adapter->p_ifc->query_ca(
p_port->ib_mgr.h_ca, NULL , &attr_size );<o:p></o:p></p>
<p class=MsoNormal>+ if( ib_status != IB_INSUFFICIENT_MEMORY
)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_query_ca failed status %s\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></p>
<p class=MsoNormal>+ goto done;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( attr_size );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_ca_attrs = (ib_ca_attr_t *) cl_zalloc( attr_size );<o:p></o:p></p>
<p class=MsoNormal>-
if ( p_ca_attrs == NULL )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Allocate %d bytes failed for CA Attributes\n", attr_size ));<o:p></o:p></p>
<p class=MsoNormal>-
ib_status = IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>-
goto done;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ p_ca_attrs = (ib_ca_attr_t *) cl_zalloc(
attr_size );<o:p></o:p></p>
<p class=MsoNormal>+ if ( p_ca_attrs == NULL )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Allocate %d bytes failed for CA Attributes\n", attr_size ));<o:p></o:p></p>
<p class=MsoNormal>+ ib_status =
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>+ goto done;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ib_status = <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, p_ca_attrs
, &attr_size );<o:p></o:p></p>
<p class=MsoNormal>-
if ( ib_status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("CA attributes query failed\n") );<o:p></o:p></p>
<p class=MsoNormal>-
cl_free ( p_ca_attrs );<o:p></o:p></p>
<p class=MsoNormal>-
goto done;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ ib_status = <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, p_ca_attrs
, &attr_size );<o:p></o:p></p>
<p class=MsoNormal>+ if ( ib_status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("CA attributes query failed\n") );<o:p></o:p></p>
<p class=MsoNormal>+ cl_free (
p_ca_attrs );<o:p></o:p></p>
<p class=MsoNormal>+ goto done;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
*pp_ca_attrs = p_ca_attrs;<o:p></o:p></p>
<p class=MsoNormal>+ *pp_ca_attrs = p_ca_attrs;<o:p></o:p></p>
<p class=MsoNormal> done:<o:p></o:p></p>
<p class=MsoNormal>-
return ib_status;<o:p></o:p></p>
<p class=MsoNormal>+ return ib_status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> void<o:p></o:p></p>
<p class=MsoNormal> ipoib_port_srq_destroy( <o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t status;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->ib_mgr.h_srq )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
status =<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->destroy_srq( p_port->ib_mgr.h_srq, NULL
);<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_srq = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->ib_mgr.h_srq )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ status =<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->destroy_srq( p_port->ib_mgr.h_srq, NULL
);<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
status == IB_SUCCESS );<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.h_srq = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __ib_mgr_destroy(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_port_t*
const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t status;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->ib_mgr.h_ca )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
status =<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->close_ca( p_port->ib_mgr.h_ca, NULL );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_ca = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->ib_mgr.h_ca )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ status =<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->close_ca( p_port->ib_mgr.h_ca, NULL );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
status == IB_SUCCESS );<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.h_ca = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>@@ -1369,58 +1375,58 @@<o:p></o:p></p>
<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_construct(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_qpool_construct( &p_port->buf_mgr.recv_pool );<o:p></o:p></p>
<p class=MsoNormal>+ cl_qpool_construct(
&p_port->buf_mgr.recv_pool );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port->buf_mgr.h_packet_pool = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
p_port->buf_mgr.h_buffer_pool = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ p_port->buf_mgr.h_packet_pool = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ p_port->buf_mgr.h_buffer_pool = NULL;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
NdisInitializeNPagedLookasideList( &p_port->buf_mgr.send_buf_list,<o:p></o:p></p>
<p class=MsoNormal>-
NULL, NULL, 0, MAX_LSO_PAYLOAD_MTU, 'bipi', 0 );<o:p></o:p></p>
<p class=MsoNormal>+ NdisInitializeNPagedLookasideList(
&p_port->buf_mgr.send_buf_list,<o:p></o:p></p>
<p class=MsoNormal>+ NULL, NULL, 0,
MAX_LSO_PAYLOAD_MTU, 'bipi', 0 );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port->buf_mgr.h_send_pkt_pool = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ p_port->buf_mgr.h_send_pkt_pool =
NULL;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_init(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t*
const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
cl_status_t
cl_status;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_params_t
*p_params;<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST_POOL_PARAMETERS pool_parameters;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER(IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ cl_status_t
cl_status;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_params_t *p_params;<o:p></o:p></p>
<p class=MsoNormal>+ NET_BUFFER_LIST_POOL_PARAMETERS
pool_parameters;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER(IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_params = &p_port->p_adapter->params;<o:p></o:p></p>
<p class=MsoNormal>+ p_params = &p_port->p_adapter->params;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Allocate the receive descriptor pool */<o:p></o:p></p>
<p class=MsoNormal>-
cl_status = cl_qpool_init( &p_port->buf_mgr.recv_pool,<o:p></o:p></p>
<p class=MsoNormal>-
p_params->rq_depth * p_params->recv_pool_ratio,<o:p></o:p></p>
<p class=MsoNormal>+ /* Allocate the receive descriptor pool
*/<o:p></o:p></p>
<p class=MsoNormal>+ cl_status = cl_qpool_init(
&p_port->buf_mgr.recv_pool,<o:p></o:p></p>
<p class=MsoNormal>+
p_params->rq_depth * p_params->recv_pool_ratio,<o:p></o:p></p>
<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>
<p class=MsoNormal>-
0, 0, sizeof(ipoib_recv_desc_t), __recv_ctor, NULL, p_port );<o:p></o:p></p>
<p class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>-
0, 0, sizeof(ipoib_recv_desc_t), __recv_ctor, __recv_dtor, p_port );<o:p></o:p></p>
<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_RECV_POOL, 1, cl_status );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("cl_qpool_init for recvs returned %#x\n",<o:p></o:p></p>
<p class=MsoNormal>-
cl_status) );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ 0, 0,
sizeof(ipoib_recv_desc_t), __recv_ctor, NULL, p_port );<o:p></o:p></p>
<p class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+ 0, 0,
sizeof(ipoib_recv_desc_t), __recv_ctor, __recv_dtor, p_port );<o:p></o:p></p>
<p class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+ if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_RECV_POOL, 1, cl_status );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("cl_qpool_init for recvs returned %#x\n",<o:p></o:p></p>
<p class=MsoNormal>+
cl_status) );<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Allocate the NET BUFFER list pools for receive indication. */<o:p></o:p></p>
<p class=MsoNormal>-
NdisZeroMemory(&pool_parameters, sizeof(NET_BUFFER_LIST_POOL_PARAMETERS));<o:p></o:p></p>
<p class=MsoNormal>+ /* Allocate the NET BUFFER list pools
for receive indication. */<o:p></o:p></p>
<p class=MsoNormal>+ NdisZeroMemory(&pool_parameters,
sizeof(NET_BUFFER_LIST_POOL_PARAMETERS));<o:p></o:p></p>
<p class=MsoNormal> pool_parameters.Header.Type =
NDIS_OBJECT_TYPE_DEFAULT;<o:p></o:p></p>
<p class=MsoNormal> pool_parameters.Header.Revision =
NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1;<o:p></o:p></p>
<p class=MsoNormal> pool_parameters.Header.Size =
sizeof(pool_parameters);<o:p></o:p></p>
<p class=MsoNormal>@@ -1428,288 +1434,288 @@<o:p></o:p></p>
<p class=MsoNormal> pool_parameters.ContextSize = 0;<o:p></o:p></p>
<p class=MsoNormal> pool_parameters.fAllocateNetBuffer
= TRUE;<o:p></o:p></p>
<p class=MsoNormal> pool_parameters.PoolTag = 'CRPI';<o:p></o:p></p>
<p class=MsoNormal>-
pool_parameters.DataSize = 0;<o:p></o:p></p>
<p class=MsoNormal>+ pool_parameters.DataSize = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> p_port->buf_mgr.h_packet_pool =
NdisAllocateNetBufferListPool(<o:p></o:p></p>
<p class=MsoNormal>
p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>
&pool_parameters); <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( !p_port->buf_mgr.h_packet_pool )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_RECV_PKT_POOL, 1, NDIS_STATUS_RESOURCES );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("NdisAllocatePacketPool returned %08X\n",
(UINT)NDIS_STATUS_RESOURCES) );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
/* Allocate the NET buffer list pool for send formatting. */<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_port->buf_mgr.h_packet_pool )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_RECV_PKT_POOL, 1, NDIS_STATUS_RESOURCES );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("NdisAllocatePacketPool returned %08X\n",
(UINT)NDIS_STATUS_RESOURCES) );<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ /* Allocate the NET buffer list pool for
send formatting. */<o:p></o:p></p>
<p class=MsoNormal> pool_parameters.PoolTag = 'XTPI';<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> p_port->buf_mgr.h_send_pkt_pool
= NdisAllocateNetBufferListPool(<o:p></o:p></p>
<p class=MsoNormal>
p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>
&pool_parameters); <o:p></o:p></p>
<p class=MsoNormal>-
if( !p_port->buf_mgr.h_send_pkt_pool)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_SEND_PKT_POOL, 1, NDIS_STATUS_RESOURCES );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES)
);<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_port->buf_mgr.h_send_pkt_pool)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ NdisWriteErrorLogEntry(
p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_SEND_PKT_POOL, 1, NDIS_STATUS_RESOURCES );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES)
);<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_destroy(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER(IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER(IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Destroy the send packet and buffer pools. <o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->buf_mgr.h_send_buf_pool )<o:p></o:p></p>
<p class=MsoNormal>-
NdisFreeBufferPool( p_port->buf_mgr.h_send_buf_pool );*/<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->buf_mgr.h_send_pkt_pool )<o:p></o:p></p>
<p class=MsoNormal>-
NdisFreeNetBufferListPool ( p_port->buf_mgr.h_send_pkt_pool );<o:p></o:p></p>
<p class=MsoNormal>+ /* Destroy the send packet and buffer
pools. <o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->buf_mgr.h_send_buf_pool )<o:p></o:p></p>
<p class=MsoNormal>+
NdisFreeBufferPool( p_port->buf_mgr.h_send_buf_pool );*/<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->buf_mgr.h_send_pkt_pool )<o:p></o:p></p>
<p class=MsoNormal>+
NdisFreeNetBufferListPool ( p_port->buf_mgr.h_send_pkt_pool );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Destroy the receive packet and buffer pools. <o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->buf_mgr.h_buffer_pool )<o:p></o:p></p>
<p class=MsoNormal>-
NdisFreeBufferPool( p_port->buf_mgr.h_buffer_pool );*/<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->buf_mgr.h_packet_pool )<o:p></o:p></p>
<p class=MsoNormal>-
NdisFreeNetBufferListPool ( p_port->buf_mgr.h_packet_pool );<o:p></o:p></p>
<p class=MsoNormal>+ /* Destroy the receive packet and buffer
pools. <o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->buf_mgr.h_buffer_pool )<o:p></o:p></p>
<p class=MsoNormal>+
NdisFreeBufferPool( p_port->buf_mgr.h_buffer_pool );*/<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->buf_mgr.h_packet_pool )<o:p></o:p></p>
<p class=MsoNormal>+ NdisFreeNetBufferListPool
( p_port->buf_mgr.h_packet_pool );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Free the receive and send descriptors. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_qpool_destroy( &p_port->buf_mgr.recv_pool );<o:p></o:p></p>
<p class=MsoNormal>+ /* Free the receive and send
descriptors. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_qpool_destroy(
&p_port->buf_mgr.recv_pool );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Free the lookaside list of scratch buffers. */<o:p></o:p></p>
<p class=MsoNormal>-
NdisDeleteNPagedLookasideList( &p_port->buf_mgr.send_buf_list );<o:p></o:p></p>
<p class=MsoNormal>+ /* Free the lookaside list of scratch
buffers. */<o:p></o:p></p>
<p class=MsoNormal>+ NdisDeleteNPagedLookasideList(
&p_port->buf_mgr.send_buf_list );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static cl_status_t<o:p></o:p></p>
<p class=MsoNormal> __recv_ctor(<o:p></o:p></p>
<p class=MsoNormal>-
IN
void* const
p_object,<o:p></o:p></p>
<p class=MsoNormal>-
IN
void*
context,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
cl_pool_item_t**
const
pp_pool_item )<o:p></o:p></p>
<p class=MsoNormal>+
IN
void*
const
p_object,<o:p></o:p></p>
<p class=MsoNormal>+
IN
void*
context,<o:p></o:p></p>
<p class=MsoNormal>+
OUT cl_pool_item_t**
const pp_pool_item )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_recv_desc_t
*p_desc;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_recv_desc_t *p_desc;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
ds0_len;<o:p></o:p></p>
<p class=MsoNormal>+
uint32_t
ds0_len;<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ALLOC );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ALLOC );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_object );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( context );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_object );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( context );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_desc = (ipoib_recv_desc_t*)p_object;<o:p></o:p></p>
<p class=MsoNormal>-
p_port = (ipoib_port_t*)context;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc = (ipoib_recv_desc_t*)p_object;<o:p></o:p></p>
<p class=MsoNormal>+ p_port = (ipoib_port_t*)context;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Setup the work request. */<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->wr.ds_array = p_desc->local_ds;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->wr.wr_id = (uintn_t)p_desc;<o:p></o:p></p>
<p class=MsoNormal>+ /* Setup the work request. */<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->wr.ds_array = p_desc->local_ds;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->wr.wr_id = (uintn_t)p_desc;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>
<p class=MsoNormal>-
/* Sanity check on the receive buffer layout */<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( (void*)&p_desc->buf.eth.pkt.type ==<o:p></o:p></p>
<p class=MsoNormal>-
(void*)&p_desc->buf.ib.pkt.type );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( sizeof(recv_buf_t) == sizeof(ipoib_pkt_t) + sizeof(ib_grh_t) );<o:p></o:p></p>
<p class=MsoNormal>+ /* Sanity check on the receive buffer
layout */<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
(void*)&p_desc->buf.eth.pkt.type ==<o:p></o:p></p>
<p class=MsoNormal>+
(void*)&p_desc->buf.ib.pkt.type
);<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( sizeof(recv_buf_t) ==
sizeof(ipoib_pkt_t) + sizeof(ib_grh_t) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Setup the local data segment. */<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->local_ds[0].vaddr = cl_get_physaddr( &p_desc->buf );<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->local_ds[0].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
ds0_len =<o:p></o:p></p>
<p class=MsoNormal>-
PAGE_SIZE - ((uint32_t)p_desc->local_ds[0].vaddr & (PAGE_SIZE - 1));<o:p></o:p></p>
<p class=MsoNormal>-
if( ds0_len >= sizeof(recv_buf_t) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* The whole buffer is within a page. */<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->wr.num_ds = 1;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* The buffer crosses page boundaries. */<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->local_ds[1].vaddr = cl_get_physaddr( <o:p></o:p></p>
<p class=MsoNormal>-
((uint8_t*)&p_desc->buf) + ds0_len );<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->local_ds[1].length = sizeof(recv_buf_t) - ds0_len;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->wr.num_ds = 2;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>-
/* Allocate the receive buffer. */<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->p_buf = (recv_buf_t*)cl_zalloc( sizeof(recv_buf_t) );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_desc->p_buf )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to allocate receive buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return CL_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Setup the local data segment. */<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->local_ds[0].vaddr =
cl_get_physaddr( &p_desc->buf );<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->local_ds[0].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+ ds0_len =<o:p></o:p></p>
<p class=MsoNormal>+ PAGE_SIZE -
((uint32_t)p_desc->local_ds[0].vaddr & (PAGE_SIZE - 1));<o:p></o:p></p>
<p class=MsoNormal>+ if( ds0_len >= sizeof(recv_buf_t) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* The whole
buffer is within a page. */<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->wr.num_ds = 1;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* The buffer
crosses page boundaries. */<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->local_ds[1].vaddr
= cl_get_physaddr( <o:p></o:p></p>
<p class=MsoNormal>+
((uint8_t*)&p_desc->buf) + ds0_len );<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->local_ds[1].length = sizeof(recv_buf_t) - ds0_len;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->wr.num_ds = 2;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+ /* Allocate the receive buffer. */<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->p_buf =
(recv_buf_t*)cl_zalloc( sizeof(recv_buf_t) );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_desc->p_buf )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to allocate receive buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
CL_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Sanity check on the receive buffer layout */<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( (void*)&p_desc->p_buf->eth.pkt.type ==<o:p></o:p></p>
<p class=MsoNormal>-
(void*)&p_desc->p_buf->ib.pkt.type );<o:p></o:p></p>
<p class=MsoNormal>+ /* Sanity check on the receive buffer
layout */<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
(void*)&p_desc->p_buf->eth.pkt.type ==<o:p></o:p></p>
<p class=MsoNormal>+
(void*)&p_desc->p_buf->ib.pkt.type );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Setup the local data segment. */<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->local_ds[0].vaddr = cl_get_physaddr( p_desc->p_buf );<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->local_ds[0].length = sizeof(ipoib_pkt_t) + sizeof(ib_grh_t);<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->local_ds[0].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->wr.num_ds = 1;<o:p></o:p></p>
<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+ /* Setup the local data segment. */<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->local_ds[0].vaddr =
cl_get_physaddr( p_desc->p_buf );<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->local_ds[0].length =
sizeof(ipoib_pkt_t) + sizeof(ib_grh_t);<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->local_ds[0].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->wr.num_ds = 1;<o:p></o:p></p>
<p class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
*pp_pool_item = &p_desc->item;<o:p></o:p></p>
<p class=MsoNormal>+ *pp_pool_item = &p_desc->item;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ALLOC );<o:p></o:p></p>
<p class=MsoNormal>-
return CL_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ALLOC );<o:p></o:p></p>
<p class=MsoNormal>+ return CL_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #if !IPOIB_INLINE_RECV<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __recv_dtor(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const cl_pool_item_t*
const
p_pool_item,<o:p></o:p></p>
<p class=MsoNormal>-
IN
void
*context )<o:p></o:p></p>
<p class=MsoNormal>+ IN
const cl_pool_item_t* const
p_pool_item,<o:p></o:p></p>
<p class=MsoNormal>+
IN
void
*context )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_recv_desc_t
*p_desc;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_recv_desc_t *p_desc;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ALLOC );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ALLOC );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
UNUSED_PARAM( context );<o:p></o:p></p>
<p class=MsoNormal>+ UNUSED_PARAM( context );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_desc = PARENT_STRUCT( p_pool_item, ipoib_recv_desc_t, item );<o:p></o:p></p>
<p class=MsoNormal>+ p_desc = PARENT_STRUCT( p_pool_item,
ipoib_recv_desc_t, item );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_desc->p_buf )<o:p></o:p></p>
<p class=MsoNormal>-
cl_free( p_desc->p_buf );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_desc->p_buf )<o:p></o:p></p>
<p class=MsoNormal>+ cl_free(
p_desc->p_buf );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ALLOC );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ALLOC );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline ipoib_recv_desc_t*<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_get_recv(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_recv_desc_t
*p_desc;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>-
p_desc = (ipoib_recv_desc_t*)cl_qpool_get( &p_port->buf_mgr.recv_pool );<o:p></o:p></p>
<p class=MsoNormal>-
/* Reference the port object for the send. */<o:p></o:p></p>
<p class=MsoNormal>-
if( p_desc )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_ref( p_port, ref_get_recv );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_desc->wr.wr_id == (uintn_t)p_desc );<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_recv_desc_t *p_desc;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ p_desc =
(ipoib_recv_desc_t*)cl_qpool_get( &p_port->buf_mgr.recv_pool );<o:p></o:p></p>
<p class=MsoNormal>+ /* Reference the port object for the send.
*/<o:p></o:p></p>
<p class=MsoNormal>+ if( p_desc )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_ref(
p_port, ref_get_recv );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
p_desc->wr.wr_id == (uintn_t)p_desc );<o:p></o:p></p>
<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_desc->local_ds[0].vaddr ==<o:p></o:p></p>
<p class=MsoNormal>-
cl_get_physaddr( &p_desc->buf ) );<o:p></o:p></p>
<p class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_desc->local_ds[0].vaddr ==<o:p></o:p></p>
<p class=MsoNormal>-
cl_get_physaddr( p_desc->p_buf ) );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_desc->local_ds[0].length ==<o:p></o:p></p>
<p class=MsoNormal>-
(sizeof(ipoib_pkt_t) + sizeof(ib_grh_t)) );<o:p></o:p></p>
<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_desc->local_ds[0].lkey == p_port->ib_mgr.lkey );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>-
return p_desc;<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
p_desc->local_ds[0].vaddr ==<o:p></o:p></p>
<p class=MsoNormal>+
cl_get_physaddr( &p_desc->buf ) );<o:p></o:p></p>
<p class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
p_desc->local_ds[0].vaddr ==<o:p></o:p></p>
<p class=MsoNormal>+
cl_get_physaddr( p_desc->p_buf ) );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
p_desc->local_ds[0].length ==<o:p></o:p></p>
<p class=MsoNormal>+
(sizeof(ipoib_pkt_t) + sizeof(ib_grh_t)) );<o:p></o:p></p>
<p class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
p_desc->local_ds[0].lkey == p_port->ib_mgr.lkey );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ return p_desc;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> //NDIS60<o:p></o:p></p>
<p class=MsoNormal> static inline void<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_put_recv(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_recv_desc_t* const
p_desc,<o:p></o:p></p>
<p class=MsoNormal>-
IN
NET_BUFFER_LIST*
const
p_net_buffer_list OPTIONAL )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc,<o:p></o:p></p>
<p class=MsoNormal>+
IN
NET_BUFFER_LIST* const p_net_buffer_list OPTIONAL
)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER
*p_buf = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
MDL
*p_mdl = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER(IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ NET_BUFFER
*p_buf = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ MDL
*p_mdl = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER(IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_net_buffer_list )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
p_buf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_buf );<o:p></o:p></p>
<p class=MsoNormal>-
p_mdl = NET_BUFFER_FIRST_MDL(p_buf);<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_mdl );<o:p></o:p></p>
<p class=MsoNormal>-
NdisFreeMdl(p_mdl);<o:p></o:p></p>
<p class=MsoNormal>-
NdisFreeNetBufferList(p_net_buffer_list);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( p_net_buffer_list )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ p_buf =
NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_buf
);<o:p></o:p></p>
<p class=MsoNormal>+ p_mdl =
NET_BUFFER_FIRST_MDL(p_buf);<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_mdl
);<o:p></o:p></p>
<p class=MsoNormal>+
NdisFreeMdl(p_mdl);<o:p></o:p></p>
<p class=MsoNormal>+
NdisFreeNetBufferList(p_net_buffer_list);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Return the descriptor to its pools. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_qpool_put( &p_port->buf_mgr.recv_pool, &p_desc->item );<o:p></o:p></p>
<p class=MsoNormal>+ /* Return the descriptor to its pools.
*/<o:p></o:p></p>
<p class=MsoNormal>+ cl_qpool_put(
&p_port->buf_mgr.recv_pool, &p_desc->item );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Dereference the port object since the receive is no longer outstanding.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_get_recv );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Dereference the port object
since the receive is no longer outstanding.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_deref( p_port, ref_get_recv
);<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline void<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_put_recv_list(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
cl_qlist_t* const
p_list )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
cl_qlist_t* const p_list
)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
//IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qpool_put_list( &p_port->buf_mgr.recv_pool, p_list );<o:p></o:p></p>
<p class=MsoNormal>-
//IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ //IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ cl_qpool_put_list( &p_port->buf_mgr.recv_pool,
p_list );<o:p></o:p></p>
<p class=MsoNormal>+ //IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline NET_BUFFER_LIST*<o:p></o:p></p>
<p class=MsoNormal> __buf_mgr_get_NBL(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_recv_desc_t* const
p_desc )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST
*p_net_buffer_list;<o:p></o:p></p>
<p class=MsoNormal>-
MDL
*p_mdl;<o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER_LIST
*p_net_buffer_list;<o:p></o:p></p>
<p class=MsoNormal>+ MDL
*p_mdl;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_mdl = NdisAllocateMdl(p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
&p_desc->buf.eth.pkt,<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->len );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to allocate MDL\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NULL;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ p_mdl =
NdisAllocateMdl(p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
&p_desc->buf.eth.pkt,<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->len );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to allocate MDL\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return NULL;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_net_buffer_list = NdisAllocateNetBufferAndNetBufferList(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->buf_mgr.h_packet_pool,<o:p></o:p></p>
<p class=MsoNormal>-
0,<o:p></o:p></p>
<p class=MsoNormal>-
0,<o:p></o:p></p>
<p class=MsoNormal>-
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
0,<o:p></o:p></p>
<p class=MsoNormal>-
0);<o:p></o:p></p>
<p class=MsoNormal>+ p_net_buffer_list =
NdisAllocateNetBufferAndNetBufferList(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->buf_mgr.h_packet_pool,<o:p></o:p></p>
<p class=MsoNormal>+
0,<o:p></o:p></p>
<p class=MsoNormal>+
0,<o:p></o:p></p>
<p class=MsoNormal>+
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+
0,<o:p></o:p></p>
<p class=MsoNormal>+
0);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( !p_net_buffer_list )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to allocate NET_BUFFER_LIST\n") );<o:p></o:p></p>
<p class=MsoNormal>-
NdisFreeMdl(p_mdl);<o:p></o:p></p>
<p class=MsoNormal>-
return NULL;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_net_buffer_list )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to allocate NET_BUFFER_LIST\n") );<o:p></o:p></p>
<p class=MsoNormal>+
NdisFreeMdl(p_mdl);<o:p></o:p></p>
<p class=MsoNormal>+ return NULL;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PORT_FROM_NBL( p_net_buffer_list ) = p_port;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_RECV_FROM_NBL( p_net_buffer_list ) = p_desc;<o:p></o:p></p>
<p class=MsoNormal>-
p_net_buffer_list->SourceHandle = p_port->p_adapter->h_adapter;<o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PORT_FROM_NBL( p_net_buffer_list )
= p_port;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_RECV_FROM_NBL( p_net_buffer_list )
= p_desc;<o:p></o:p></p>
<p class=MsoNormal>+ p_net_buffer_list->SourceHandle =
p_port->p_adapter->h_adapter;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>-
return p_net_buffer_list;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ return p_net_buffer_list;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>@@ -1720,54 +1726,54 @@<o:p></o:p></p>
<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __recv_mgr_construct(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_init( &p_port->recv_mgr.done_list );<o:p></o:p></p>
<p class=MsoNormal>+ cl_qlist_init(
&p_port->recv_mgr.done_list );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port->recv_mgr.recv_NBL_array = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ p_port->recv_mgr.recv_NBL_array =
NULL;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __recv_mgr_init(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Allocate the NDIS_PACKET pointer array for indicating receives. */<o:p></o:p></p>
<p class=MsoNormal>-
p_port->recv_mgr.recv_NBL_array = (NET_BUFFER_LIST **)cl_malloc(<o:p></o:p></p>
<p class=MsoNormal>-
sizeof(NET_BUFFER_LIST*) * p_port->p_adapter->params.rq_depth );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_port->recv_mgr.recv_NBL_array )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_RECV_PKT_ARRAY, 0 );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("cl_malloc for PNDIS_PACKET array failed.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Allocate the NDIS_PACKET pointer
array for indicating receives. */<o:p></o:p></p>
<p class=MsoNormal>+ p_port->recv_mgr.recv_NBL_array =
(NET_BUFFER_LIST **)cl_malloc(<o:p></o:p></p>
<p class=MsoNormal>+
sizeof(NET_BUFFER_LIST*) * p_port->p_adapter->params.rq_depth );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_port->recv_mgr.recv_NBL_array
)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_RECV_PKT_ARRAY, 0 );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("cl_malloc for PNDIS_PACKET array failed.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __recv_mgr_destroy(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( cl_is_qlist_empty( &p_port->recv_mgr.done_list ) );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( !p_port->recv_mgr.depth );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( cl_is_qlist_empty(
&p_port->recv_mgr.done_list ) );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( !p_port->recv_mgr.depth );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->recv_mgr.recv_NBL_array )<o:p></o:p></p>
<p class=MsoNormal>-
cl_free( p_port->recv_mgr.recv_NBL_array );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->recv_mgr.recv_NBL_array )<o:p></o:p></p>
<p class=MsoNormal>+ cl_free(
p_port->recv_mgr.recv_NBL_array );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>@@ -1779,1449 +1785,1490 @@<o:p></o:p></p>
<p class=MsoNormal> */<o:p></o:p></p>
<p class=MsoNormal> int32_t<o:p></o:p></p>
<p class=MsoNormal> __recv_mgr_repost(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_recv_desc_t *p_head
= NULL, *p_tail = NULL, *p_next;<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
ib_recv_wr_t
*p_failed;<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( GetRecv );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( PostRecv );<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_recv_desc_t *p_head =
NULL, *p_tail = NULL, *p_next;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+
ib_recv_wr_t *p_failed;<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( GetRecv );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( PostRecv );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>-
("Port in invalid state. Not reposting.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return 0;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_ref( p_port, ref_repost );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>+
("Port in invalid state. Not reposting.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return 0;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_ref( p_port, ref_repost );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
while( p_port->recv_mgr.depth < p_port->p_adapter->params.rq_depth
)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Pull receives out of the pool and chain them up. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( GetRecv );<o:p></o:p></p>
<p class=MsoNormal>-
p_next = __buf_mgr_get_recv( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetRecv );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_next )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>-
("Out of receive descriptors! recv queue depth
0x%x\n",p_port->recv_mgr.depth) );<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ while( p_port->recv_mgr.depth <
p_port->p_adapter->params.rq_depth )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* Pull receives
out of the pool and chain them up. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
GetRecv );<o:p></o:p></p>
<p class=MsoNormal>+ p_next =
__buf_mgr_get_recv( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetRecv );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_next )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>+
("Out of receive descriptors! recv queue depth
0x%x\n",p_port->recv_mgr.depth) );<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( !p_tail )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_tail = p_next;<o:p></o:p></p>
<p class=MsoNormal>-
p_next->wr.p_next = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_next->wr.p_next = &p_head->wr;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_tail )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_tail = p_next;<o:p></o:p></p>
<p class=MsoNormal>+
p_next->wr.p_next = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_next->wr.p_next = &p_head->wr;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_head = p_next;<o:p></o:p></p>
<p class=MsoNormal>+ p_head = p_next;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port->recv_mgr.depth++;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
p_port->recv_mgr.depth++;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_head )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( PostRecv );<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->post_recv(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_qp, &p_head->wr, &p_failed );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, PostRecv );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_head )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
PostRecv );<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->post_recv(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.h_qp, &p_head->wr, &p_failed );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, PostRecv );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ip_post_recv returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
/* return the descriptors to the pool */<o:p></o:p></p>
<p class=MsoNormal>-
while( p_failed )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_head = PARENT_STRUCT( p_failed, ipoib_recv_desc_t, wr );<o:p></o:p></p>
<p class=MsoNormal>-
p_failed = p_failed->p_next;<o:p></o:p></p>
<p class=MsoNormal>+ if( status !=
IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ip_post_recv returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+
/* return the descriptors to the pool */<o:p></o:p></p>
<p class=MsoNormal>+
while( p_failed )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
p_head = PARENT_STRUCT( p_failed, ipoib_recv_desc_t, wr );<o:p></o:p></p>
<p class=MsoNormal>+
p_failed = p_failed->p_next;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
__buf_mgr_put_recv( p_port, p_head, NULL );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->recv_mgr.depth--;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
__buf_mgr_put_recv( p_port, p_head, NULL );<o:p></o:p></p>
<p class=MsoNormal>+
p_port->recv_mgr.depth--;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_repost );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>-
return p_port->p_adapter->params.rq_low_watermark - p_port->recv_mgr.depth;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_deref( p_port, ref_repost );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ return
p_port->p_adapter->params.rq_low_watermark - p_port->recv_mgr.depth;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> inline ULONG __free_received_NBL (<o:p></o:p></p>
<p class=MsoNormal>-
IN ipoib_port_t
*p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN NET_BUFFER_LIST *p_net_buffer_lists<o:p></o:p></p>
<p class=MsoNormal>-
) <o:p></o:p></p>
<p class=MsoNormal>+ IN ipoib_port_t
*p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN NET_BUFFER_LIST
*p_net_buffer_lists<o:p></o:p></p>
<p class=MsoNormal>+ ) <o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_recv_desc_t
*p_desc;<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST
*cur_net_buffer_list, *next_net_buffer_list;<o:p></o:p></p>
<p class=MsoNormal>-
LONG
NBL_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_recv_desc_t *p_desc;<o:p></o:p></p>
<p class=MsoNormal>+ NET_BUFFER_LIST
*cur_net_buffer_list, *next_net_buffer_list;<o:p></o:p></p>
<p class=MsoNormal>+
LONG
NBL_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
for (cur_net_buffer_list = p_net_buffer_lists;<o:p></o:p></p>
<p class=MsoNormal>-
cur_net_buffer_list != NULL;<o:p></o:p></p>
<p class=MsoNormal>-
cur_net_buffer_list = next_net_buffer_list)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
++NBL_cnt;<o:p></o:p></p>
<p class=MsoNormal>-
next_net_buffer_list = NET_BUFFER_LIST_NEXT_NBL(cur_net_buffer_list);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ for (cur_net_buffer_list =
p_net_buffer_lists;<o:p></o:p></p>
<p class=MsoNormal>+
cur_net_buffer_list != NULL;<o:p></o:p></p>
<p class=MsoNormal>+
cur_net_buffer_list = next_net_buffer_list)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ ++NBL_cnt;<o:p></o:p></p>
<p class=MsoNormal>+
next_net_buffer_list = NET_BUFFER_LIST_NEXT_NBL(cur_net_buffer_list);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Get the port and descriptor from the NET_BUFFER_LIST. */<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT(p_port == IPOIB_PORT_FROM_NBL( cur_net_buffer_list ));<o:p></o:p></p>
<p class=MsoNormal>-
p_desc = IPOIB_RECV_FROM_NBL( cur_net_buffer_list );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>+ /* Get the port
and descriptor from the NET_BUFFER_LIST. */<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(p_port
== IPOIB_PORT_FROM_NBL( cur_net_buffer_list ));<o:p></o:p></p>
<p class=MsoNormal>+ p_desc =
IPOIB_RECV_FROM_NBL( cur_net_buffer_list );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal> #if 0 //TODO CM flow<o:p></o:p></p>
<p class=MsoNormal>-
if( p_desc->type == PKT_TYPE_CM_UCAST )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
int32_t
discarded;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
NBL_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status = IB_NOT_DONE;<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_desc->type == PKT_TYPE_CM_UCAST )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
int32_t
discarded;<o:p></o:p></p>
<p class=MsoNormal>+
uint32_t
NBL_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
ib_api_status_t status = IB_NOT_DONE;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_BUFFER
*p_buf;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+
NDIS_BUFFER *p_buf;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Unchain the NDIS buffer. */<o:p></o:p></p>
<p class=MsoNormal>-
NdisUnchainBufferAtFront( p_packet, &p_buf );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_buf );<o:p></o:p></p>
<p class=MsoNormal>-
/* Return the NDIS packet and NDIS buffer to their pools. */<o:p></o:p></p>
<p class=MsoNormal>-
NdisDprFreePacketNonInterlocked( p_packet );<o:p></o:p></p>
<p class=MsoNormal>-
NdisFreeBuffer( p_buf );<o:p></o:p></p>
<p class=MsoNormal>+
/* Unchain the NDIS buffer. */<o:p></o:p></p>
<p class=MsoNormal>+
NdisUnchainBufferAtFront( p_packet, &p_buf );<o:p></o:p></p>
<p class=MsoNormal>+
CL_ASSERT( p_buf );<o:p></o:p></p>
<p class=MsoNormal>+
/* Return the NDIS packet and NDIS buffer to their pools. */<o:p></o:p></p>
<p class=MsoNormal>+
NdisDprFreePacketNonInterlocked( p_packet );<o:p></o:p></p>
<p class=MsoNormal>+
NdisFreeBuffer( p_buf );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, (ipoib_cm_desc_t
*)p_desc );<o:p></o:p></p>
<p class=MsoNormal>-
status = endpt_cm_post_recv( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Post Recv QP failed\n" ) );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, (ipoib_cm_desc_t
*)p_desc );<o:p></o:p></p>
<p class=MsoNormal>+
status = endpt_cm_post_recv( p_port );<o:p></o:p></p>
<p class=MsoNormal>+
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Post Recv QP failed\n" ) );<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+
return;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( ReturnPutRecv );<o:p></o:p></p>
<p class=MsoNormal>-
__buf_mgr_put_recv( p_port, p_desc, cur_net_buffer_list );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, ReturnPutRecv );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
return NBL_cnt;<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
ReturnPutRecv );<o:p></o:p></p>
<p class=MsoNormal>+
__buf_mgr_put_recv( p_port, p_desc, cur_net_buffer_list );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, ReturnPutRecv );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ return NBL_cnt;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> void<o:p></o:p></p>
<p class=MsoNormal> ipoib_return_net_buffer_list(<o:p></o:p></p>
<p class=MsoNormal>-
IN
NDIS_HANDLE
adapter_context,<o:p></o:p></p>
<p class=MsoNormal>-
IN
NET_BUFFER_LIST
*p_net_buffer_lists,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ULONG
return_flags)<o:p></o:p></p>
<p class=MsoNormal>+
IN
NDIS_HANDLE
adapter_context,<o:p></o:p></p>
<p class=MsoNormal>+
IN
NET_BUFFER_LIST
*p_net_buffer_lists,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ULONG
return_flags)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></p>
<p class=MsoNormal>-
int32_t
shortage;<o:p></o:p></p>
<p class=MsoNormal>-
LONG
NBL_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( ReturnPacket );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( ReturnPutRecv );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( ReturnRepostRecv );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( ReturnPreparePkt );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( ReturnNdisIndicate );<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_t
*p_port;<o:p></o:p></p>
<p class=MsoNormal>+
int32_t
shortage;<o:p></o:p></p>
<p class=MsoNormal>+
LONG
NBL_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( ReturnPacket );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( ReturnPutRecv );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( ReturnRepostRecv );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( ReturnPreparePkt );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( ReturnNdisIndicate );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
UNUSED_PARAM( return_flags );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
p_port = ((ipoib_adapter_t*)adapter_context)->p_port;<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_net_buffer_lists );<o:p></o:p></p>
<p class=MsoNormal>-
if ( !p_port ) {<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(p_port);<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("return_NBL callback called when port pointer was already
cleared\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ UNUSED_PARAM( return_flags );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ p_port =
((ipoib_adapter_t*)adapter_context)->p_port;<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_net_buffer_lists );<o:p></o:p></p>
<p class=MsoNormal>+ if ( !p_port ) {<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(p_port);<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("return_NBL callback called when port
pointer was already cleared\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( ReturnPacket );<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>-
NBL_cnt = __free_received_NBL( p_port, p_net_buffer_lists );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( ReturnPacket );<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_acquire(
&p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+ NBL_cnt = __free_received_NBL( p_port,
p_net_buffer_lists );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
shutter_sub( &p_port->p_adapter->recv_shutter, -NBL_cnt );<o:p></o:p></p>
<p class=MsoNormal>+ shutter_sub(
&p_port->p_adapter->recv_shutter, -NBL_cnt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Repost buffers to HW */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( ReturnRepostRecv );<o:p></o:p></p>
<p class=MsoNormal>-
shortage = __recv_mgr_repost( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, ReturnRepostRecv );<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, ReturnPacket );<o:p></o:p></p>
<p class=MsoNormal>+ /* Repost buffers to HW */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( ReturnRepostRecv );<o:p></o:p></p>
<p class=MsoNormal>+ shortage = __recv_mgr_repost( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, ReturnRepostRecv );<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_release( &p_port->recv_lock
);<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, ReturnPacket );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void
* s_arg1 , void * s_arg2)<o:p></o:p></p>
<p class=MsoNormal>-{<o:p></o:p></p>
<p class=MsoNormal>+static BOOLEAN<o:p></o:p></p>
<p class=MsoNormal>+__recv_cb_internal(<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></p>
<p class=MsoNormal>+
IN
void
*cq_context,<o:p></o:p></p>
<p class=MsoNormal>+
IN
uint32_t
*p_recv_cnt<o:p></o:p></p>
<p class=MsoNormal>+ );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t *p_port = (ipoib_port_t *) context;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
UNREFERENCED_PARAMETER(p_gc_dpc);<o:p></o:p></p>
<p class=MsoNormal>-
UNREFERENCED_PARAMETER(s_arg1);<o:p></o:p></p>
<p class=MsoNormal>-
UNREFERENCED_PARAMETER(s_arg2);<o:p></o:p></p>
<p class=MsoNormal>+static void<o:p></o:p></p>
<p class=MsoNormal>+__iopoib_WorkItem(<o:p></o:p></p>
<p class=MsoNormal>+
IN
DEVICE_OBJECT*
p_dev_obj,<o:p></o:p></p>
<p class=MsoNormal>+
IN
void*
context )<o:p></o:p></p>
<p class=MsoNormal>+{<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_t *p_port = ( ipoib_port_t* )
context;<o:p></o:p></p>
<p class=MsoNormal>+ int WorkToDo = true;<o:p></o:p></p>
<p class=MsoNormal>+ KIRQL irql;<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t recv_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t total_recv_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
__recv_cb(NULL, p_port);<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_recv_cb );<o:p></o:p></p>
<p class=MsoNormal>+ UNREFERENCED_PARAMETER(p_dev_obj);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>+ while (WorkToDo &&
total_recv_cnt < 512) {<o:p></o:p></p>
<p class=MsoNormal>+ irql =
KeRaiseIrqlToDpcLevel();<o:p></o:p></p>
<p class=MsoNormal>+ WorkToDo =
__recv_cb_internal(NULL, p_port, &recv_cnt);<o:p></o:p></p>
<p class=MsoNormal>+
KeLowerIrql(irql);<o:p></o:p></p>
<p class=MsoNormal>+ total_recv_cnt
+= recv_cnt;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>+ if (WorkToDo) {<o:p></o:p></p>
<p class=MsoNormal>+ IoQueueWorkItem(
p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue, p_port);<o:p></o:p></p>
<p class=MsoNormal>+
} <o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-static void<o:p></o:p></p>
<p class=MsoNormal>-__recv_cb(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></p>
<p class=MsoNormal>-
IN
void
*cq_context )<o:p></o:p></p>
<p class=MsoNormal>+static BOOLEAN<o:p></o:p></p>
<p class=MsoNormal>+__recv_cb_internal(<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></p>
<p class=MsoNormal>+
IN
void
*cq_context,<o:p></o:p></p>
<p class=MsoNormal>+
IN
uint32_t*
p_recv_cnt)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
ib_wc_t
wc[MAX_RECV_WC], *p_free, *p_wc;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+
ib_wc_t
wc[MAX_RECV_WC], *p_free, *p_wc;<o:p></o:p></p>
<p class=MsoNormal>
int32_t
NBL_cnt, recv_cnt = 0, shortage, discarded;<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_t
done_list, bad_list;<o:p></o:p></p>
<p class=MsoNormal>-
size_t
i;<o:p></o:p></p>
<p class=MsoNormal>-
ULONG
recv_complete_flags = 0;<o:p></o:p></p>
<p class=MsoNormal>-
BOOLEAN
res;<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_t done_list,
bad_list;<o:p></o:p></p>
<p class=MsoNormal>+
size_t
i;<o:p></o:p></p>
<p class=MsoNormal>+
ULONG
recv_complete_flags = 0;<o:p></o:p></p>
<p class=MsoNormal>+ BOOLEAN
res;<o:p></o:p></p>
<p class=MsoNormal>+ BOOLEAN WorkToDo = FALSE;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( RecvCompBundle );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( RecvCb );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( PollRecv );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( RepostRecv );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( FilterRecv );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( BuildNBLArray );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( RecvNdisIndicate );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( RearmRecv );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( PutRecvList );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( RecvCompBundle );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( RecvCb );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( PollRecv );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( RepostRecv );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( FilterRecv );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( BuildNBLArray );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( RecvNdisIndicate );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( RearmRecv );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( PutRecvList );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_clr( RecvCompBundle );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_clr( RecvCompBundle );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( RecvCb );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( RecvCb );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
UNUSED_PARAM( h_cq );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+
NDIS_SET_SEND_COMPLETE_FLAG(recv_complete_flags,
NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
NDIS_SET_SEND_COMPLETE_FLAG(recv_complete_flags,
NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL );<o:p></o:p></p>
<p class=MsoNormal>+ p_port = (ipoib_port_t*)cq_context;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port = (ipoib_port_t*)cq_context;<o:p></o:p></p>
<p class=MsoNormal>+ cl_qlist_init( &done_list );<o:p></o:p></p>
<p class=MsoNormal>+ cl_qlist_init( &bad_list );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_init( &done_list );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_init( &bad_list );<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_ref( p_port, ref_recv_cb );<o:p></o:p></p>
<p class=MsoNormal>+ for( i = 0; i < MAX_RECV_WC; i++ )<o:p></o:p></p>
<p class=MsoNormal>+ wc[i].p_next =
&wc[i + 1];<o:p></o:p></p>
<p class=MsoNormal>+ wc[MAX_RECV_WC - 1].p_next = NULL;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_ref( p_port, ref_recv_cb );<o:p></o:p></p>
<p class=MsoNormal>-
for( i = 0; i < MAX_RECV_WC; i++ )<o:p></o:p></p>
<p class=MsoNormal>-
wc[i].p_next = &wc[i + 1];<o:p></o:p></p>
<p class=MsoNormal>-
wc[MAX_RECV_WC - 1].p_next = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * We'll be accessing the endpoint
map so take a reference<o:p></o:p></p>
<p class=MsoNormal>+ * on it to prevent modifications.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_atomic_inc( &p_port->endpt_rdr
);<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* We'll be accessing the endpoint map so take a reference<o:p></o:p></p>
<p class=MsoNormal>-
* on it to prevent modifications.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
cl_atomic_inc( &p_port->endpt_rdr );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ do<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* If we get
here, then the list of WCs is intact. */<o:p></o:p></p>
<p class=MsoNormal>+ p_free = wc;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
do<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* If we get here, then the list of WCs is intact. */<o:p></o:p></p>
<p class=MsoNormal>-
p_free = wc;<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
PollRecv );<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->poll_cq(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.h_recv_cq, &p_free, &p_wc );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, PollRecv );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
status == IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( PollRecv );<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->poll_cq(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_recv_cq, &p_free, &p_wc );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, PollRecv );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( status == IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></p>
<p class=MsoNormal>+ /* Look at the
payload now and filter ARP and DHCP packets. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
FilterRecv );<o:p></o:p></p>
<p class=MsoNormal>+ recv_cnt +=
__recv_mgr_filter( p_port, p_wc, &done_list, &bad_list );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, FilterRecv );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Look at the payload now and filter ARP and DHCP packets. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( FilterRecv );<o:p></o:p></p>
<p class=MsoNormal>-
recv_cnt += __recv_mgr_filter( p_port, p_wc, &done_list, &bad_list );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, FilterRecv );<o:p></o:p></p>
<p class=MsoNormal>+ } while( ( !p_free ) && (
recv_cnt < 128 )); //TODO restore back to 128<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
} while( ( !p_free ) && ( recv_cnt < 16 )); //TODO restore back to
128<o:p></o:p></p>
<p class=MsoNormal>+ *p_recv_cnt = (uint32_t)recv_cnt;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ /* We're done looking at the endpoint
map, release the reference. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_atomic_dec( &p_port->endpt_rdr
);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* We're done looking at the endpoint map, release the reference. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_atomic_dec( &p_port->endpt_rdr );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_log(
&p_port->p_adapter->perf, RecvCompBundle, recv_cnt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_log( &p_port->p_adapter->perf, RecvCompBundle, recv_cnt );<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_acquire(
&p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+ /* Update our posted depth. */<o:p></o:p></p>
<p class=MsoNormal>+ p_port->recv_mgr.depth -= recv_cnt;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Update our posted depth. */<o:p></o:p></p>
<p class=MsoNormal>-
p_port->recv_mgr.depth -= recv_cnt;<o:p></o:p></p>
<p class=MsoNormal>+ /* Return any discarded receives to the
pool */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( PutRecvList );<o:p></o:p></p>
<p class=MsoNormal>+ __buf_mgr_put_recv_list( p_port,
&bad_list );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, PutRecvList );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Return any discarded receives to the pool */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( PutRecvList );<o:p></o:p></p>
<p class=MsoNormal>-
__buf_mgr_put_recv_list( p_port, &bad_list );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, PutRecvList );<o:p></o:p></p>
<p class=MsoNormal>+ do<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ //int32_t cnt;<o:p></o:p></p>
<p class=MsoNormal>+ /* Repost ASAP
so we don't starve the RQ. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
RepostRecv );<o:p></o:p></p>
<p class=MsoNormal>+ shortage =
__recv_mgr_repost( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if( shortage
> 0 )<o:p></o:p></p>
<p class=MsoNormal>+
{
<o:p></o:p></p>
<p class=MsoNormal>+
recv_complete_flags |= NDIS_RECEIVE_FLAGS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>+
cl_dbg_out("Got SHORTAGE=%d\n",shortage);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, RepostRecv );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
do<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
//int32_t cnt;<o:p></o:p></p>
<p class=MsoNormal>-
/* Repost ASAP so we don't starve the RQ. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( RepostRecv );<o:p></o:p></p>
<p class=MsoNormal>-
shortage = __recv_mgr_repost( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( shortage > 0 )<o:p></o:p></p>
<p class=MsoNormal>-
{
<o:p></o:p></p>
<p class=MsoNormal>-
recv_complete_flags |= NDIS_RECEIVE_FLAGS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>-
cl_dbg_out("Got SHORTAGE=%d\n",shortage);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
BuildNBLArray );<o:p></o:p></p>
<p class=MsoNormal>+ /* Notify NDIS
of any and all possible receive buffers. */<o:p></o:p></p>
<p class=MsoNormal>+ NBL_cnt =
__recv_mgr_build_NBL_array(<o:p></o:p></p>
<p class=MsoNormal>+
p_port, &done_list, &discarded);<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, BuildNBLArray );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( BuildNBLArray );<o:p></o:p></p>
<p class=MsoNormal>-
/* Notify NDIS of any and all possible receive buffers. */<o:p></o:p></p>
<p class=MsoNormal>-
NBL_cnt = __recv_mgr_build_NBL_array(<o:p></o:p></p>
<p class=MsoNormal>-
p_port, &done_list, &discarded);<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, BuildNBLArray );<o:p></o:p></p>
<p class=MsoNormal>+ /* Only indicate
receives if we actually had any. */<o:p></o:p></p>
<p class=MsoNormal>+ if( discarded
&& shortage > 0 )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/* We may have thrown away packets, and have a shortage */<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_start( RepostRecv );<o:p></o:p></p>
<p class=MsoNormal>+
__recv_mgr_repost( p_port );<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Only indicate receives if we actually had any. */<o:p></o:p></p>
<p class=MsoNormal>-
if( discarded && shortage > 0 )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* We may have thrown away packets, and have a shortage */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( RepostRecv );<o:p></o:p></p>
<p class=MsoNormal>-
__recv_mgr_repost( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( !NBL_cnt ) {<o:p></o:p></p>
<p class=MsoNormal>+
//cl_dbg_out("NBL cnt == 0 :-(\n");<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( !NBL_cnt ) {<o:p></o:p></p>
<p class=MsoNormal>-
//cl_dbg_out("NBL cnt == 0 :-(\n");<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
RecvNdisIndicate );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if (shortage
<= 0) {<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( RecvNdisIndicate );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if (shortage <= 0) {<o:p></o:p></p>
<p class=MsoNormal>+
res = shutter_add( &p_port->p_adapter->recv_shutter, NBL_cnt );<o:p></o:p></p>
<p class=MsoNormal>+
if (res) {<o:p></o:p></p>
<p class=MsoNormal>+
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></p>
<p class=MsoNormal>+
NBL_cnt,<o:p></o:p></p>
<p class=MsoNormal>+
recv_complete_flags);<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
else {<o:p></o:p></p>
<p class=MsoNormal>+
__free_received_NBL (p_port, p_port->recv_mgr.recv_NBL_array[0]);<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+ } else {<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+
// If shortage >0, we already set the status to NDIS_RECEIVE_FLAGS_RESOURCES<o:p></o:p></p>
<p class=MsoNormal>+
// That is, IPoIB driver regain ownership of the NET_BUFFER_LIST structures
immediately<o:p></o:p></p>
<p class=MsoNormal>+
res = shutter_add( &p_port->p_adapter->recv_shutter, 1 );<o:p></o:p></p>
<p class=MsoNormal>+
if (res) {<o:p></o:p></p>
<p class=MsoNormal>+
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></p>
<p class=MsoNormal>+
NBL_cnt,<o:p></o:p></p>
<p class=MsoNormal>+
recv_complete_flags);<o:p></o:p></p>
<p class=MsoNormal>+
shutter_sub( &p_port->p_adapter->recv_shutter, -1 );<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
res = shutter_add( &p_port->p_adapter->recv_shutter, NBL_cnt );<o:p></o:p></p>
<p class=MsoNormal>-
if (res) {<o:p></o:p></p>
<p class=MsoNormal>-
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></p>
<p class=MsoNormal>-
NBL_cnt,<o:p></o:p></p>
<p class=MsoNormal>-
recv_complete_flags);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else {<o:p></o:p></p>
<p class=MsoNormal>-
__free_received_NBL (p_port, p_port->recv_mgr.recv_NBL_array[0]);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
} else {<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
// If shortage >0, we already set the status to NDIS_RECEIVE_FLAGS_RESOURCES<o:p></o:p></p>
<p class=MsoNormal>-
// That is, IPoIB driver regain ownership of the NET_BUFFER_LIST structures
immediately<o:p></o:p></p>
<p class=MsoNormal>-
res = shutter_add( &p_port->p_adapter->recv_shutter, 1 );<o:p></o:p></p>
<p class=MsoNormal>-
if (res) {<o:p></o:p></p>
<p class=MsoNormal>-
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></p>
<p class=MsoNormal>-
NBL_cnt,<o:p></o:p></p>
<p class=MsoNormal>-
recv_complete_flags);<o:p></o:p></p>
<p class=MsoNormal>-
shutter_sub( &p_port->p_adapter->recv_shutter, -1 );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, RecvNdisIndicate );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RecvNdisIndicate );<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Cap the
number of receives to put back to what we just indicated<o:p></o:p></p>
<p class=MsoNormal>+ * with
NDIS_STATUS_RESOURCES.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ if( shortage
> 0 )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Cap the number of receives to put back to what we just indicated<o:p></o:p></p>
<p class=MsoNormal>-
* with NDIS_STATUS_RESOURCES.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
if( shortage > 0 )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>+
cl_dbg_out("GOT SHORTAGE <===============\n");<o:p></o:p></p>
<p class=MsoNormal>+
/* Return all but the last packet to the pool. */<o:p></o:p></p>
<p class=MsoNormal>+
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+
//while( shortage-- > 1 )<o:p></o:p></p>
<p class=MsoNormal>+
while ( NBL_cnt-- > 0)<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
__buf_mgr_put_recv( p_port,<o:p></o:p></p>
<p class=MsoNormal>+
(ipoib_recv_desc_t *)IPOIB_RECV_FROM_NBL(
p_port->recv_mgr.recv_NBL_array[NBL_cnt] ),<o:p></o:p></p>
<p class=MsoNormal>+
p_port->recv_mgr.recv_NBL_array[NBL_cnt] );<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
__recv_mgr_repost( p_port );<o:p></o:p></p>
<p class=MsoNormal>+
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_dbg_out("GOT SHORTAGE <===============\n");<o:p></o:p></p>
<p class=MsoNormal>-
/* Return all but the last packet to the pool. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>-
//while( shortage-- > 1 )<o:p></o:p></p>
<p class=MsoNormal>-
while ( NBL_cnt-- > 0)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
__buf_mgr_put_recv( p_port,<o:p></o:p></p>
<p class=MsoNormal>-
(ipoib_recv_desc_t *)IPOIB_RECV_FROM_NBL(
p_port->recv_mgr.recv_NBL_array[NBL_cnt] ),<o:p></o:p></p>
<p class=MsoNormal>-
p_port->recv_mgr.recv_NBL_array[NBL_cnt] );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
__recv_mgr_repost( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+
/*<o:p></o:p></p>
<p class=MsoNormal>+
* Return the last packet as if NDIS returned it, so that we repost<o:p></o:p></p>
<p class=MsoNormal>+
* and report any other pending receives.<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal>+
//ipoib_return_net_buffer_list( p_port,
p_port->recv_mgr.recv_NBL_array[0],recv_complete_flags );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Return the last packet as if NDIS returned it, so that we repost<o:p></o:p></p>
<p class=MsoNormal>-
* and report any other pending receives.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
//ipoib_return_net_buffer_list( p_port,
p_port->recv_mgr.recv_NBL_array[0],recv_complete_flags );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+ } while( NBL_cnt );<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_release(
&p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
} while( NBL_cnt );<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+ if (p_free ) {<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Rearm
after filtering to prevent contention on the enpoint maps<o:p></o:p></p>
<p class=MsoNormal>+ * and
eliminate the possibility of having a call to<o:p></o:p></p>
<p class=MsoNormal>+ *
__endpt_mgr_insert find a duplicate.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(WorkToDo
== FALSE);<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
RearmRecv );<o:p></o:p></p>
<p class=MsoNormal>+ status = p_port->p_adapter->p_ifc->rearm_cq(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.h_recv_cq, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, RearmRecv );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
status == IB_SUCCESS );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if (p_free ) {<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Rearm after filtering to prevent contention on the enpoint maps<o:p></o:p></p>
<p class=MsoNormal>-
* and eliminate the possibility of having a call to<o:p></o:p></p>
<p class=MsoNormal>-
* __endpt_mgr_insert find a duplicate.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( RearmRecv );<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->rearm_cq(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_recv_cq, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RearmRecv );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_recv_cb );<o:p></o:p></p>
<p class=MsoNormal>+ } else {<o:p></o:p></p>
<p class=MsoNormal>+ // Please note
the reference is still up<o:p></o:p></p>
<p class=MsoNormal>+ if (h_cq) {<o:p></o:p></p>
<p class=MsoNormal>+
IoQueueWorkItem( p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue,
p_port);<o:p></o:p></p>
<p class=MsoNormal>+
WorkToDo = FALSE;<o:p></o:p></p>
<p class=MsoNormal>+ } else {<o:p></o:p></p>
<p class=MsoNormal>+
WorkToDo = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_recv_cb );<o:p></o:p></p>
<p class=MsoNormal>-
} else {<o:p></o:p></p>
<p class=MsoNormal>-
// Please note the reference is still up<o:p></o:p></p>
<p class=MsoNormal>-
KeInsertQueueDpc(&p_port->recv_dpc, NULL, NULL);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop( &p_port->p_adapter->perf,
RecvCb );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RecvCb );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ return WorkToDo;<o:p></o:p></p>
<p class=MsoNormal>+}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal>+static void<o:p></o:p></p>
<p class=MsoNormal>+__recv_cb(<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ib_cq_handle_t
h_cq,<o:p></o:p></p>
<p class=MsoNormal>+
IN
void
*cq_context )<o:p></o:p></p>
<p class=MsoNormal>+{<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t recv_cnt;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ __recv_cb_internal(h_cq, cq_context,
&recv_cnt);<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __recv_get_endpts(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_recv_desc_t* const
p_desc,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_wc_t* const
p_wc,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
ipoib_endpt_t**
const
pp_src,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
ipoib_endpt_t** const
pp_dst )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_wc_t*
const
p_wc,<o:p></o:p></p>
<p class=MsoNormal>+
OUT ipoib_endpt_t**
const pp_src,<o:p></o:p></p>
<p class=MsoNormal>+
OUT ipoib_endpt_t**
const pp_dst )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
mac_addr_t
mac;<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( GetEndptByGid );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( GetEndptByLid );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( EndptInsert );<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+
mac_addr_t mac;<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( GetEndptByGid );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( GetEndptByLid );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( EndptInsert );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Setup our shortcut pointers based on whether GRH is valid. */<o:p></o:p></p>
<p class=MsoNormal>-
if( p_wc->recv.ud.recv_opt & IB_RECV_OPT_GRH_VALID )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Lookup the source endpoints based on GID. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( GetEndptByGid );<o:p></o:p></p>
<p class=MsoNormal>-
*pp_src =<o:p></o:p></p>
<p class=MsoNormal>+ /* Setup our shortcut pointers based on
whether GRH is valid. */<o:p></o:p></p>
<p class=MsoNormal>+ if( p_wc->recv.ud.recv_opt &
IB_RECV_OPT_GRH_VALID )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* Lookup the
source endpoints based on GID. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
GetEndptByGid );<o:p></o:p></p>
<p class=MsoNormal>+ *pp_src =<o:p></o:p></p>
<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.src_gid );<o:p></o:p></p>
<p class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.src_gid );<o:p></o:p></p>
<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetEndptByGid );<o:p></o:p></p>
<p class=MsoNormal>+
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.src_gid );<o:p></o:p></p>
<p class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.src_gid );<o:p></o:p></p>
<p class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetEndptByGid );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Lookup the destination endpoint based on GID.<o:p></o:p></p>
<p class=MsoNormal>-
* This is used along with the packet filter to determine<o:p></o:p></p>
<p class=MsoNormal>-
* whether to report this to NDIS.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( GetEndptByGid );<o:p></o:p></p>
<p class=MsoNormal>-
*pp_dst =<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Lookup
the destination endpoint based on GID.<o:p></o:p></p>
<p class=MsoNormal>+ * This is
used along with the packet filter to determine<o:p></o:p></p>
<p class=MsoNormal>+ * whether
to report this to NDIS.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
GetEndptByGid );<o:p></o:p></p>
<p class=MsoNormal>+ *pp_dst =<o:p></o:p></p>
<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.dest_gid );<o:p></o:p></p>
<p class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.dest_gid );<o:p></o:p></p>
<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetEndptByGid );<o:p></o:p></p>
<p class=MsoNormal>+
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.dest_gid );<o:p></o:p></p>
<p class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.dest_gid );<o:p></o:p></p>
<p class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetEndptByGid );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Create the source endpoint if it does not exist. Note that we<o:p></o:p></p>
<p class=MsoNormal>-
* can only do this for globally routed traffic since we need the<o:p></o:p></p>
<p class=MsoNormal>-
* information from the GRH to generate the MAC.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
if( !*pp_src )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
status = ipoib_mac_from_guid(<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Create
the source endpoint if it does not exist. Note that we<o:p></o:p></p>
<p class=MsoNormal>+ * can only
do this for globally routed traffic since we need the<o:p></o:p></p>
<p class=MsoNormal>+ *
information from the GRH to generate the MAC.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ if( !*pp_src )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
status = ipoib_mac_from_guid(<o:p></o:p></p>
<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->buf.ib.grh.src_gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></p>
<p class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->p_buf->ib.grh.src_gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></p>
<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->buf.ib.grh.src_gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></p>
<p class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->p_buf->ib.grh.src_gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></p>
<p class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+
return;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Create the endpoint. */<o:p></o:p></p>
<p class=MsoNormal>+
/* Create the endpoint. */<o:p></o:p></p>
<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>
<p class=MsoNormal>-
*pp_src = ipoib_endpt_create( &p_desc->buf.ib.grh.src_gid,<o:p></o:p></p>
<p class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>-
*pp_src = ipoib_endpt_create( &p_desc->p_buf->ib.grh.src_gid,<o:p></o:p></p>
<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>-
p_wc->recv.ud.remote_lid, p_wc->recv.ud.remote_qp );<o:p></o:p></p>
<p class=MsoNormal>-
if( !*pp_src )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ipoib_endpt_create failed\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( EndptInsert );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
status = __endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__endpt_mgr_insert returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
*pp_src = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, EndptInsert );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Lookup the remote endpoint based on LID. Note that only<o:p></o:p></p>
<p class=MsoNormal>-
* unicast traffic can be LID routed.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( GetEndptByLid );<o:p></o:p></p>
<p class=MsoNormal>-
*pp_src = __endpt_mgr_get_by_lid( p_port, p_wc->recv.ud.remote_lid );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetEndptByLid );<o:p></o:p></p>
<p class=MsoNormal>-
*pp_dst = p_port->p_local_endpt;<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( *pp_dst );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
*pp_src = ipoib_endpt_create( &p_desc->buf.ib.grh.src_gid,<o:p></o:p></p>
<p class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+
*pp_src = ipoib_endpt_create( &p_desc->p_buf->ib.grh.src_gid,<o:p></o:p></p>
<p class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+
p_wc->recv.ud.remote_lid, p_wc->recv.ud.remote_qp );<o:p></o:p></p>
<p class=MsoNormal>+
if( !*pp_src )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ipoib_endpt_create failed\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_start( EndptInsert );<o:p></o:p></p>
<p class=MsoNormal>+
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
status = __endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></p>
<p class=MsoNormal>+
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__endpt_mgr_insert returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+
*pp_src = NULL;<o:p></o:p></p>
<p class=MsoNormal>+
return;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_stop( &p_port->p_adapter->perf, EndptInsert );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Lookup
the remote endpoint based on LID. Note that only<o:p></o:p></p>
<p class=MsoNormal>+ * unicast
traffic can be LID routed.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
GetEndptByLid );<o:p></o:p></p>
<p class=MsoNormal>+ *pp_src =
__endpt_mgr_get_by_lid( p_port, p_wc->recv.ud.remote_lid );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetEndptByLid );<o:p></o:p></p>
<p class=MsoNormal>+ *pp_dst =
p_port->p_local_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
*pp_dst );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( *pp_src && !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid )
&&<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Update the QPN for the endpoint. */<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>-
("Updating QPN for MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5]) );<o:p></o:p></p>
<p class=MsoNormal>-//
(*pp_src)->qpn = p_wc->recv.ud.remote_qp;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( *pp_src &&
!ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) &&<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* Update the
QPN for the endpoint. */<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>+
("Updating QPN for MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5]) );<o:p></o:p></p>
<p class=MsoNormal>+// (*pp_src)->qpn =
p_wc->recv.ud.remote_qp;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( *pp_src && *pp_dst )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>-
("Recv:\n"<o:p></o:p></p>
<p class=MsoNormal>-
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></p>
<p class=MsoNormal>-
"\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5],<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_dst )->mac.addr[0], (*pp_dst )->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_dst )->mac.addr[2], (*pp_dst )->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_dst )->mac.addr[4], (*pp_dst )->mac.addr[5]) );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( *pp_src && *pp_dst )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>+
("Recv:\n"<o:p></o:p></p>
<p class=MsoNormal>+
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></p>
<p class=MsoNormal>+
"\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5],<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_dst )->mac.addr[0], (*pp_dst )->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_dst
)->mac.addr[2], (*pp_dst )->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_dst )->mac.addr[4], (*pp_dst )->mac.addr[5]) );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static int32_t<o:p></o:p></p>
<p class=MsoNormal> __recv_mgr_filter(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_wc_t* const
p_done_wc_list,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
cl_qlist_t*
const
p_done_list,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
cl_qlist_t*
const
p_bad_list )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_wc_t*
const
p_done_wc_list,<o:p></o:p></p>
<p class=MsoNormal>+
OUT cl_qlist_t*
const p_done_list,<o:p></o:p></p>
<p class=MsoNormal>+
OUT cl_qlist_t*
const p_bad_list )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_recv_desc_t
*p_desc;<o:p></o:p></p>
<p class=MsoNormal>-
ib_wc_t
*p_wc;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_pkt_t
*p_ipoib;<o:p></o:p></p>
<p class=MsoNormal>-
eth_pkt_t
*p_eth;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t
*p_src, *p_dst;<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
len;<o:p></o:p></p>
<p class=MsoNormal>-
int32_t
recv_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( GetRecvEndpts );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( RecvGen );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( RecvTcp );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( RecvUdp );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( RecvDhcp );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( RecvArp );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_recv_desc_t *p_desc;<o:p></o:p></p>
<p class=MsoNormal>+
ib_wc_t
*p_wc;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_pkt_t
*p_ipoib;<o:p></o:p></p>
<p class=MsoNormal>+
eth_pkt_t
*p_eth;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_endpt_t
*p_src, *p_dst;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+
uint32_t
len;<o:p></o:p></p>
<p class=MsoNormal>+
int32_t
recv_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( GetRecvEndpts );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( RecvGen );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( RecvTcp );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( RecvUdp );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( RecvDhcp );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( RecvArp );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
for( p_wc = p_done_wc_list; p_wc; p_wc = p_wc->p_next )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_RECV
);<o:p></o:p></p>
<p class=MsoNormal>-
p_desc = (ipoib_recv_desc_t*)(uintn_t)p_wc->wr_id;<o:p></o:p></p>
<p class=MsoNormal>-
recv_cnt++;<o:p></o:p></p>
<p class=MsoNormal>+ for( p_wc = p_done_wc_list; p_wc; p_wc =
p_wc->p_next )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ p_desc =
(ipoib_recv_desc_t*)(uintn_t)p_wc->wr_id;<o:p></o:p></p>
<p class=MsoNormal>+ recv_cnt++;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_wc->status != IB_WCS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
if( p_wc->status != IB_WCS_WR_FLUSHED_ERR )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed completion %s (vendor specific %#x)\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ),<o:p></o:p></p>
<p class=MsoNormal>-
(int)p_wc->vendor_specific) );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>-
("Flushed completion %s\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status )) );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_DROPPED, 0, 0 );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>
<p class=MsoNormal>-
/* Dereference the port object on behalf of the failed receive. */<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_failed_recv_wc );<o:p></o:p></p>
<p class=MsoNormal>-
continue;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_wc->status != IB_WCS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
if( p_wc->status != IB_WCS_WR_FLUSHED_ERR )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed completion %s (vendor specific %#x)\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ),<o:p></o:p></p>
<p class=MsoNormal>+
(int)p_wc->vendor_specific) );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
else<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>+
("Flushed completion %s\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status )) );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_DROPPED, 0, 0 );<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>
<p class=MsoNormal>+
/* Dereference the port object on behalf of the failed receive. */<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_failed_recv_wc );<o:p></o:p></p>
<p class=MsoNormal>+
continue;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
len = p_wc->length - sizeof(ib_grh_t);<o:p></o:p></p>
<p class=MsoNormal>+ len =
p_wc->length - sizeof(ib_grh_t);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( len < sizeof(ipoib_hdr_t) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Received ETH packet < min size\n") );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></p>
<p class=MsoNormal>-
continue;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( len <
sizeof(ipoib_hdr_t) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Received ETH packet < min size\n") );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></p>
<p class=MsoNormal>+
continue;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if((len - sizeof(ipoib_hdr_t)) > p_port->p_adapter->params.payload_mtu)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Received ETH packet len %d > payload MTU (%d)\n",<o:p></o:p></p>
<p class=MsoNormal>-
(len - sizeof(ipoib_hdr_t)),<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->params.payload_mtu) );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></p>
<p class=MsoNormal>-
continue;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* Successful completion. Get the receive information. */<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->ndis_csum.Value = ( ( p_wc->recv.ud.recv_opt & IB_RECV_OPT_CSUM_MASK
) >> 8 );<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->len = len + 14 - 4 ;<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( GetRecvEndpts );<o:p></o:p></p>
<p class=MsoNormal>-
__recv_get_endpts( p_port, p_desc, p_wc, &p_src, &p_dst );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetRecvEndpts );<o:p></o:p></p>
<p class=MsoNormal>+ if((len -
sizeof(ipoib_hdr_t)) > p_port->p_adapter->params.payload_mtu)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Received ETH packet len %d > payload MTU (%d)\n",<o:p></o:p></p>
<p class=MsoNormal>+
(len - sizeof(ipoib_hdr_t)),<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->params.payload_mtu) );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></p>
<p class=MsoNormal>+
continue;<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ /* Successful
completion. Get the receive information. */<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->ndis_csum.Value = ( ( p_wc->recv.ud.recv_opt &
IB_RECV_OPT_CSUM_MASK ) >> 8 );<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->len =
len + 14 - 4 ;<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
GetRecvEndpts );<o:p></o:p></p>
<p class=MsoNormal>+
__recv_get_endpts( p_port, p_desc, p_wc, &p_src, &p_dst );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetRecvEndpts );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>
<p class=MsoNormal>-
p_ipoib = &p_desc->buf.ib.pkt;<o:p></o:p></p>
<p class=MsoNormal>-
p_eth = &p_desc->buf.eth.pkt;<o:p></o:p></p>
<p class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>-
p_ipoib = &p_desc->p_buf->ib.pkt;<o:p></o:p></p>
<p class=MsoNormal>-
p_eth = &p_desc->p_buf->eth.pkt;<o:p></o:p></p>
<p class=MsoNormal>-#endif /*IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+ p_ipoib =
&p_desc->buf.ib.pkt;<o:p></o:p></p>
<p class=MsoNormal>+ p_eth =
&p_desc->buf.eth.pkt;<o:p></o:p></p>
<p class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal>+ p_ipoib =
&p_desc->p_buf->ib.pkt;<o:p></o:p></p>
<p class=MsoNormal>+ p_eth =
&p_desc->p_buf->eth.pkt;<o:p></o:p></p>
<p class=MsoNormal>+#endif /*IPOIB_INLINE_RECV */<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_src )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Don't report loopback traffic - we requested SW loopback. */<o:p></o:p></p>
<p class=MsoNormal>-
if( !cl_memcmp( &p_port->p_adapter->params.conf_mac,<o:p></o:p></p>
<p class=MsoNormal>-
&p_src->mac, sizeof(p_port->p_adapter->params.conf_mac) ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* "This is not the packet you're looking for" - don't update<o:p></o:p></p>
<p class=MsoNormal>-
* receive statistics, the packet never happened.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>
<p class=MsoNormal>-
/* Dereference the port object on behalf of the failed recv. */<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_recv_loopback );<o:p></o:p></p>
<p class=MsoNormal>-
continue;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( p_src )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/* Don't report loopback traffic - we requested SW loopback. */<o:p></o:p></p>
<p class=MsoNormal>+
if( !cl_memcmp( &p_port->p_adapter->params.conf_mac,<o:p></o:p></p>
<p class=MsoNormal>+
&p_src->mac, sizeof(p_port->p_adapter->params.conf_mac) ) )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
/*<o:p></o:p></p>
<p class=MsoNormal>+
* "This is not the packet you're looking for" - don't update<o:p></o:p></p>
<p class=MsoNormal>+
* receive statistics, the packet never happened.<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>
<p class=MsoNormal>+
/* Dereference the port object on behalf of the failed recv. */<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_recv_loopback );<o:p></o:p></p>
<p class=MsoNormal>+
continue;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
switch( p_ipoib->hdr.type )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
case ETH_PROT_TYPE_IP:<o:p></o:p></p>
<p class=MsoNormal>-
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t)) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Received IP packet < min size\n") );<o:p></o:p></p>
<p class=MsoNormal>-
status = IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ switch(
p_ipoib->hdr.type )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ case
ETH_PROT_TYPE_IP:<o:p></o:p></p>
<p class=MsoNormal>+
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t)) )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Received IP packet < min size\n") );<o:p></o:p></p>
<p class=MsoNormal>+
status = IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_ipoib->type.ip.hdr.offset ||<o:p></o:p></p>
<p class=MsoNormal>-
p_ipoib->type.ip.hdr.prot != IP_PROT_UDP )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Unfiltered. Setup the ethernet header and report. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( RecvTcp );<o:p></o:p></p>
<p class=MsoNormal>-
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RecvTcp );<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
if( p_ipoib->type.ip.hdr.offset ||<o:p></o:p></p>
<p class=MsoNormal>+
p_ipoib->type.ip.hdr.prot != IP_PROT_UDP )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
/* Unfiltered. Setup the ethernet header and report. */<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_start( RecvTcp );<o:p></o:p></p>
<p class=MsoNormal>+
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_stop( &p_port->p_adapter->perf, RecvTcp );<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* First packet of a UDP transfer. */<o:p></o:p></p>
<p class=MsoNormal>-
if( len <<o:p></o:p></p>
<p class=MsoNormal>-
(sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t)) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Received UDP packet < min size\n") );<o:p></o:p></p>
<p class=MsoNormal>-
status = IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
/* First packet of a UDP transfer. */<o:p></o:p></p>
<p class=MsoNormal>+
if( len <<o:p></o:p></p>
<p class=MsoNormal>+
(sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t)) )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Received UDP packet < min
size\n") );<o:p></o:p></p>
<p class=MsoNormal>+
status = IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Check if DHCP conversion is required. */<o:p></o:p></p>
<p class=MsoNormal>-
if( (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_SERVER &&<o:p></o:p></p>
<p class=MsoNormal>-
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></p>
<p class=MsoNormal>-
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT &&<o:p></o:p></p>
<p class=MsoNormal>-
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_SERVER)||<o:p></o:p></p>
<p class=MsoNormal>-
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_PROXY_SERVER &&<o:p></o:p></p>
<p class=MsoNormal>-
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></p>
<p class=MsoNormal>-
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT &&<o:p></o:p></p>
<p class=MsoNormal>-
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_PROXY_SERVER))<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) +<o:p></o:p></p>
<p class=MsoNormal>-
sizeof(udp_hdr_t) + DHCP_MIN_SIZE) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Received DHCP < min size\n") );<o:p></o:p></p>
<p class=MsoNormal>-
status = IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if ((p_ipoib->type.ip.hdr.ver_hl & 0x0f) != 5 ) {<o:p></o:p></p>
<p class=MsoNormal>-
// If there are IP options in this message, we are in trouble in any case<o:p></o:p></p>
<p class=MsoNormal>-
status = IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>-
break;
<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* UDP packet with BOOTP ports in src/dst port numbers. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( RecvDhcp );<o:p></o:p></p>
<p class=MsoNormal>-
status = __recv_dhcp( p_port, p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RecvDhcp );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Unfiltered. Setup the ethernet header and report. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( RecvUdp );<o:p></o:p></p>
<p class=MsoNormal>-
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RecvUdp );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+
/* Check if DHCP conversion is required. */<o:p></o:p></p>
<p class=MsoNormal>+
if( (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_SERVER &&<o:p></o:p></p>
<p class=MsoNormal>+
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></p>
<p class=MsoNormal>+
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT &&<o:p></o:p></p>
<p class=MsoNormal>+
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_SERVER)||<o:p></o:p></p>
<p class=MsoNormal>+
(p_ipoib->type.ip.prot.udp.hdr.dst_port
== DHCP_PORT_PROXY_SERVER &&<o:p></o:p></p>
<p class=MsoNormal>+
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></p>
<p class=MsoNormal>+
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT &&<o:p></o:p></p>
<p class=MsoNormal>+
p_ipoib->type.ip.prot.udp.hdr.src_port ==
DHCP_PORT_PROXY_SERVER))<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) +<o:p></o:p></p>
<p class=MsoNormal>+
sizeof(udp_hdr_t) + DHCP_MIN_SIZE) )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Received DHCP < min size\n") );<o:p></o:p></p>
<p class=MsoNormal>+
status = IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
if ((p_ipoib->type.ip.hdr.ver_hl & 0x0f) != 5 ) {<o:p></o:p></p>
<p class=MsoNormal>+
// If there are IP options in this message, we are in trouble in any case<o:p></o:p></p>
<p class=MsoNormal>+
status = IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+
break;
<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
/* UDP packet with BOOTP ports in src/dst port numbers. */<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_start( RecvDhcp );<o:p></o:p></p>
<p class=MsoNormal>+
status = __recv_dhcp( p_port, p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_stop( &p_port->p_adapter->perf, RecvDhcp );<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
else<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
/* Unfiltered. Setup the ethernet header and report. */<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_start( RecvUdp );<o:p></o:p></p>
<p class=MsoNormal>+
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_stop( &p_port->p_adapter->perf,
RecvUdp );<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
case ETH_PROT_TYPE_ARP:<o:p></o:p></p>
<p class=MsoNormal>-
if( len < (sizeof(ipoib_hdr_t) + sizeof(ipoib_arp_pkt_t)) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Received ARP < min size\n") );<o:p></o:p></p>
<p class=MsoNormal>-
status = IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( RecvArp );<o:p></o:p></p>
<p class=MsoNormal>-
status = __recv_arp( p_port, p_wc, p_ipoib, p_eth, &p_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RecvArp );<o:p></o:p></p>
<p class=MsoNormal>-
len = sizeof(ipoib_hdr_t) + sizeof(arp_pkt_t);<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ case
ETH_PROT_TYPE_ARP:<o:p></o:p></p>
<p class=MsoNormal>+
if( len < (sizeof(ipoib_hdr_t) + sizeof(ipoib_arp_pkt_t)) )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Received
ARP < min size\n") );<o:p></o:p></p>
<p class=MsoNormal>+
status = IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_start( RecvArp );<o:p></o:p></p>
<p class=MsoNormal>+
status = __recv_arp( p_port, p_wc, p_ipoib, p_eth, &p_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_stop(
&p_port->p_adapter->perf, RecvArp );<o:p></o:p></p>
<p class=MsoNormal>+
len = sizeof(ipoib_hdr_t) + sizeof(arp_pkt_t);<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
default:<o:p></o:p></p>
<p class=MsoNormal>-
/* Unfiltered. Setup the ethernet header and report. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( RecvGen );<o:p></o:p></p>
<p class=MsoNormal>-
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RecvGen );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ default:<o:p></o:p></p>
<p class=MsoNormal>+
/* Unfiltered. Setup the ethernet header and report. */<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_start( RecvGen );<o:p></o:p></p>
<p class=MsoNormal>+
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_stop( &p_port->p_adapter->perf, RecvGen );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Update stats. */<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>
<p class=MsoNormal>-
/* Dereference the port object on behalf of the failed receive. */<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_recv_filter );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ip_stat_sel_t
ip_stat;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->len =<o:p></o:p></p>
<p class=MsoNormal>-
len + sizeof(eth_hdr_t) - sizeof(ipoib_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>-
if( p_dst->h_mcast)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
if( p_dst->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></p>
<p class=MsoNormal>-
p_dst->dgid.multicast.raw_group_id[11] == 0xFF &&<o:p></o:p></p>
<p class=MsoNormal>-
p_dst->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></p>
<p class=MsoNormal>-
p_dst->dgid.multicast.raw_group_id[13] == 0xFF )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->type = PKT_TYPE_BCAST;<o:p></o:p></p>
<p class=MsoNormal>-
ip_stat = IP_STAT_BCAST_BYTES;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->type = PKT_TYPE_MCAST;<o:p></o:p></p>
<p class=MsoNormal>-
ip_stat = IP_STAT_MCAST_BYTES;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->type = PKT_TYPE_UCAST;<o:p></o:p></p>
<p class=MsoNormal>-
ip_stat = IP_STAT_UCAST_BYTES;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_tail( p_done_list, &p_desc->item.list_item );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_inc_recv_stat( p_port->p_adapter, ip_stat, p_desc->len, 1 ); <o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( status !=
IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/* Update stats. */<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>
<p class=MsoNormal>+
/* Dereference the port object on behalf of the failed receive. */<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_recv_filter );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ip_stat_sel_t
ip_stat;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->len =<o:p></o:p></p>
<p class=MsoNormal>+
len + sizeof(eth_hdr_t) - sizeof(ipoib_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>+
if( p_dst->h_mcast)<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
if( p_dst->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></p>
<p class=MsoNormal>+
p_dst->dgid.multicast.raw_group_id[11] == 0xFF &&<o:p></o:p></p>
<p class=MsoNormal>+
p_dst->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></p>
<p class=MsoNormal>+
p_dst->dgid.multicast.raw_group_id[13] == 0xFF )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->type = PKT_TYPE_BCAST;<o:p></o:p></p>
<p class=MsoNormal>+
ip_stat = IP_STAT_BCAST_BYTES;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
else<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->type = PKT_TYPE_MCAST;<o:p></o:p></p>
<p class=MsoNormal>+
ip_stat = IP_STAT_MCAST_BYTES;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
else<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->type = PKT_TYPE_UCAST;<o:p></o:p></p>
<p class=MsoNormal>+
ip_stat = IP_STAT_UCAST_BYTES;<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_tail( p_done_list, &p_desc->item.list_item );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_inc_recv_stat( p_port->p_adapter, ip_stat, p_desc->len, 1 ); <o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>-
return recv_cnt;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ return recv_cnt;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __recv_gen(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
eth_pkt_t* const
p_eth,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t* const
p_src,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_dst )<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ipoib_pkt_t*
const p_ipoib,<o:p></o:p></p>
<p class=MsoNormal>+
OUT eth_pkt_t*
const p_eth,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_src,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_dst )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( !p_src || !p_dst )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Received packet with no matching endpoints.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_NOT_DONE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_src || !p_dst )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Received packet with no matching endpoints.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_NOT_DONE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Fill in the ethernet header. Note that doing so will overwrite<o:p></o:p></p>
<p class=MsoNormal>-
* the IPoIB header, so start by moving the information from the IPoIB<o:p></o:p></p>
<p class=MsoNormal>-
* header.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
p_eth->hdr.type = p_ipoib->hdr.type;<o:p></o:p></p>
<p class=MsoNormal>-
p_eth->hdr.src = p_src->mac;<o:p></o:p></p>
<p class=MsoNormal>-
p_eth->hdr.dst = p_dst->mac;<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Fill in the ethernet
header. Note that doing so will overwrite<o:p></o:p></p>
<p class=MsoNormal>+ * the IPoIB header, so start by
moving the information from the IPoIB<o:p></o:p></p>
<p class=MsoNormal>+ * header.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ p_eth->hdr.type =
p_ipoib->hdr.type;<o:p></o:p></p>
<p class=MsoNormal>+ p_eth->hdr.src = p_src->mac;<o:p></o:p></p>
<p class=MsoNormal>+ p_eth->hdr.dst = p_dst->mac;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if ( p_eth->hdr.dst.addr[0] == 1 && <o:p></o:p></p>
<p class=MsoNormal>-
p_eth->hdr.type == ETH_PROT_TYPE_IP &&<o:p></o:p></p>
<p class=MsoNormal>-
p_eth->hdr.dst.addr[2] == 0x5E) <o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_eth->hdr.dst.addr[1] = 0;<o:p></o:p></p>
<p class=MsoNormal>-
p_eth->hdr.dst.addr[3] = p_eth->hdr.dst.addr[3] & 0x7f;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if (p_dst->h_mcast)<o:p></o:p></p>
<p class=MsoNormal>-
p_dst->is_in_use = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ if ( p_eth->hdr.dst.addr[0] == 1
&& <o:p></o:p></p>
<p class=MsoNormal>+
p_eth->hdr.type == ETH_PROT_TYPE_IP &&<o:p></o:p></p>
<p class=MsoNormal>+
p_eth->hdr.dst.addr[2] == 0x5E) <o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_eth->hdr.dst.addr[1] = 0;<o:p></o:p></p>
<p class=MsoNormal>+
p_eth->hdr.dst.addr[3] = p_eth->hdr.dst.addr[3] & 0x7f;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ if (p_dst->h_mcast)<o:p></o:p></p>
<p class=MsoNormal>+
p_dst->is_in_use = TRUE;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __recv_dhcp(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
eth_pkt_t*
const
p_eth,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t* const
p_src,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_dst )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ipoib_pkt_t*
const p_ipoib,<o:p></o:p></p>
<p class=MsoNormal>+
OUT eth_pkt_t*
const p_eth,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_src,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_dst )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
dhcp_pkt_t
*p_dhcp;<o:p></o:p></p>
<p class=MsoNormal>-
uint8_t
*p_option;<o:p></o:p></p>
<p class=MsoNormal>-
uint8_t
*p_cid = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
uint8_t
msg = 0;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+
dhcp_pkt_t *p_dhcp;<o:p></o:p></p>
<p class=MsoNormal>+
uint8_t
*p_option;<o:p></o:p></p>
<p class=MsoNormal>+
uint8_t
*p_cid = NULL;<o:p></o:p></p>
<p class=MsoNormal>+
uint8_t
msg = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
UNUSED_PARAM( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ UNUSED_PARAM( p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Create the ethernet header. */<o:p></o:p></p>
<p class=MsoNormal>-
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__recv_gen returned %s.\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Create the ethernet header. */<o:p></o:p></p>
<p class=MsoNormal>+ status = __recv_gen( p_ipoib, p_eth,
p_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__recv_gen returned %s.\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Fixup the payload. */<o:p></o:p></p>
<p class=MsoNormal>-
p_dhcp = &p_eth->type.ip.prot.udp.dhcp;<o:p></o:p></p>
<p class=MsoNormal>-
if( p_dhcp->op != DHCP_REQUEST && p_dhcp->op != DHCP_REPLY )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Invalid DHCP op code.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Fixup the payload. */<o:p></o:p></p>
<p class=MsoNormal>+ p_dhcp =
&p_eth->type.ip.prot.udp.dhcp;<o:p></o:p></p>
<p class=MsoNormal>+ if( p_dhcp->op != DHCP_REQUEST
&& p_dhcp->op != DHCP_REPLY )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Invalid DHCP op code.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Find the client identifier option, making sure to skip<o:p></o:p></p>
<p class=MsoNormal>-
* the "magic cookie".<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
p_option = &p_dhcp->options[0];<o:p></o:p></p>
<p class=MsoNormal>-
if ( *(uint32_t *)p_option != DHCP_COOKIE )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("DHCP cookie corrupted.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INVALID_PARAMETER;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Find the client identifier
option, making sure to skip<o:p></o:p></p>
<p class=MsoNormal>+ * the "magic cookie".<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ p_option = &p_dhcp->options[0];<o:p></o:p></p>
<p class=MsoNormal>+ if ( *(uint32_t *)p_option !=
DHCP_COOKIE )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("DHCP cookie corrupted.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INVALID_PARAMETER;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_option = &p_dhcp->options[DHCP_COOKIE_SIZE];<o:p></o:p></p>
<p class=MsoNormal>-
while( *p_option != DHCP_OPT_END && p_option <
&p_dhcp->options[312] )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
switch( *p_option )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
case DHCP_OPT_PAD:<o:p></o:p></p>
<p class=MsoNormal>-
p_option++;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ p_option =
&p_dhcp->options[DHCP_COOKIE_SIZE];<o:p></o:p></p>
<p class=MsoNormal>+ while( *p_option != DHCP_OPT_END
&& p_option < &p_dhcp->options[312] )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ switch(
*p_option )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ case
DHCP_OPT_PAD:<o:p></o:p></p>
<p class=MsoNormal>+
p_option++;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
case DHCP_OPT_MSG:<o:p></o:p></p>
<p class=MsoNormal>-
msg = p_option[2];<o:p></o:p></p>
<p class=MsoNormal>-
p_option += 3;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ case
DHCP_OPT_MSG:<o:p></o:p></p>
<p class=MsoNormal>+
msg = p_option[2];<o:p></o:p></p>
<p class=MsoNormal>+
p_option += 3;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
case DHCP_OPT_CLIENT_ID:<o:p></o:p></p>
<p class=MsoNormal>-
p_cid = p_option;<o:p></o:p></p>
<p class=MsoNormal>-
/* Fall through. */<o:p></o:p></p>
<p class=MsoNormal>+ case
DHCP_OPT_CLIENT_ID:<o:p></o:p></p>
<p class=MsoNormal>+
p_cid = p_option;<o:p></o:p></p>
<p class=MsoNormal>+
/* Fall through. */<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
default:<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* All other options have a length byte following the option code.<o:p></o:p></p>
<p class=MsoNormal>-
* Offset by the length to get to the next option.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
p_option += (p_option[1] + 2);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ default:<o:p></o:p></p>
<p class=MsoNormal>+
/*<o:p></o:p></p>
<p class=MsoNormal>+
* All other options have a length byte following the option code.<o:p></o:p></p>
<p class=MsoNormal>+
* Offset by the length to get to the next option.<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal>+
p_option += (p_option[1] + 2);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
switch( msg )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* message from client */<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPDISCOVER:<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPREQUEST:<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPDECLINE:<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPRELEASE:<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPINFORM:<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_cid )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to find required Client-identifier option.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if( p_dhcp->htype != DHCP_HW_TYPE_IB )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Invalid hardware address type.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
/* message from DHCP server */<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPOFFER:<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPACK:<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPNAK:<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ switch( msg )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* message from client */<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPDISCOVER:<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPREQUEST:<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPDECLINE:<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPRELEASE:<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPINFORM:<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_cid )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to find required Client-identifier option.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_dhcp->htype != DHCP_HW_TYPE_IB )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Invalid hardware address type.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ /* message from DHCP server */<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPOFFER:<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPACK:<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPNAK:<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
default:<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Invalide message type.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INVALID_PARAMETER;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
p_eth->type.ip.prot.udp.hdr.chksum = 0;<o:p></o:p></p>
<p class=MsoNormal>-
p_dhcp->htype = DHCP_HW_TYPE_ETH;<o:p></o:p></p>
<p class=MsoNormal>-
p_dhcp->hlen = HW_ADDR_LEN;<o:p></o:p></p>
<p class=MsoNormal>+ default:<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Invalide message type.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INVALID_PARAMETER;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ p_eth->type.ip.prot.udp.hdr.chksum =
0;<o:p></o:p></p>
<p class=MsoNormal>+ p_dhcp->htype = DHCP_HW_TYPE_ETH;<o:p></o:p></p>
<p class=MsoNormal>+ p_dhcp->hlen = HW_ADDR_LEN;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_cid ) /* from client */<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Validate that the length and type of the option is as required. */<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>-
("DHCP CID received is:"));<o:p></o:p></p>
<p class=MsoNormal>-
for (int i=0; i < coIPoIB_CID_TotalLen; ++i) {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>-
("[%d] 0x%x: \n",i, p_cid[i]));<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if( p_cid[1] != coIPoIB_CID_Len )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Client-identifier length is not equal to %d as
required.\n",coIPoIB_CID_Len) );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if( p_cid[2] != coIPoIB_HwTypeIB)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Client-identifier type is %d <> %d and wrong \n", p_cid[2],
coIPoIB_HwTypeIB) );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Copy the GID value from the option so that we can make aligned<o:p></o:p></p>
<p class=MsoNormal>-
* accesses to the contents.<o:p></o:p></p>
<p class=MsoNormal>-
* Recover CID to standard type.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
p_cid[1] = sizeof (ib_net64_t) + 1;// CID length <o:p></o:p></p>
<p class=MsoNormal>-
p_cid[2] = DHCP_HW_TYPE_ETH;// CID type<o:p></o:p></p>
<p class=MsoNormal>-
//Copy the GUID to the 3-d byte of CID<o:p></o:p></p>
<p class=MsoNormal>-
RtlMoveMemory( &p_cid[3], &p_cid[coIPoIB_CID_TotalLen - sizeof
(ib_net64_t)], sizeof (ib_net64_t) );<o:p></o:p></p>
<p class=MsoNormal>-
// Clear the rest<o:p></o:p></p>
<p class=MsoNormal>-
RtlFillMemory(&p_cid[3+sizeof (ib_net64_t)],coIPoIB_CID_TotalLen - 3 -sizeof
(ib_net64_t), 0);<o:p></o:p></p>
<p class=MsoNormal>+ if( p_cid ) /* from client */<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* Validate that
the length and type of the option is as required. */<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>+
("DHCP CID received is:"));<o:p></o:p></p>
<p class=MsoNormal>+ for (int i=0; i
< coIPoIB_CID_TotalLen; ++i) {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>+
("[%d] 0x%x: \n",i, p_cid[i]));<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ if( p_cid[1] !=
coIPoIB_CID_Len )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Client-identifier length is not equal to %d as
required.\n",coIPoIB_CID_Len) );<o:p></o:p></p>
<p class=MsoNormal>+
return IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ if( p_cid[2] !=
coIPoIB_HwTypeIB)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Client-identifier type is %d <> %d and wrong \n", p_cid[2],
coIPoIB_HwTypeIB) );<o:p></o:p></p>
<p class=MsoNormal>+
return IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Copy the
GID value from the option so that we can make aligned<o:p></o:p></p>
<p class=MsoNormal>+ * accesses
to the contents.<o:p></o:p></p>
<p class=MsoNormal>+ * Recover
CID to standard type.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ p_cid[1] =
sizeof (ib_net64_t) + 1;// CID length <o:p></o:p></p>
<p class=MsoNormal>+ p_cid[2] =
DHCP_HW_TYPE_ETH;// CID type<o:p></o:p></p>
<p class=MsoNormal>+ //Copy the GUID
to the 3-d byte of CID<o:p></o:p></p>
<p class=MsoNormal>+ RtlMoveMemory(
&p_cid[3], &p_cid[coIPoIB_CID_TotalLen - sizeof (ib_net64_t)], sizeof
(ib_net64_t) );<o:p></o:p></p>
<p class=MsoNormal>+ // Clear the
rest<o:p></o:p></p>
<p class=MsoNormal>+
RtlFillMemory(&p_cid[3+sizeof (ib_net64_t)],coIPoIB_CID_TotalLen - 3
-sizeof (ib_net64_t), 0);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
RtlCopyMemory( p_dhcp->chaddr, &p_src->mac, sizeof(p_src->mac) );<o:p></o:p></p>
<p class=MsoNormal>-
RtlFillMemory( &p_dhcp->chaddr[sizeof(p_src->mac)],<o:p></o:p></p>
<p class=MsoNormal>-
( sizeof(p_dhcp->chaddr) -
sizeof(p_src->mac) ), 0 );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>+ RtlCopyMemory(
p_dhcp->chaddr, &p_src->mac, sizeof(p_src->mac) );<o:p></o:p></p>
<p class=MsoNormal>+ RtlFillMemory(
&p_dhcp->chaddr[sizeof(p_src->mac)],<o:p></o:p></p>
<p class=MsoNormal>+
( sizeof(p_dhcp->chaddr) - sizeof(p_src->mac) ), 0 );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __recv_arp(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_wc_t* const
p_wc,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
eth_pkt_t*
const
p_eth,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t**
const
pp_src,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t* const
p_dst )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_wc_t*
const
p_wc,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ipoib_pkt_t*
const p_ipoib,<o:p></o:p></p>
<p class=MsoNormal>+
OUT eth_pkt_t*
const p_eth,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t** const pp_src,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_dst )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
arp_pkt_t
*p_arp;<o:p></o:p></p>
<p class=MsoNormal>-
const ipoib_arp_pkt_t *p_ib_arp;<o:p></o:p></p>
<p class=MsoNormal>-
ib_gid_t
gid;<o:p></o:p></p>
<p class=MsoNormal>-
mac_addr_t
mac;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_hw_addr_t
null_hw = {0};<o:p></o:p></p>
<p class=MsoNormal>-
uint8_t
cm_capable = 0;<o:p></o:p></p>
<p class=MsoNormal>+
ib_api_status_t status;<o:p></o:p></p>
<p class=MsoNormal>+
arp_pkt_t
*p_arp;<o:p></o:p></p>
<p class=MsoNormal>+ const ipoib_arp_pkt_t *p_ib_arp;<o:p></o:p></p>
<p class=MsoNormal>+
ib_gid_t
gid;<o:p></o:p></p>
<p class=MsoNormal>+
mac_addr_t
mac;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_hw_addr_t null_hw = {0};<o:p></o:p></p>
<p class=MsoNormal>+
uint8_t
cm_capable = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( !p_dst )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Unknown destination endpoint\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_dst )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Unknown destination endpoint\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_ib_arp = &p_ipoib->type.arp;<o:p></o:p></p>
<p class=MsoNormal>-
p_arp = &p_eth->type.arp;<o:p></o:p></p>
<p class=MsoNormal>+ p_ib_arp = &p_ipoib->type.arp;<o:p></o:p></p>
<p class=MsoNormal>+ p_arp = &p_eth->type.arp;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_ib_arp->hw_type != ARP_HW_TYPE_IB )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ARP hardware type is not IB\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( p_ib_arp->hw_type !=
ARP_HW_TYPE_IB )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ARP hardware type is not IB\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_ib_arp->hw_size != sizeof(ipoib_hw_addr_t) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ARP hardware address size is not sizeof(ipoib_hw_addr_t)\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( p_ib_arp->hw_size !=
sizeof(ipoib_hw_addr_t) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ARP hardware address size is not sizeof(ipoib_hw_addr_t)\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_ib_arp->prot_type != ETH_PROT_TYPE_IP )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ARP protocal type not IP\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( p_ib_arp->prot_type !=
ETH_PROT_TYPE_IP )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ARP protocal type not
IP\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cm_capable = ipoib_addr_get_flags( &p_ib_arp->src_hw );<o:p></o:p></p>
<p class=MsoNormal>+ cm_capable = ipoib_addr_get_flags(
&p_ib_arp->src_hw );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* If we don't have a source, lookup the endpoint specified in the payload.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
if( !*pp_src )<o:p></o:p></p>
<p class=MsoNormal>-
*pp_src = __endpt_mgr_get_by_gid( p_port, &p_ib_arp->src_hw.gid );<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * If we don't have a source,
lookup the endpoint specified in the payload.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ if( !*pp_src )<o:p></o:p></p>
<p class=MsoNormal>+ *pp_src =
__endpt_mgr_get_by_gid( p_port, &p_ib_arp->src_hw.gid );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* If the endpoint exists for the GID, make sure<o:p></o:p></p>
<p class=MsoNormal>-
* the dlid and qpn match the arp.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
if( *pp_src )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
if( cl_memcmp( &(*pp_src)->dgid, &p_ib_arp->src_hw.gid,<o:p></o:p></p>
<p class=MsoNormal>-
sizeof(ib_gid_t) ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* GIDs for the endpoint are different. The ARP must<o:p></o:p></p>
<p class=MsoNormal>-
* have been proxied. Dereference it.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
*pp_src = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else if( (*pp_src)->dlid &&<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_src)->dlid != p_wc->recv.ud.remote_lid )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>
<p class=MsoNormal>-
*pp_src = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else if ( ! ((*pp_src)->dlid)) {<o:p></o:p></p>
<p class=MsoNormal>-
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>
<p class=MsoNormal>-
*pp_src = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else if( ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
if( (*pp_src)->qpn != ipoib_addr_get_qpn( &p_ib_arp->src_hw )
&&<o:p></o:p></p>
<p class=MsoNormal>-
p_wc->recv.ud.remote_qp != ipoib_addr_get_qpn(
&p_ib_arp->src_hw ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>
<p class=MsoNormal>-
*pp_src = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else if( (*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>
<p class=MsoNormal>-
*pp_src = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * If the endpoint exists for the
GID, make sure<o:p></o:p></p>
<p class=MsoNormal>+ * the dlid and qpn match the arp.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ if( *pp_src )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ if( cl_memcmp(
&(*pp_src)->dgid, &p_ib_arp->src_hw.gid,<o:p></o:p></p>
<p class=MsoNormal>+
sizeof(ib_gid_t) ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/*<o:p></o:p></p>
<p class=MsoNormal>+
* GIDs for the endpoint are different. The ARP must<o:p></o:p></p>
<p class=MsoNormal>+
* have been proxied. Dereference it.<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal>+
*pp_src = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else if(
(*pp_src)->dlid &&<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_src)->dlid != p_wc->recv.ud.remote_lid )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></p>
<p class=MsoNormal>+
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>
<p class=MsoNormal>+
*pp_src = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else if ( !
((*pp_src)->dlid)) {<o:p></o:p></p>
<p class=MsoNormal>+
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></p>
<p class=MsoNormal>+
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>
<p class=MsoNormal>+
*pp_src = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else if(
ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
if( (*pp_src)->qpn != ipoib_addr_get_qpn( &p_ib_arp->src_hw )
&&<o:p></o:p></p>
<p class=MsoNormal>+
p_wc->recv.ud.remote_qp != ipoib_addr_get_qpn( &p_ib_arp->src_hw ) )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
/* Out of date!
Destroy the endpoint and replace it. */<o:p></o:p></p>
<p class=MsoNormal>+
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>
<p class=MsoNormal>+
*pp_src = NULL;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else if(
(*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/* Out of
date! Destroy the endpoint and replace it. */<o:p></o:p></p>
<p class=MsoNormal>+
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>
<p class=MsoNormal>+
*pp_src = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Do we need to create an endpoint for this GID? */<o:p></o:p></p>
<p class=MsoNormal>-
if( !*pp_src )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Copy the src GID to allow aligned access */<o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( &gid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) );<o:p></o:p></p>
<p class=MsoNormal>-
status = ipoib_mac_from_guid( gid.unicast.interface_id, p_port->p_adapter->params.guid_mask,
&mac );<o:p></o:p></p>
<p class=MsoNormal>-
if (status == IB_INVALID_GUID_MASK)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Invalid GUID mask received, rejecting it") );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_create_log(p_port->p_adapter->h_adapter, GUID_MASK_LOG_INDEX,
EVENT_IPOIB_WRONG_PARAMETER_WRN);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Create the endpoint.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
*pp_src = ipoib_endpt_create( &p_ib_arp->src_hw.gid,<o:p></o:p></p>
<p class=MsoNormal>-
p_wc->recv.ud.remote_lid, ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></p>
<p class=MsoNormal>+ /* Do we need to create an endpoint for
this GID? */<o:p></o:p></p>
<p class=MsoNormal>+ if( !*pp_src )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* Copy the src
GID to allow aligned access */<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy(
&gid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) );<o:p></o:p></p>
<p class=MsoNormal>+ status =
ipoib_mac_from_guid( gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></p>
<p class=MsoNormal>+ if (status ==
IB_INVALID_GUID_MASK)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Invalid GUID mask received, rejecting it") );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_create_log(p_port->p_adapter->h_adapter, GUID_MASK_LOG_INDEX,
EVENT_IPOIB_WRONG_PARAMETER_WRN);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else if( status
!= IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+
return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Create
the endpoint.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ *pp_src =
ipoib_endpt_create( &p_ib_arp->src_hw.gid,<o:p></o:p></p>
<p class=MsoNormal>+
p_wc->recv.ud.remote_lid, ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( !*pp_src )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ipoib_endpt_create failed\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( !*pp_src )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ipoib_endpt_create failed\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
status = __endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__endpt_mgr_insert return %s \n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ status = __endpt_mgr_insert(
p_port, mac, *pp_src );<o:p></o:p></p>
<p class=MsoNormal>+ if( status !=
IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__endpt_mgr_insert return %s \n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+
return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
(*pp_src)->cm_flag = cm_capable;<o:p></o:p></p>
<p class=MsoNormal>+ (*pp_src)->cm_flag = cm_capable;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( !cl_memcmp(<o:p></o:p></p>
<p class=MsoNormal>-
&(*pp_src)->dgid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) ) );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) ||<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_src)->qpn == ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( !cl_memcmp(<o:p></o:p></p>
<p class=MsoNormal>+
&(*pp_src)->dgid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) )
);<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( ipoib_is_voltaire_router_gid(
&(*pp_src)->dgid ) ||<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_src)->qpn == ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled &&<o:p></o:p></p>
<p class=MsoNormal>-
p_ib_arp->op == ARP_OP_REQ &&<o:p></o:p></p>
<p class=MsoNormal>-
cm_capable == IPOIB_CM_FLAG_RC )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* if we've got ARP request and RC flag is set, <o:p></o:p></p>
<p class=MsoNormal>-
save SID for connect REQ to be sent in ARP reply<o:p></o:p></p>
<p class=MsoNormal>-
when requestor's path get resolved */<o:p></o:p></p>
<p class=MsoNormal>-
if( endpt_cm_get_state( (*pp_src) ) == IPOIB_CM_DISCONNECTED )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_src)->cm_flag = cm_capable;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_addr_set_sid( <o:p></o:p></p>
<p class=MsoNormal>-
&(*pp_src)->conn.service_id,<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled &&<o:p></o:p></p>
<p class=MsoNormal>+ p_ib_arp->op
== ARP_OP_REQ &&<o:p></o:p></p>
<p class=MsoNormal>+ cm_capable ==
IPOIB_CM_FLAG_RC )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* if we've got
ARP request and RC flag is set, <o:p></o:p></p>
<p class=MsoNormal>+ save SID for connect
REQ to be sent in ARP reply<o:p></o:p></p>
<p class=MsoNormal>+ when requestor's
path get resolved */<o:p></o:p></p>
<p class=MsoNormal>+ if(
endpt_cm_get_state( (*pp_src) ) == IPOIB_CM_DISCONNECTED )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_src)->cm_flag = cm_capable;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_addr_set_sid( <o:p></o:p></p>
<p class=MsoNormal>+
&(*pp_src)->conn.service_id,<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> #if 0 //DBG<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
(" ARP %s from ENDPT[%p] state %d CM cap: %d QPN: %#x MAC:
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>
<p class=MsoNormal>-
((p_ib_arp->op == ARP_OP_REQ )? "REQUEST" : "REPLY"),<o:p></o:p></p>
<p class=MsoNormal>-
*pp_src, endpt_cm_get_state( *pp_src ), <o:p></o:p></p>
<p class=MsoNormal>-
((cm_capable == IPOIB_CM_FLAG_RC)? 1: 0),<o:p></o:p></p>
<p class=MsoNormal>-
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->src_hw ) ),<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_src)->mac.addr[0], (*pp_src)->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_src)->mac.addr[2], (*pp_src)->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_src)->mac.addr[4], (*pp_src)->mac.addr[5] ));<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+
(" ARP %s from ENDPT[%p] state %d CM cap: %d QPN: %#x MAC:
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>
<p class=MsoNormal>+
((p_ib_arp->op == ARP_OP_REQ )? "REQUEST" : "REPLY"),<o:p></o:p></p>
<p class=MsoNormal>+
*pp_src, endpt_cm_get_state( *pp_src ), <o:p></o:p></p>
<p class=MsoNormal>+
((cm_capable == IPOIB_CM_FLAG_RC)? 1: 0),<o:p></o:p></p>
<p class=MsoNormal>+
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->src_hw ) ),<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_src)->mac.addr[0], (*pp_src)->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_src)->mac.addr[2], (*pp_src)->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_src)->mac.addr[4], (*pp_src)->mac.addr[5] ));<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Now swizzle the data. */<o:p></o:p></p>
<p class=MsoNormal>-
p_arp->hw_type = ARP_HW_TYPE_ETH;<o:p></o:p></p>
<p class=MsoNormal>-
p_arp->hw_size = sizeof(mac_addr_t);<o:p></o:p></p>
<p class=MsoNormal>-
p_arp->src_hw = (*pp_src)->mac;<o:p></o:p></p>
<p class=MsoNormal>-
p_arp->src_ip = p_ib_arp->src_ip;<o:p></o:p></p>
<p class=MsoNormal>+ /* Now swizzle the data. */<o:p></o:p></p>
<p class=MsoNormal>+ p_arp->hw_type = ARP_HW_TYPE_ETH;<o:p></o:p></p>
<p class=MsoNormal>+ p_arp->hw_size = sizeof(mac_addr_t);<o:p></o:p></p>
<p class=MsoNormal>+ p_arp->src_hw = (*pp_src)->mac;<o:p></o:p></p>
<p class=MsoNormal>+ p_arp->src_ip = p_ib_arp->src_ip;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( cl_memcmp( &p_ib_arp->dst_hw, &null_hw, sizeof(ipoib_hw_addr_t)
) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
if( cl_memcmp( &p_dst->dgid, &p_ib_arp->dst_hw.gid, sizeof(ib_gid_t)
) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* We received bcast ARP packet that means<o:p></o:p></p>
<p class=MsoNormal>-
* remote port lets everyone know it was changed IP/MAC<o:p></o:p></p>
<p class=MsoNormal>-
* or just activated<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>+ if( cl_memcmp( &p_ib_arp->dst_hw,
&null_hw, sizeof(ipoib_hw_addr_t) ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ if( cl_memcmp(
&p_dst->dgid, &p_ib_arp->dst_hw.gid, sizeof(ib_gid_t) ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/*<o:p></o:p></p>
<p class=MsoNormal>+
* We received bcast ARP packet that means<o:p></o:p></p>
<p class=MsoNormal>+
* remote port lets everyone know it
was changed IP/MAC<o:p></o:p></p>
<p class=MsoNormal>+
* or just activated<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Guy: TODO: Check why this check fails in case of Voltaire IPR */<o:p></o:p></p>
<p class=MsoNormal>+
/* Guy: TODO: Check why this check fails in case of Voltaire IPR */<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if ( !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) &&<o:p></o:p></p>
<p class=MsoNormal>-
!ib_gid_is_multicast( (const ib_gid_t*)&p_dst->dgid ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ARP: is not ARP MCAST\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
if ( !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) &&<o:p></o:p></p>
<p class=MsoNormal>+
!ib_gid_is_multicast( (const ib_gid_t*)&p_dst->dgid ) )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ARP:
is not ARP MCAST\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_arp->dst_hw = p_port->p_local_endpt->mac;<o:p></o:p></p>
<p class=MsoNormal>-
p_dst->mac = p_port->p_local_endpt->mac;<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* we don't care what receiver ip addr is,<o:p></o:p></p>
<p class=MsoNormal>-
* as long as OS' ARP table is global ???<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
p_arp->dst_ip = (net32_t)0;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else /* we've got reply to our ARP request */<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_arp->dst_hw = p_dst->mac;<o:p></o:p></p>
<p class=MsoNormal>-
p_arp->dst_ip = p_ib_arp->dst_ip;<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_dst->qpn == ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else /* we got ARP reqeust */<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_memclr( &p_arp->dst_hw, sizeof(mac_addr_t) );<o:p></o:p></p>
<p class=MsoNormal>-
p_arp->dst_ip = p_ib_arp->dst_ip;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
p_arp->dst_hw = p_port->p_local_endpt->mac;<o:p></o:p></p>
<p class=MsoNormal>+
p_dst->mac = p_port->p_local_endpt->mac;<o:p></o:p></p>
<p class=MsoNormal>+
/*<o:p></o:p></p>
<p class=MsoNormal>+
* we don't care what receiver ip addr is,<o:p></o:p></p>
<p class=MsoNormal>+
* as long as OS' ARP table is global ???<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal>+
p_arp->dst_ip = (net32_t)0;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else /* we've
got reply to our ARP request */<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_arp->dst_hw = p_dst->mac;<o:p></o:p></p>
<p class=MsoNormal>+
p_arp->dst_ip = p_ib_arp->dst_ip;<o:p></o:p></p>
<p class=MsoNormal>+
CL_ASSERT( p_dst->qpn == ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else /* we got ARP reqeust */<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_memclr(
&p_arp->dst_hw, sizeof(mac_addr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ p_arp->dst_ip
= p_ib_arp->dst_ip;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Create the ethernet header. Note that this is done last so that<o:p></o:p></p>
<p class=MsoNormal>-
* we have a chance to create a new endpoint.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
status = __recv_gen( p_ipoib, p_eth, *pp_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__recv_gen returned %s.\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Create the ethernet
header. Note that this is done last so that<o:p></o:p></p>
<p class=MsoNormal>+ * we have a chance to create a new
endpoint.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ status = __recv_gen( p_ipoib, p_eth,
*pp_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__recv_gen returned %s.\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __recv_mgr_prepare_NBL(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_recv_desc_t* const
p_desc,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
NET_BUFFER_LIST** const
pp_net_buffer_list )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc,<o:p></o:p></p>
<p class=MsoNormal>+
OUT NET_BUFFER_LIST**
const pp_net_buffer_list )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
pkt_filter;<o:p></o:p></p>
<p class=MsoNormal>-
//NDIS60<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO chksum;<o:p></o:p></p>
<p class=MsoNormal>-
//NDIS_TCP_IP_CHECKSUM_PACKET_INFO
chksum;<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>+
uint32_t
pkt_filter;<o:p></o:p></p>
<p class=MsoNormal>+ //NDIS60<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO chksum;<o:p></o:p></p>
<p class=MsoNormal>+ //NDIS_TCP_IP_CHECKSUM_PACKET_INFO
chksum;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( GetNdisPkt );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( GetNdisPkt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
pkt_filter = p_port->p_adapter->packet_filter;<o:p></o:p></p>
<p class=MsoNormal>-
/* Check the packet filter. */<o:p></o:p></p>
<p class=MsoNormal>-
switch( p_desc->type )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
default:<o:p></o:p></p>
<p class=MsoNormal>-
case PKT_TYPE_UCAST:<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></p>
<p class=MsoNormal>-
pkt_filter & NDIS_PACKET_TYPE_ALL_FUNCTIONAL ||<o:p></o:p></p>
<p class=MsoNormal>-
pkt_filter & NDIS_PACKET_TYPE_SOURCE_ROUTING ||<o:p></o:p></p>
<p class=MsoNormal>-
pkt_filter & NDIS_PACKET_TYPE_DIRECTED )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* OK to report. */<o:p></o:p></p>
<p class=MsoNormal>-
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Received UCAST PKT.\n"));<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Received UCAST PKT with ERROR !!!!\n"));<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
case PKT_TYPE_BCAST:<o:p></o:p></p>
<p class=MsoNormal>-
if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></p>
<p class=MsoNormal>-
pkt_filter & NDIS_PACKET_TYPE_BROADCAST )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* OK to report. */<o:p></o:p></p>
<p class=MsoNormal>-
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>-
("Received BCAST PKT.\n"));<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Received BCAST PKT with ERROR !!!!\n"));<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
case PKT_TYPE_MCAST:<o:p></o:p></p>
<p class=MsoNormal>-
if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></p>
<p class=MsoNormal>-
pkt_filter & NDIS_PACKET_TYPE_ALL_MULTICAST ||<o:p></o:p></p>
<p class=MsoNormal>-
pkt_filter & NDIS_PACKET_TYPE_MULTICAST )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* OK to report. */<o:p></o:p></p>
<p class=MsoNormal>-
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>-
("Received UCAST PKT.\n"));<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Received MCAST PKT with ERROR !!!!\n"));<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ pkt_filter =
p_port->p_adapter->packet_filter;<o:p></o:p></p>
<p class=MsoNormal>+ /* Check the packet filter. */<o:p></o:p></p>
<p class=MsoNormal>+ switch( p_desc->type )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ default:<o:p></o:p></p>
<p class=MsoNormal>+ case PKT_TYPE_UCAST:<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if( pkt_filter
& NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></p>
<p class=MsoNormal>+
pkt_filter & NDIS_PACKET_TYPE_ALL_FUNCTIONAL ||<o:p></o:p></p>
<p class=MsoNormal>+
pkt_filter & NDIS_PACKET_TYPE_SOURCE_ROUTING ||<o:p></o:p></p>
<p class=MsoNormal>+
pkt_filter & NDIS_PACKET_TYPE_DIRECTED )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/* OK to report. */<o:p></o:p></p>
<p class=MsoNormal>+
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Received UCAST PKT.\n"));<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Received UCAST PKT with ERROR !!!!\n"));<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ case PKT_TYPE_BCAST:<o:p></o:p></p>
<p class=MsoNormal>+ if( pkt_filter
& NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></p>
<p class=MsoNormal>+
pkt_filter & NDIS_PACKET_TYPE_BROADCAST )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/* OK to report. */<o:p></o:p></p>
<p class=MsoNormal>+
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>+
("Received BCAST PKT.\n"));<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Received BCAST PKT with ERROR !!!!\n"));<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ case PKT_TYPE_MCAST:<o:p></o:p></p>
<p class=MsoNormal>+ if( pkt_filter
& NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></p>
<p class=MsoNormal>+
pkt_filter & NDIS_PACKET_TYPE_ALL_MULTICAST ||<o:p></o:p></p>
<p class=MsoNormal>+
pkt_filter & NDIS_PACKET_TYPE_MULTICAST )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/* OK to report. */<o:p></o:p></p>
<p class=MsoNormal>+
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>
<p class=MsoNormal>+
("Received UCAST PKT.\n"));<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Received MCAST PKT with ERROR !!!!\n"));<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Return the receive descriptor to the pool. */<o:p></o:p></p>
<p class=MsoNormal>-
__buf_mgr_put_recv( p_port, p_desc, NULL );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Packet filter doesn't match receive. Dropping.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Return IB_NOT_DONE since the packet has been completed,<o:p></o:p></p>
<p class=MsoNormal>-
* but has not consumed an array entry.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
return IB_NOT_DONE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* Return the
receive descriptor to the pool. */<o:p></o:p></p>
<p class=MsoNormal>+
__buf_mgr_put_recv( p_port, p_desc, NULL );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Packet filter doesn't match receive. Dropping.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Return
IB_NOT_DONE since the packet has been completed,<o:p></o:p></p>
<p class=MsoNormal>+ * but has
not consumed an array entry.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_NOT_DONE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( GetNdisPkt );<o:p></o:p></p>
<p class=MsoNormal>-
*pp_net_buffer_list = __buf_mgr_get_NBL( p_port, p_desc );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetNdisPkt );<o:p></o:p></p>
<p class=MsoNormal>-
if( !*pp_net_buffer_list )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__buf_mgr_get_NBL failed\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( GetNdisPkt );<o:p></o:p></p>
<p class=MsoNormal>+ *pp_net_buffer_list = __buf_mgr_get_NBL(
p_port, p_desc );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetNdisPkt );<o:p></o:p></p>
<p class=MsoNormal>+ if( !*pp_net_buffer_list )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__buf_mgr_get_NBL failed\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
chksum.Value = 0;<o:p></o:p></p>
<p class=MsoNormal>+ chksum.Value = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
PNET_BUFFER NetBuffer = NET_BUFFER_LIST_FIRST_NB(*pp_net_buffer_list);<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_DATA_LENGTH(NetBuffer) = p_desc->len;<o:p></o:p></p>
<p class=MsoNormal>+ PNET_BUFFER NetBuffer =
NET_BUFFER_LIST_FIRST_NB(*pp_net_buffer_list);<o:p></o:p></p>
<p class=MsoNormal>+ NET_BUFFER_DATA_LENGTH(NetBuffer) =
p_desc->len;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
switch( p_port->p_adapter->params.recv_chksum_offload )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
default:<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
case CSUM_DISABLED:<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) = <o:p></o:p></p>
<p class=MsoNormal>-
(void*)(uintn_t)chksum.Value;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
case CSUM_ENABLED:<o:p></o:p></p>
<p class=MsoNormal>-
/* Get the checksums directly from packet information. */<o:p></o:p></p>
<p class=MsoNormal>-
/* In this case, no one of cheksum's cat get false value */<o:p></o:p></p>
<p class=MsoNormal>-
/* If hardware checksum failed or wasn't calculated, NDIS will recalculate it
again */<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) =<o:p></o:p></p>
<p class=MsoNormal>-
(void*)(uintn_t)(p_desc->ndis_csum.Value);<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
case CSUM_BYPASS:<o:p></o:p></p>
<p class=MsoNormal>-
/* Flag the checksums as having been calculated. */<o:p></o:p></p>
<p class=MsoNormal>-
chksum.Receive.TcpChecksumSucceeded = <o:p></o:p></p>
<p class=MsoNormal>-
chksum.Receive.UdpChecksumSucceeded = <o:p></o:p></p>
<p class=MsoNormal>-
chksum.Receive.IpChecksumSucceeded = TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) =<o:p></o:p></p>
<p class=MsoNormal>-
(void*)(uintn_t)chksum.Value;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ switch(
p_port->p_adapter->params.recv_chksum_offload )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ default:<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( FALSE
);<o:p></o:p></p>
<p class=MsoNormal>+ case CSUM_DISABLED:<o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) = <o:p></o:p></p>
<p class=MsoNormal>+
(void*)(uintn_t)chksum.Value;<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ case CSUM_ENABLED:<o:p></o:p></p>
<p class=MsoNormal>+ /* Get the
checksums directly from packet information. */<o:p></o:p></p>
<p class=MsoNormal>+ /* In this case,
no one of cheksum's cat get false value */<o:p></o:p></p>
<p class=MsoNormal>+ /* If hardware
checksum failed or wasn't calculated, NDIS will recalculate it again */<o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo)
=<o:p></o:p></p>
<p class=MsoNormal>+
(void*)(uintn_t)(p_desc->ndis_csum.Value);<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ case CSUM_BYPASS:<o:p></o:p></p>
<p class=MsoNormal>+ /* Flag the
checksums as having been calculated. */<o:p></o:p></p>
<p class=MsoNormal>+
chksum.Receive.TcpChecksumSucceeded = <o:p></o:p></p>
<p class=MsoNormal>+ chksum.Receive.UdpChecksumSucceeded
= <o:p></o:p></p>
<p class=MsoNormal>+
chksum.Receive.IpChecksumSucceeded = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) =<o:p></o:p></p>
<p class=MsoNormal>+
(void*)(uintn_t)chksum.Value;<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static uint32_t<o:p></o:p></p>
<p class=MsoNormal> __recv_mgr_build_NBL_array(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
cl_qlist_t*
p_done_list OPTIONAL,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
int32_t* const
p_discarded)<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
OUT
cl_qlist_t*
p_done_list OPTIONAL,<o:p></o:p></p>
<p class=MsoNormal>+ OUT
int32_t*
const
p_discarded)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
cl_list_item_t
*p_item;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_recv_desc_t
*p_desc;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
i = 0;<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( PreparePkt );<o:p></o:p></p>
<p class=MsoNormal>+
cl_list_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_recv_desc_t *p_desc;<o:p></o:p></p>
<p class=MsoNormal>+
uint32_t
i = 0;<o:p></o:p></p>
<p class=MsoNormal>+
ib_api_status_t status;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( PreparePkt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
*p_discarded = 0;<o:p></o:p></p>
<p class=MsoNormal>+ *p_discarded = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Move any existing receives to the head of p_done_list to preserve ordering.
*/<o:p></o:p></p>
<p class=MsoNormal>-
if ( p_done_list ) {<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_list_head( p_done_list, &p_port->recv_mgr.done_list );<o:p></o:p></p>
<p class=MsoNormal>-
} else {<o:p></o:p></p>
<p class=MsoNormal>-
p_done_list = &p_port->recv_mgr.done_list;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qlist_remove_head( p_done_list );<o:p></o:p></p>
<p class=MsoNormal>-
while( p_item != cl_qlist_end( p_done_list ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc = (ipoib_recv_desc_t*)p_item;<o:p></o:p></p>
<p class=MsoNormal>+ /* Move any existing receives to the
head of p_done_list to preserve ordering. */<o:p></o:p></p>
<p class=MsoNormal>+ if ( p_done_list ) {<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_list_head( p_done_list, &p_port->recv_mgr.done_list );<o:p></o:p></p>
<p class=MsoNormal>+ } else {<o:p></o:p></p>
<p class=MsoNormal>+ p_done_list =
&p_port->recv_mgr.done_list;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ p_item = cl_qlist_remove_head(
p_done_list );<o:p></o:p></p>
<p class=MsoNormal>+ while( p_item != cl_qlist_end(
p_done_list ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_desc =
(ipoib_recv_desc_t*)p_item;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( PreparePkt );<o:p></o:p></p>
<p class=MsoNormal>-
status = __recv_mgr_prepare_NBL( p_port, p_desc,<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, PreparePkt );<o:p></o:p></p>
<p class=MsoNormal>-
if( status == IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
PreparePkt );<o:p></o:p></p>
<p class=MsoNormal>+ status = __recv_mgr_prepare_NBL(
p_port, p_desc,<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, PreparePkt );<o:p></o:p></p>
<p class=MsoNormal>+ if( status ==
IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
CL_ASSERT( p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if (i) {<o:p></o:p></p>
<p class=MsoNormal>-
// Link NBLs together<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST_NEXT_NBL(p_port->recv_mgr.recv_NBL_array[i-1]) = <o:p></o:p></p>
<p class=MsoNormal>-
p_port->recv_mgr.recv_NBL_array[i];<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
i++;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else if( status == IB_NOT_DONE )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
(*p_discarded)++;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__recv_mgr_prepare_NBL returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
/* Put all completed receives on the port's done list. */<o:p></o:p></p>
<p class=MsoNormal>-
if ( p_done_list != &p_port->recv_mgr.done_list) {<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_tail( &p_port->recv_mgr.done_list, p_item );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_list_tail( &p_port->recv_mgr.done_list, p_done_list );<o:p></o:p></p>
<p class=MsoNormal>-
} else {<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_head( &p_port->recv_mgr.done_list, p_item );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
if (i) {<o:p></o:p></p>
<p class=MsoNormal>+
// Link NBLs together<o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER_LIST_NEXT_NBL(p_port->recv_mgr.recv_NBL_array[i-1]) = <o:p></o:p></p>
<p class=MsoNormal>+
p_port->recv_mgr.recv_NBL_array[i];<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
i++;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else if( status
== IB_NOT_DONE )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
(*p_discarded)++;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__recv_mgr_prepare_NBL returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+
/* Put all completed receives on the port's done list. */<o:p></o:p></p>
<p class=MsoNormal>+
if ( p_done_list != &p_port->recv_mgr.done_list) {<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_tail( &p_port->recv_mgr.done_list, p_item );<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_list_tail( &p_port->recv_mgr.done_list, p_done_list );<o:p></o:p></p>
<p class=MsoNormal>+
} else {<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_head( &p_port->recv_mgr.done_list, p_item );<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qlist_remove_head( p_done_list );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ p_item =
cl_qlist_remove_head( p_done_list );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>-
return i;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>
<p class=MsoNormal>+ return i;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>@@ -3234,180 +3281,180 @@<o:p></o:p></p>
<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_construct(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->send_mgr.depth = 0;<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_init( &p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qpool_construct( &p_port->send_mgr.send_pool );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_desc = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ p_port->send_mgr.depth = 0;<o:p></o:p></p>
<p class=MsoNormal>+ cl_qlist_init(
&p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class=MsoNormal>+ cl_qpool_construct(
&p_port->send_mgr.send_pool );<o:p></o:p></p>
<p class=MsoNormal>+ p_port->p_desc = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_init(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
cl_status_t
cl_status;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER(IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ cl_status_t
cl_status;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER(IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
static const size_t cPoolDeltaSize(1024);<o:p></o:p></p>
<p class=MsoNormal>-
static const ULONG
MaxNumBuffers(16384);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
/* Allocate the pool for async NETBUF flow (process_sg_list) */<o:p></o:p></p>
<p class=MsoNormal>-
cl_status = cl_qpool_init( &p_port->send_mgr.sg_pool,<o:p></o:p></p>
<p class=MsoNormal>-
MaxNumBuffers,<o:p></o:p></p>
<p class=MsoNormal>-
0, cPoolDeltaSize, sizeof(cl_pool_item_t) + p_port->p_adapter->sg_list_size,
NULL, NULL, p_port );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO EVENT_IPOIB_SEND_POOL<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></p>
<p class=MsoNormal>-
cl_status) );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ static const size_t
cPoolDeltaSize(1024);<o:p></o:p></p>
<p class=MsoNormal>+ static const ULONG
MaxNumBuffers(16384);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ /* Allocate the pool for async NETBUF
flow (process_sg_list) */<o:p></o:p></p>
<p class=MsoNormal>+ cl_status = cl_qpool_init(
&p_port->send_mgr.sg_pool,<o:p></o:p></p>
<p class=MsoNormal>+ MaxNumBuffers,<o:p></o:p></p>
<p class=MsoNormal>+ 0,
cPoolDeltaSize, sizeof(cl_pool_item_t) + p_port->p_adapter->sg_list_size,
NULL, NULL, p_port );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ NdisWriteErrorLogEntry(
p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO EVENT_IPOIB_SEND_POOL<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></p>
<p class=MsoNormal>+
cl_status) );<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_status = cl_qpool_init( &p_port->send_mgr.send_pool,<o:p></o:p></p>
<p class=MsoNormal>-
MaxNumBuffers,<o:p></o:p></p>
<p class=MsoNormal>-
0, cPoolDeltaSize, sizeof(ipoib_send_NB_SG), NULL, NULL, p_port );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO EVENT_IPOIB_SEND_POOL<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></p>
<p class=MsoNormal>-
cl_status) );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ cl_status = cl_qpool_init(
&p_port->send_mgr.send_pool,<o:p></o:p></p>
<p class=MsoNormal>+ MaxNumBuffers,<o:p></o:p></p>
<p class=MsoNormal>+ 0,
cPoolDeltaSize, sizeof(ipoib_send_NB_SG), NULL, NULL, p_port );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO EVENT_IPOIB_SEND_POOL<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></p>
<p class=MsoNormal>+
cl_status) );<o:p></o:p></p>
<p class=MsoNormal>+
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
//This send descriptor can't be allocated on the stack because of boundary
violation !!!<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_desc = <o:p></o:p></p>
<p class=MsoNormal>-
(ipoib_send_desc_t *)ExAllocatePoolWithTag(NonPagedPool ,sizeof
(ipoib_send_desc_t), 'XMXA');<o:p></o:p></p>
<p class=MsoNormal>-
if (!p_port->p_desc) {<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_RECV_POOL, 1, CL_INSUFFICIENT_MEMORY); //TODO EVENT_IPOIB_SEND_POOL<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Allocation of send descriptor failed\n") );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></p>
<p class=MsoNormal>-
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ //This send descriptor can't be
allocated on the stack because of boundary violation !!!<o:p></o:p></p>
<p class=MsoNormal>+ p_port->p_desc = <o:p></o:p></p>
<p class=MsoNormal>+
(ipoib_send_desc_t *)ExAllocatePoolWithTag(NonPagedPool ,sizeof
(ipoib_send_desc_t), 'XMXA');<o:p></o:p></p>
<p class=MsoNormal>+ if (!p_port->p_desc) {<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_RECV_POOL, 1, CL_INSUFFICIENT_MEMORY); //TODO EVENT_IPOIB_SEND_POOL<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR,
IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Allocation of send descriptor failed\n") );<o:p></o:p></p>
<p class=MsoNormal>+
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></p>
<p class=MsoNormal>+
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void <o:p></o:p></p>
<p class=MsoNormal> __pending_list_destroy(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
cl_list_item_t
*p_item;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_NB_SG *s_buf;<o:p></o:p></p>
<p class=MsoNormal>-
ULONG
send_complete_flags = NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL;<o:p></o:p></p>
<p class=MsoNormal>+
cl_list_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_NB_SG
*s_buf;<o:p></o:p></p>
<p class=MsoNormal>+
ULONG
send_complete_flags = NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Complete any pending packets. */<o:p></o:p></p>
<p class=MsoNormal>-
for( p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class=MsoNormal>-
p_item != cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(s_buf->p_port == p_port);<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(s_buf->p_nbl);<o:p></o:p></p>
<p class=MsoNormal>+ /* Complete any pending packets. */<o:p></o:p></p>
<p class=MsoNormal>+ for( p_item = cl_qlist_remove_head(
&p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class=MsoNormal>+ p_item !=
cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class=MsoNormal>+ p_item =
cl_qlist_remove_head( &p_port->send_mgr.pending_list ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ s_buf =
(ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(s_buf->p_port == p_port);<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(s_buf->p_nbl);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
//TODO<o:p></o:p></p>
<p class=MsoNormal>-
//__send_complete_net_buffer(s_buf, NDIS_STATUS_RESET_IN_PROGRESS,send_complete_flags,TRUE);<o:p></o:p></p>
<p class=MsoNormal>-
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE,send_complete_flags,TRUE);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ //TODO<o:p></o:p></p>
<p class=MsoNormal>+
//__send_complete_net_buffer(s_buf,
NDIS_STATUS_RESET_IN_PROGRESS,send_complete_flags,TRUE);<o:p></o:p></p>
<p class=MsoNormal>+
__send_complete_net_buffer(s_buf,
NDIS_STATUS_FAILURE,send_complete_flags,TRUE);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_destroy(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
//Destroy pending list and put all the send buffers back to pool<o:p></o:p></p>
<p class=MsoNormal>-
//The list should be already destroyed at this point<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(p_port->send_mgr.pending_list.count == 0);<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>-
__pending_list_destroy(p_port);<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ //Destroy pending list and put all the
send buffers back to pool<o:p></o:p></p>
<p class=MsoNormal>+ //The list should be already destroyed
at this point<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(p_port->send_mgr.pending_list.count == 0);<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+ __pending_list_destroy(p_port);<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
// Now, destroy the send pool<o:p></o:p></p>
<p class=MsoNormal>-
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></p>
<p class=MsoNormal>-
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></p>
<p class=MsoNormal>+ // Now, destroy the send pool<o:p></o:p></p>
<p class=MsoNormal>+
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></p>
<p class=MsoNormal>+
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
//Now, free port descriptor<o:p></o:p></p>
<p class=MsoNormal>-
if (p_port->p_desc)<o:p></o:p></p>
<p class=MsoNormal>-
ExFreePoolWithTag(p_port->p_desc, 'XMXA');<o:p></o:p></p>
<p class=MsoNormal>+ //Now, free port descriptor<o:p></o:p></p>
<p class=MsoNormal>+ if (p_port->p_desc)<o:p></o:p></p>
<p class=MsoNormal>+
ExFreePoolWithTag(p_port->p_desc, 'XMXA');<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
//Lookaside list will be destroyed in __buf_mgr_destroy<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ //Lookaside list will be destroyed in
__buf_mgr_destroy<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_filter(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
IN
MDL*
const
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>-
IN
OUT
ipoib_send_NB_SG
*s_buf)<o:p></o:p></p>
<p class=MsoNormal>+ IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>+ IN
MDL*
const
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>+ IN
OUT
ipoib_send_NB_SG
*s_buf)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>+ NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( FilterIp );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( FilterArp );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( SendGen );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( FilterIp );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( FilterArp );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( SendGen );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* We already checked the ethernet header length, so we know it's safe<o:p></o:p></p>
<p class=MsoNormal>-
* to decrement the buf_len without underflowing.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal>-
buf_len -= sizeof(eth_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * We already checked the ethernet
header length, so we know it's safe<o:p></o:p></p>
<p class=MsoNormal>+ * to decrement the buf_len without
underflowing.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal>+ buf_len -= sizeof(eth_hdr_t);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
switch( p_eth_hdr->type )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
case ETH_PROT_TYPE_IP:<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( FilterIp );<o:p></o:p></p>
<p class=MsoNormal>-
status = __send_mgr_filter_ip( p_eth_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, FilterIp );<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ switch( p_eth_hdr->type )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ case ETH_PROT_TYPE_IP:<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
FilterIp );<o:p></o:p></p>
<p class=MsoNormal>+ status =
__send_mgr_filter_ip( p_eth_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, FilterIp );<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
case ETH_PROT_TYPE_ARP:<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( FilterArp );<o:p></o:p></p>
<p class=MsoNormal>-
status = __send_mgr_filter_arp( p_eth_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, FilterArp );<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ case ETH_PROT_TYPE_ARP:<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
FilterArp );<o:p></o:p></p>
<p class=MsoNormal>+ status =
__send_mgr_filter_arp( p_eth_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, FilterArp );<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
default:<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* The IPoIB spec doesn't define how to send non IP or ARP packets.<o:p></o:p></p>
<p class=MsoNormal>-
* Just send the payload and hope for the best.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>+ default:<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * The
IPoIB spec doesn't define how to send non IP or ARP packets.<o:p></o:p></p>
<p class=MsoNormal>+ * Just
send the payload and hope for the best.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( SendGen );<o:p></o:p></p>
<p class=MsoNormal>-
status = __send_gen( s_buf, 0, 0 );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, SendGen );<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
SendGen );<o:p></o:p></p>
<p class=MsoNormal>+ status =
__send_gen( s_buf, 0, 0 );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, SendGen );<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>@@ -3416,7 +3463,7 @@<o:p></o:p></p>
<p class=MsoNormal> ULONG <o:p></o:p></p>
<p class=MsoNormal> CopyNetBuffer(<o:p></o:p></p>
<p class=MsoNormal> PNET_BUFFER NetBuffer,<o:p></o:p></p>
<p class=MsoNormal>-
PUCHAR
pDest<o:p></o:p></p>
<p class=MsoNormal>+
PUCHAR pDest<o:p></o:p></p>
<p class=MsoNormal> ) <o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> ULONG BytesCopied = 0;<o:p></o:p></p>
<p class=MsoNormal>@@ -3429,12 +3476,12 @@<o:p></o:p></p>
<p class=MsoNormal> ULONG Offset =
NET_BUFFER_CURRENT_MDL_OFFSET(NetBuffer);<o:p></o:p></p>
<p class=MsoNormal> ULONG DataLength =
NET_BUFFER_DATA_LENGTH(NetBuffer);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if (DataLength > MAX_LSO_PAYLOAD_MTU) {<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Can't copy buffer of %d because of 64K limitation\n", DataLength));<o:p></o:p></p>
<p class=MsoNormal>-
return 0;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if (DataLength > MAX_LSO_PAYLOAD_MTU)
{<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Can't copy buffer of %d because of 64K limitation\n", DataLength));<o:p></o:p></p>
<p class=MsoNormal>+ return 0;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> while (CurrentMdl &&
DataLength > 0)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>@@ -3507,93 +3554,93 @@<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_copy(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_send_NB_SG *
s_buf,<o:p></o:p></p>
<p class=MsoNormal>-
IN
UINT
lso_header_size)<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_send_NB_SG * s_buf,<o:p></o:p></p>
<p class=MsoNormal>+
IN
UINT
lso_header_size)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ULONG
tot_len = 0;<o:p></o:p></p>
<p class=MsoNormal>+
ULONG
tot_len = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_desc_t *p_desc = p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_desc_t *p_desc =
p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(s_buf->p_send_buf == NULL);<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_send_buf = <o:p></o:p></p>
<p class=MsoNormal>-
(send_buf_t *) NdisAllocateFromNPagedLookasideList(
&p_port->buf_mgr.send_buf_list );<o:p></o:p></p>
<p class=MsoNormal>-
if( !s_buf->p_send_buf )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to allocate buffer for packet copy.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
tot_len = CopyNetBuffer(s_buf->p_curr_nb, (PUCHAR) s_buf->p_send_buf);<o:p></o:p></p>
<p class=MsoNormal>-
if (tot_len <= lso_header_size) {<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(tot_len > lso_header_size);<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
//TODO Do not copy the ETH header <o:p></o:p></p>
<p class=MsoNormal>-
/* Setup the work request. */<o:p></o:p></p>
<p class=MsoNormal>-
int seg_index = lso_header_size ? 0 : 1;<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(s_buf->p_send_buf == NULL);<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_send_buf = <o:p></o:p></p>
<p class=MsoNormal>+ (send_buf_t *)
NdisAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );<o:p></o:p></p>
<p class=MsoNormal>+ if( !s_buf->p_send_buf )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to allocate buffer for packet copy.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ tot_len =
CopyNetBuffer(s_buf->p_curr_nb, (PUCHAR) s_buf->p_send_buf);<o:p></o:p></p>
<p class=MsoNormal>+ if (tot_len <= lso_header_size) {<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(tot_len
> lso_header_size);<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ //TODO Do not copy the ETH header <o:p></o:p></p>
<p class=MsoNormal>+ /* Setup the work request. */<o:p></o:p></p>
<p class=MsoNormal>+ int seg_index = lso_header_size ? 0 : 1;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[seg_index].vaddr = cl_get_physaddr(<o:p></o:p></p>
<p class=MsoNormal>-
((uint8_t*)s_buf->p_send_buf) + lso_header_size );<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[seg_index].length = tot_len - lso_header_size;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[seg_index].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.num_ds = seg_index+1;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[seg_index].vaddr = cl_get_physaddr(<o:p></o:p></p>
<p class=MsoNormal>+
((uint8_t*)s_buf->p_send_buf) + lso_header_size );<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].local_ds[seg_index].length
= tot_len - lso_header_size;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[seg_index].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.num_ds =
seg_index+1;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_get_eth_hdr(<o:p></o:p></p>
<p class=MsoNormal>-
IN
PNET_BUFFER
p_net_buffer,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
MDL**
const
pp_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
eth_hdr_t**
const
pp_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
UINT*
p_mdl_len)<o:p></o:p></p>
<p class=MsoNormal>+
IN
PNET_BUFFER
p_net_buffer,<o:p></o:p></p>
<p class=MsoNormal>+
OUT MDL**
const
pp_mdl,<o:p></o:p></p>
<p class=MsoNormal>+
OUT eth_hdr_t**
const pp_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
OUT
UINT*
p_mdl_len)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
PUCHAR
p_head = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ PUCHAR p_head = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
*pp_mdl
= NET_BUFFER_FIRST_MDL(p_net_buffer);<o:p></o:p></p>
<p class=MsoNormal>+ *pp_mdl =
NET_BUFFER_FIRST_MDL(p_net_buffer);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
NdisQueryMdl(*pp_mdl,&p_head,p_mdl_len,NormalPagePriority);<o:p></o:p></p>
<p class=MsoNormal>-
if( ! p_head )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Failed to get first buffer. */<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("NdisQueryMdl failed.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ NdisQueryMdl(*pp_mdl,&p_head,p_mdl_len,NormalPagePriority);<o:p></o:p></p>
<p class=MsoNormal>+ if( ! p_head )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* Failed to get
first buffer. */<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("NdisQueryMdl failed.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ULONG MdlDataOffset = NET_BUFFER_CURRENT_MDL_OFFSET(p_net_buffer);<o:p></o:p></p>
<p class=MsoNormal>-
*p_mdl_len -= MdlDataOffset; <o:p></o:p></p>
<p class=MsoNormal>+ ULONG MdlDataOffset =
NET_BUFFER_CURRENT_MDL_OFFSET(p_net_buffer);<o:p></o:p></p>
<p class=MsoNormal>+ *p_mdl_len -=
MdlDataOffset; <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( *p_mdl_len < sizeof(eth_hdr_t) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("First buffer in packet smaller than eth_hdr_t: %d.\n",<o:p></o:p></p>
<p class=MsoNormal>-
*p_mdl_len) );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( *p_mdl_len < sizeof(eth_hdr_t) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("First buffer in packet smaller than eth_hdr_t: %d.\n",<o:p></o:p></p>
<p class=MsoNormal>+
*p_mdl_len) );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
*pp_eth_hdr = (eth_hdr_t*)(p_head + MdlDataOffset);<o:p></o:p></p>
<p class=MsoNormal>+ *pp_eth_hdr = (eth_hdr_t*)(p_head +
MdlDataOffset);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("Ethernet header:\n"<o:p></o:p></p>
<p class=MsoNormal>-
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></p>
<p class=MsoNormal>-
"\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></p>
<p class=MsoNormal>-
"\tprotocol type: %04X\n",<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_eth_hdr)->src.addr[0], (*pp_eth_hdr)->src.addr[1],<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_eth_hdr)->src.addr[2], (*pp_eth_hdr)->src.addr[3],<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_eth_hdr)->src.addr[4], (*pp_eth_hdr)->src.addr[5],<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_eth_hdr)->dst.addr[0], (*pp_eth_hdr)->dst.addr[1],<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_eth_hdr)->dst.addr[2], (*pp_eth_hdr)->dst.addr[3],<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_eth_hdr)->dst.addr[4], (*pp_eth_hdr)->dst.addr[5],<o:p></o:p></p>
<p class=MsoNormal>-
cl_ntoh16( (*pp_eth_hdr)->type )) );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+ ("Ethernet
header:\n"<o:p></o:p></p>
<p class=MsoNormal>+ "\tsrc MAC:
%02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></p>
<p class=MsoNormal>+ "\tdst MAC:
%02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></p>
<p class=MsoNormal>+ "\tprotocol
type: %04X\n",<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_eth_hdr)->src.addr[0], (*pp_eth_hdr)->src.addr[1],<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_eth_hdr)->src.addr[2], (*pp_eth_hdr)->src.addr[3],<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_eth_hdr)->src.addr[4], (*pp_eth_hdr)->src.addr[5],<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_eth_hdr)->dst.addr[0], (*pp_eth_hdr)->dst.addr[1],<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_eth_hdr)->dst.addr[2], (*pp_eth_hdr)->dst.addr[3],<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_eth_hdr)->dst.addr[4], (*pp_eth_hdr)->dst.addr[5],<o:p></o:p></p>
<p class=MsoNormal>+ cl_ntoh16(
(*pp_eth_hdr)->type )) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>@@ -3601,139 +3648,139 @@<o:p></o:p></p>
<p class=MsoNormal> /* Send using the MDL's page information rather than
the SGL. */<o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __send_gen(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_send_desc_t* const
p_desc )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_send_desc_t* const p_desc )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
i, j = 1;<o:p></o:p></p>
<p class=MsoNormal>-
ULONG
offset;<o:p></o:p></p>
<p class=MsoNormal>-
MDL
*p_mdl;<o:p></o:p></p>
<p class=MsoNormal>-
UINT
num_pages, tot_len;<o:p></o:p></p>
<p class=MsoNormal>-
ULONG
buf_len;<o:p></o:p></p>
<p class=MsoNormal>-
PPFN_NUMBER
page_array;<o:p></o:p></p>
<p class=MsoNormal>-
boolean_t
hdr_done = FALSE;<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
PNET_BUFFER
p_net_buf;<o:p></o:p></p>
<p class=MsoNormal>+
uint32_t
i, j = 1;<o:p></o:p></p>
<p class=MsoNormal>+
ULONG
offset;<o:p></o:p></p>
<p class=MsoNormal>+
MDL
*p_mdl;<o:p></o:p></p>
<p class=MsoNormal>+
UINT
num_pages, tot_len;<o:p></o:p></p>
<p class=MsoNormal>+
ULONG
buf_len;<o:p></o:p></p>
<p class=MsoNormal>+
PPFN_NUMBER
page_array;<o:p></o:p></p>
<p class=MsoNormal>+
boolean_t
hdr_done = FALSE;<o:p></o:p></p>
<p class=MsoNormal>+
ib_api_status_t status;<o:p></o:p></p>
<p class=MsoNormal>+
PNET_BUFFER
p_net_buf;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
p_net_buf = NET_BUFFER_LIST_FIRST_NB(p_desc->p_netbuf_list);<o:p></o:p></p>
<p class=MsoNormal>-
NdisQueryBuffer( p_net_buf, &num_pages, NULL, &p_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
&tot_len );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ p_net_buf =
NET_BUFFER_LIST_FIRST_NB(p_desc->p_netbuf_list);<o:p></o:p></p>
<p class=MsoNormal>+ NdisQueryBuffer( p_net_buf, &num_pages,
NULL, &p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+ &tot_len );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("No buffers associated with packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("No buffers associated with packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Remember that one of the DS entries is reserved for the IPoIB header. */<o:p></o:p></p>
<p class=MsoNormal>-
if( num_pages >= MAX_SEND_SGE )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("Too many buffers to fit in WR ds_array. Copying data.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
status = __send_copy( p_port, p_desc );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Remember that one of the DS entries
is reserved for the IPoIB header. */<o:p></o:p></p>
<p class=MsoNormal>+ if( num_pages >= MAX_SEND_SGE )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+
("Too many buffers to fit in WR ds_array. Copying data.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ status =
__send_copy( p_port, p_desc );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT(
IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( tot_len > sizeof(eth_hdr_t) );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( tot_len <= p_port->p_adapter->params.xfer_block_size );<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Assume that the ethernet header is always fully contained<o:p></o:p></p>
<p class=MsoNormal>-
* in the first page of the first MDL. This makes for much<o:p></o:p></p>
<p class=MsoNormal>-
* simpler code.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
offset = MmGetMdlByteOffset( p_mdl ) + sizeof(eth_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( offset <= PAGE_SIZE );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( tot_len >
sizeof(eth_hdr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( tot_len <=
p_port->p_adapter->params.xfer_block_size );<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Assume that the ethernet header
is always fully contained<o:p></o:p></p>
<p class=MsoNormal>+ * in the first page of the first
MDL. This makes for much<o:p></o:p></p>
<p class=MsoNormal>+ * simpler code.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ offset = MmGetMdlByteOffset( p_mdl ) +
sizeof(eth_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( offset <= PAGE_SIZE );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
while( tot_len )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
buf_len = MmGetMdlByteCount( p_mdl );<o:p></o:p></p>
<p class=MsoNormal>-
page_array = MmGetMdlPfnArray( p_mdl );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( page_array );<o:p></o:p></p>
<p class=MsoNormal>-
i = 0;<o:p></o:p></p>
<p class=MsoNormal>-
if( !hdr_done )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( buf_len >= sizeof(eth_hdr_t) );<o:p></o:p></p>
<p class=MsoNormal>-
/* Skip the ethernet header. */<o:p></o:p></p>
<p class=MsoNormal>-
buf_len -= sizeof(eth_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( buf_len <= p_port->p_adapter->params.payload_mtu );<o:p></o:p></p>
<p class=MsoNormal>-
if( buf_len )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* The ethernet header is a subset of this MDL. */<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( i == 0 );<o:p></o:p></p>
<p class=MsoNormal>-
if( offset < PAGE_SIZE )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);<o:p></o:p></p>
<p class=MsoNormal>-
/* Add the byte offset since we're on the 1st page. */<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].vaddr += offset;<o:p></o:p></p>
<p class=MsoNormal>-
if( offset + buf_len > PAGE_SIZE )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].length = PAGE_SIZE - offset;<o:p></o:p></p>
<p class=MsoNormal>-
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></p>
<p class=MsoNormal>-
buf_len = 0;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* This data segment is done. Move to the next. */<o:p></o:p></p>
<p class=MsoNormal>-
j++;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* This page is done. Move to the next. */<o:p></o:p></p>
<p class=MsoNormal>-
i++;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* Done handling the ethernet header. */<o:p></o:p></p>
<p class=MsoNormal>-
hdr_done = TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ while( tot_len )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ buf_len =
MmGetMdlByteCount( p_mdl );<o:p></o:p></p>
<p class=MsoNormal>+ page_array =
MmGetMdlPfnArray( p_mdl );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
page_array );<o:p></o:p></p>
<p class=MsoNormal>+ i = 0;<o:p></o:p></p>
<p class=MsoNormal>+ if( !hdr_done )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
CL_ASSERT( buf_len >= sizeof(eth_hdr_t) );<o:p></o:p></p>
<p class=MsoNormal>+
/* Skip the ethernet header. */<o:p></o:p></p>
<p class=MsoNormal>+
buf_len -= sizeof(eth_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>+
CL_ASSERT( buf_len <= p_port->p_adapter->params.payload_mtu );<o:p></o:p></p>
<p class=MsoNormal>+
if( buf_len )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
/* The ethernet header is a subset of this MDL. */<o:p></o:p></p>
<p class=MsoNormal>+
CL_ASSERT( i == 0 );<o:p></o:p></p>
<p class=MsoNormal>+
if( offset < PAGE_SIZE )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);<o:p></o:p></p>
<p class=MsoNormal>+
/* Add the byte offset since we're on the 1st page. */<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].vaddr
+= offset;<o:p></o:p></p>
<p class=MsoNormal>+
if( offset + buf_len > PAGE_SIZE )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].length = PAGE_SIZE - offset;<o:p></o:p></p>
<p class=MsoNormal>+
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
else<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></p>
<p class=MsoNormal>+
buf_len = 0;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
/*
This data segment is done. Move to the next. */<o:p></o:p></p>
<p class=MsoNormal>+
j++;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
/* This page is done. Move to the next. */<o:p></o:p></p>
<p class=MsoNormal>+
i++;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
/* Done handling the ethernet header. */<o:p></o:p></p>
<p class=MsoNormal>+
hdr_done = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Finish this MDL */<o:p></o:p></p>
<p class=MsoNormal>-
while( buf_len )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);<o:p></o:p></p>
<p class=MsoNormal>-
/* Add the first page's offset if we're on the first page. */<o:p></o:p></p>
<p class=MsoNormal>-
if( i == 0 )<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].vaddr += MmGetMdlByteOffset( p_mdl );<o:p></o:p></p>
<p class=MsoNormal>+ /* Finish this
MDL */<o:p></o:p></p>
<p class=MsoNormal>+ while( buf_len )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);<o:p></o:p></p>
<p class=MsoNormal>+
/* Add the first page's offset if we're on the first page. */<o:p></o:p></p>
<p class=MsoNormal>+
if( i == 0 )<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].vaddr += MmGetMdlByteOffset( p_mdl );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( i == 0 && (MmGetMdlByteOffset( p_mdl ) + buf_len) > PAGE_SIZE )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Buffers spans pages. */<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></p>
<p class=MsoNormal>-
PAGE_SIZE - MmGetMdlByteOffset( p_mdl );<o:p></o:p></p>
<p class=MsoNormal>-
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></p>
<p class=MsoNormal>-
/* This page is done. Move to the next. */<o:p></o:p></p>
<p class=MsoNormal>-
i++;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Last page of the buffer. */<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></p>
<p class=MsoNormal>-
buf_len = 0;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* This data segment is done. Move to the next. */<o:p></o:p></p>
<p class=MsoNormal>-
j++;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
if( i == 0 && (MmGetMdlByteOffset( p_mdl ) + buf_len) > PAGE_SIZE )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
/* Buffers spans pages. */<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></p>
<p class=MsoNormal>+
PAGE_SIZE - MmGetMdlByteOffset( p_mdl );<o:p></o:p></p>
<p class=MsoNormal>+
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></p>
<p class=MsoNormal>+
/* This page is done. Move to the next. */<o:p></o:p></p>
<p class=MsoNormal>+
i++;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
else<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
/* Last page of the buffer. */<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></p>
<p class=MsoNormal>+
buf_len = 0;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
/* This data segment is done. Move to the next. */<o:p></o:p></p>
<p class=MsoNormal>+
j++;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
tot_len -= MmGetMdlByteCount( p_mdl );<o:p></o:p></p>
<p class=MsoNormal>-
if( !tot_len )<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ tot_len -=
MmGetMdlByteCount( p_mdl );<o:p></o:p></p>
<p class=MsoNormal>+ if( !tot_len )<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
NdisGetNextBuffer( p_mdl, &p_mdl );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to get next buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
NdisGetNextBuffer( p_mdl, &p_mdl );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to get next buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Set the number of data segments. */<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.num_ds = j;<o:p></o:p></p>
<p class=MsoNormal>+ /* Set the number of data segments. */<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.num_ds = j;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #else<o:p></o:p></p>
<p class=MsoNormal>@@ -3750,261 +3797,261 @@<o:p></o:p></p>
<p class=MsoNormal> IN
PSCATTER_GATHER_LIST p_sgl,<o:p></o:p></p>
<p class=MsoNormal> IN
PVOID
context<o:p></o:p></p>
<p class=MsoNormal> )<o:p></o:p></p>
<p class=MsoNormal>-{
<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></p>
<p class=MsoNormal>-
MDL
*p_mdl;<o:p></o:p></p>
<p class=MsoNormal>-
eth_hdr_t
*p_eth_hdr;<o:p></o:p></p>
<p class=MsoNormal>-
UINT
mdl_len;<o:p></o:p></p>
<p class=MsoNormal>-
bool ret = false;<o:p></o:p></p>
<p class=MsoNormal>+{ <o:p></o:p></p>
<p class=MsoNormal>+
NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_t
*p_port;<o:p></o:p></p>
<p class=MsoNormal>+
MDL
*p_mdl;<o:p></o:p></p>
<p class=MsoNormal>+
eth_hdr_t
*p_eth_hdr;<o:p></o:p></p>
<p class=MsoNormal>+
UINT
mdl_len;<o:p></o:p></p>
<p class=MsoNormal>+ bool ret = false;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ib_send_wr_t
*p_wr_failed;<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST
*p_net_buffer_list;<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER
*p_netbuf;<o:p></o:p></p>
<p class=MsoNormal>-
boolean_t
from_queue;<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
ib_status;<o:p></o:p></p>
<p class=MsoNormal>-
ULONG
complete_flags = 0;<o:p></o:p></p>
<p class=MsoNormal>+
ib_send_wr_t
*p_wr_failed;<o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER_LIST
*p_net_buffer_list;<o:p></o:p></p>
<p class=MsoNormal>+ NET_BUFFER
*p_netbuf;<o:p></o:p></p>
<p class=MsoNormal>+
boolean_t
from_queue;<o:p></o:p></p>
<p class=MsoNormal>+
ib_api_status_t ib_status;<o:p></o:p></p>
<p class=MsoNormal>+
ULONG
complete_flags = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(p_sgl != NULL);<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(p_sgl != NULL);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
UNREFERENCED_PARAMETER(pDO);<o:p></o:p></p>
<p class=MsoNormal>-
UNREFERENCED_PARAMETER(pIrp);<o:p></o:p></p>
<p class=MsoNormal>+ UNREFERENCED_PARAMETER(pDO);<o:p></o:p></p>
<p class=MsoNormal>+ UNREFERENCED_PARAMETER(pIrp);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( SendCopy );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( BuildSendDesc );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( GetEthHdr );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( QueuePacket );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( SendMgrQueue );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( PostSend );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( GetEndpt );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( SendCopy );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( BuildSendDesc );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( GetEthHdr );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( QueuePacket );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( SendMgrQueue );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( PostSend );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( GetEndpt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
++g_ipoib_send_SG_real;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ ++g_ipoib_send_SG_real;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
//Read Data from the buffer passed as a context<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_NB_SG * s_buf = (ipoib_send_NB_SG *)context;<o:p></o:p></p>
<p class=MsoNormal>-
p_net_buffer_list = s_buf->p_nbl;<o:p></o:p></p>
<p class=MsoNormal>-
p_netbuf =
s_buf->p_curr_nb;<o:p></o:p></p>
<p class=MsoNormal>-
p_port =
s_buf->p_port;<o:p></o:p></p>
<p class=MsoNormal>+ //Read Data from the buffer passed as a
context<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_NB_SG * s_buf =
(ipoib_send_NB_SG *)context;<o:p></o:p></p>
<p class=MsoNormal>+ p_net_buffer_list = s_buf->p_nbl;<o:p></o:p></p>
<p class=MsoNormal>+ p_netbuf
= s_buf->p_curr_nb;<o:p></o:p></p>
<p class=MsoNormal>+ p_port
= s_buf->p_port;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("Processing netbuffer list: %p \n", p_net_buffer_list) );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+
("Processing netbuffer list: %p \n", p_net_buffer_list) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
//TODO Define this function as void if we are not in DBG mode<o:p></o:p></p>
<p class=MsoNormal>-
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_SET_SEND_COMPLETE_FLAG(complete_flags,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>
<p class=MsoNormal>+ //TODO Define this function as void if
we are not in DBG mode<o:p></o:p></p>
<p class=MsoNormal>+ //cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_SET_SEND_COMPLETE_FLAG(complete_flags,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(KeGetCurrentIrql() ==
DISPATCH_LEVEL);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_desc->p_netbuf_list = p_net_buffer_list;<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_desc->p_endpt = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_send_buf = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_desc->num_wrs = 1;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ p_port->p_desc->p_netbuf_list =
p_net_buffer_list;<o:p></o:p></p>
<p class=MsoNormal>+ p_port->p_desc->p_endpt = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_send_buf = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ p_port->p_desc->num_wrs = 1;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("\nRECEIVED NB= %p with SG= %p\n********\n", p_netbuf, p_sgl) );<o:p></o:p></p>
<p class=MsoNormal>-
/* Get the ethernet header so we can find the endpoint. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( GetEthHdr );<o:p></o:p></p>
<p class=MsoNormal>-
status = __send_mgr_get_eth_hdr(<o:p></o:p></p>
<p class=MsoNormal>-
p_netbuf, &p_mdl, &p_eth_hdr, &mdl_len );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetEthHdr );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_VERBOSE,
IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+
("\nRECEIVED NB= %p with SG= %p\n********\n", p_netbuf, p_sgl) );<o:p></o:p></p>
<p class=MsoNormal>+ /* Get the ethernet header so we can find
the endpoint. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( GetEthHdr );<o:p></o:p></p>
<p class=MsoNormal>+ status = __send_mgr_get_eth_hdr(<o:p></o:p></p>
<p class=MsoNormal>+ p_netbuf,
&p_mdl, &p_eth_hdr, &mdl_len );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetEthHdr );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>-
/* fail net buffer */<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("Failed send inside process
SG list\n"));<o:p></o:p></p>
<p class=MsoNormal>-
__send_complete_net_buffer(s_buf, status, complete_flags, TRUE);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>-
ret = true;<o:p></o:p></p>
<p class=MsoNormal>-
goto send_end;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
from_queue = (boolean_t)(s_buf->p_sgl != NULL);<o:p></o:p></p>
<p class=MsoNormal>-
if (from_queue)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( GetEndpt );<o:p></o:p></p>
<p class=MsoNormal>-
status = __endpt_mgr_ref( p_port, p_eth_hdr->dst,
&(p_port->p_desc->p_endpt) );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called
for %p\n", p_port->p_desc->p_endpt));<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );<o:p></o:p></p>
<p class=MsoNormal>-
if( status == NDIS_STATUS_PENDING )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_sgl = p_sgl;<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_head( &p_port->send_mgr.pending_list,<o:p></o:p></p>
<p class=MsoNormal>-
(cl_list_item_t*)s_buf );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("We insert this
item back to the pending list: %p \n", p_net_buffer_list));<o:p></o:p></p>
<p class=MsoNormal>-
ret = false;<o:p></o:p></p>
<p class=MsoNormal>-
goto send_end;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>+ /* fail
net buffer */<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("Failed send inside process SG
list\n"));<o:p></o:p></p>
<p class=MsoNormal>+
__send_complete_net_buffer(s_buf, status, complete_flags, TRUE);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>+ ret = true;<o:p></o:p></p>
<p class=MsoNormal>+ goto send_end;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ from_queue = (boolean_t)(s_buf->p_sgl
!= NULL);<o:p></o:p></p>
<p class=MsoNormal>+ if (from_queue)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
GetEndpt );<o:p></o:p></p>
<p class=MsoNormal>+ status =
__endpt_mgr_ref( p_port, p_eth_hdr->dst,
&(p_port->p_desc->p_endpt) );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for
%p\n", p_port->p_desc->p_endpt));<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetEndpt );<o:p></o:p></p>
<p class=MsoNormal>+ if( status ==
NDIS_STATUS_PENDING )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
s_buf->p_sgl = p_sgl;<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_head( &p_port->send_mgr.pending_list,<o:p></o:p></p>
<p class=MsoNormal>+
(cl_list_item_t*)s_buf );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("We insert this
item back to the pending list: %p \n", p_net_buffer_list));<o:p></o:p></p>
<p class=MsoNormal>+
ret = false;<o:p></o:p></p>
<p class=MsoNormal>+
goto send_end;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else if( status
!= NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("recived a mc
packet (from the queue) %p\n", p_net_buffer_list));<o:p></o:p></p>
<p class=MsoNormal>-
if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst,<o:p></o:p></p>
<p class=MsoNormal>-
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_sgl = p_sgl;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("We insert this
MULTICAST item back to the pending list: %p \n",
p_net_buffer_list));
<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_head( &p_port->send_mgr.pending_list, (cl_list_item_t*)
s_buf );<o:p></o:p></p>
<p class=MsoNormal>-
ret = false;<o:p></o:p></p>
<p class=MsoNormal>-
++g_ipoib_send_SG_pending;<o:p></o:p></p>
<p class=MsoNormal>-
goto send_end;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></p>
<p class=MsoNormal>-
* sends to fail.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("We got bad status and
the packet had not been sent\n"));<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>+
if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("recived a mc
packet (from the queue) %p\n", p_net_buffer_list));<o:p></o:p></p>
<p class=MsoNormal>+
if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst,<o:p></o:p></p>
<p class=MsoNormal>+
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
s_buf->p_sgl = p_sgl;<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("We insert this
MULTICAST item back to the pending list: %p \n", p_net_buffer_list));
<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_head( &p_port->send_mgr.pending_list, (cl_list_item_t*)
s_buf );<o:p></o:p></p>
<p class=MsoNormal>+
ret = false;<o:p></o:p></p>
<p class=MsoNormal>+
++g_ipoib_send_SG_pending;<o:p></o:p></p>
<p class=MsoNormal>+
goto send_end;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
/*<o:p></o:p></p>
<p class=MsoNormal>+
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></p>
<p class=MsoNormal>+
* sends to fail.<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("We got bad status and
the packet had not been sent\n"));<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_start( ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags, TRUE);<o:p></o:p></p>
<p class=MsoNormal>-
ret = true;<o:p></o:p></p>
<p class=MsoNormal>-
goto send_end;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else //We got this Net Buffer and its SG list directly from NDIS<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(s_buf->p_sgl ==NULL);<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_sgl = p_sgl;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( SendMgrQueue );<o:p></o:p></p>
<p class=MsoNormal>-
if ( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) && <o:p></o:p></p>
<p class=MsoNormal>-
p_eth_hdr->type == ETH_PROT_TYPE_IP &&<o:p></o:p></p>
<p class=MsoNormal>-
!ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) ) <o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>+
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags, TRUE);<o:p></o:p></p>
<p class=MsoNormal>+
ret = true;<o:p></o:p></p>
<p class=MsoNormal>+
goto send_end;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else //We got this Net Buffer and its SG
list directly from NDIS<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(s_buf->p_sgl ==NULL);<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_sgl
= p_sgl;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
SendMgrQueue );<o:p></o:p></p>
<p class=MsoNormal>+ if (
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) && <o:p></o:p></p>
<p class=MsoNormal>+
p_eth_hdr->type == ETH_PROT_TYPE_IP &&<o:p></o:p></p>
<p class=MsoNormal>+
!ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) ) <o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>-
("recived a Multicast NBL= %p\n", p_net_buffer_list) );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>+
("recived a Multicast NBL= %p\n", p_net_buffer_list) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
ip_hdr_t
*p_ip_hdr;<o:p></o:p></p>
<p class=MsoNormal>-
uint8_t
*p_tmp;<o:p></o:p></p>
<p class=MsoNormal>-
MDL
*p_ip_hdr_mdl;<o:p></o:p></p>
<p class=MsoNormal>-
UINT
ip_hdr_mdl_len;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
g_ipoib_send_mcast++;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if(mdl_len >= sizeof(ip_hdr_t) + sizeof(eth_hdr_t))<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisGetNextMdl(p_mdl,&p_ip_hdr_mdl);<o:p></o:p></p>
<p class=MsoNormal>-
// Extract the ip hdr <o:p></o:p></p>
<p class=MsoNormal>-
if( !p_ip_hdr_mdl )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to get IP header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
goto mc_end;<o:p></o:p></p>
<p class=MsoNormal>-
}
<o:p></o:p></p>
<p class=MsoNormal>-
NdisQueryMdl(p_ip_hdr_mdl,&p_tmp,&ip_hdr_mdl_len,NormalPagePriority);<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_tmp )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to get IP header.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
goto mc_end;<o:p></o:p></p>
<p class=MsoNormal>-
}
<o:p></o:p></p>
<p class=MsoNormal>-
if( ip_hdr_mdl_len < sizeof(ip_hdr_t) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* This buffer is done for. Get the next buffer. */<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Buffer too small for IP packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
goto mc_end;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
p_ip_hdr = (ip_hdr_t*)(p_tmp + NET_BUFFER_CURRENT_MDL_OFFSET(p_netbuf));<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
p_eth_hdr->dst.addr[1] = ((unsigned char*)&p_ip_hdr->dst_ip)[0] &
0x0f;<o:p></o:p></p>
<p class=MsoNormal>-
p_eth_hdr->dst.addr[3] = ((unsigned char*)&p_ip_hdr->dst_ip)[1];<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+
ip_hdr_t
*p_ip_hdr;<o:p></o:p></p>
<p class=MsoNormal>+
uint8_t
*p_tmp;<o:p></o:p></p>
<p class=MsoNormal>+
MDL
*p_ip_hdr_mdl;<o:p></o:p></p>
<p class=MsoNormal>+
UINT
ip_hdr_mdl_len;<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
g_ipoib_send_mcast++;<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
if(mdl_len >= sizeof(ip_hdr_t) + sizeof(eth_hdr_t))<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
else<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
NdisGetNextMdl(p_mdl,&p_ip_hdr_mdl);<o:p></o:p></p>
<p class=MsoNormal>+
// Extract the ip hdr <o:p></o:p></p>
<p class=MsoNormal>+
if( !p_ip_hdr_mdl )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to get IP header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
goto mc_end;<o:p></o:p></p>
<p class=MsoNormal>+
} <o:p></o:p></p>
<p class=MsoNormal>+
NdisQueryMdl(p_ip_hdr_mdl,&p_tmp,&ip_hdr_mdl_len,NormalPagePriority);<o:p></o:p></p>
<p class=MsoNormal>+
if( !p_tmp )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to get IP header.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
goto mc_end;<o:p></o:p></p>
<p class=MsoNormal>+
}
<o:p></o:p></p>
<p class=MsoNormal>+
if( ip_hdr_mdl_len < sizeof(ip_hdr_t) )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
/* This buffer is done for. Get the next buffer. */<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Buffer too small for IP packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
goto mc_end;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
p_ip_hdr = (ip_hdr_t*)(p_tmp + NET_BUFFER_CURRENT_MDL_OFFSET(p_netbuf));<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
p_eth_hdr->dst.addr[1] = ((unsigned char*)&p_ip_hdr->dst_ip)[0] &
0x0f;<o:p></o:p></p>
<p class=MsoNormal>+
p_eth_hdr->dst.addr[3] = ((unsigned char*)&p_ip_hdr->dst_ip)[1];<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> mc_end:<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(s_buf->p_sgl);<o:p></o:p></p>
<p class=MsoNormal>-
status = __send_mgr_queue( p_port, p_eth_hdr, &(p_port->p_desc->p_endpt)
);<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, SendMgrQueue );<o:p></o:p></p>
<p class=MsoNormal>-
if( status == NDIS_STATUS_PENDING )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Queue net buffer list. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( QueuePacket );<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(s_buf->p_sgl);<o:p></o:p></p>
<p class=MsoNormal>+ status =
__send_mgr_queue( p_port, p_eth_hdr, &(p_port->p_desc->p_endpt) );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, SendMgrQueue );<o:p></o:p></p>
<p class=MsoNormal>+ if( status ==
NDIS_STATUS_PENDING )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/* Queue net buffer list. */<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_start( QueuePacket );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,
(cl_list_item_t*)s_buf );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND, ("Inserting %p NB
first time to the pending list\n", p_netbuf));<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, QueuePacket );<o:p></o:p></p>
<p class=MsoNormal>-
++g_ipoib_send_SG_pending;<o:p></o:p></p>
<p class=MsoNormal>-
ret = false;<o:p></o:p></p>
<p class=MsoNormal>-
goto send_end;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></p>
<p class=MsoNormal>-
* sends to fail.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
//TODO - check previous comment !<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>-
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags, TRUE);<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>-
ret = true;<o:p></o:p></p>
<p class=MsoNormal>-
goto send_end;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( BuildSendDesc );<o:p></o:p></p>
<p class=MsoNormal>-
status = __build_send_desc( p_eth_hdr, p_mdl, mdl_len, s_buf );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, BuildSendDesc );<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,
(cl_list_item_t*)s_buf );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND, ("Inserting %p NB
first time to the pending list\n", p_netbuf));<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_stop( &p_port->p_adapter->perf, QueuePacket );<o:p></o:p></p>
<p class=MsoNormal>+
++g_ipoib_send_SG_pending;<o:p></o:p></p>
<p class=MsoNormal>+
ret = false;<o:p></o:p></p>
<p class=MsoNormal>+
goto send_end;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></p>
<p class=MsoNormal>+
/*<o:p></o:p></p>
<p class=MsoNormal>+
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></p>
<p class=MsoNormal>+
* sends to fail.<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal>+
//TODO - check previous comment !<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_start( ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>+
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags, TRUE);<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>+
ret = true;<o:p></o:p></p>
<p class=MsoNormal>+
goto send_end;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( BuildSendDesc );<o:p></o:p></p>
<p class=MsoNormal>+ status = __build_send_desc( p_eth_hdr,
p_mdl, mdl_len, s_buf );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop( &p_port->p_adapter->perf,
BuildSendDesc );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-//
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>-
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags, TRUE);<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>-
ret = true;<o:p></o:p></p>
<p class=MsoNormal>-
goto send_end;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+// ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>+
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags, TRUE);<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>+ ret = true;<o:p></o:p></p>
<p class=MsoNormal>+ goto send_end;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Post the WR. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( PostSend );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND, ("sending packet with wr-id
=0x%p\n",p_net_buffer_list ));<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
ib_status = p_port->p_adapter->p_ifc->post_send(
p_port->ib_mgr.h_qp, &(p_port->p_desc->send_wr[0].wr),
&p_wr_failed );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->n_no_progress = 0; // IPoIB can send, reset the failure counter<o:p></o:p></p>
<p class=MsoNormal>-
ret = true;<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, PostSend );<o:p></o:p></p>
<p class=MsoNormal>-
if( ib_status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_post_send returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>-
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags, TRUE);<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>-
/* Flag the adapter as hung since posting is busted. */<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
} else {<o:p></o:p></p>
<p class=MsoNormal>-
++g_ipoib_send;<o:p></o:p></p>
<p class=MsoNormal>-
cl_atomic_inc( &p_port->send_mgr.depth );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Post the WR. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( PostSend );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_VERBOSE,
IPOIB_DBG_SEND, ("sending packet with wr-id
=0x%p\n",p_net_buffer_list ));<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ ib_status =
p_port->p_adapter->p_ifc->post_send( p_port->ib_mgr.h_qp,
&(p_port->p_desc->send_wr[0].wr), &p_wr_failed );<o:p></o:p></p>
<p class=MsoNormal>+ p_port->n_no_progress = 0; // IPoIB
can send, reset the failure counter<o:p></o:p></p>
<p class=MsoNormal>+ ret = true;<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, PostSend );<o:p></o:p></p>
<p class=MsoNormal>+ if( ib_status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_ERROR,
IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_post_send returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>+
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags, TRUE);<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>+ /* Flag the
adapter as hung since posting is busted. */<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ } else {<o:p></o:p></p>
<p class=MsoNormal>+ ++g_ipoib_send;<o:p></o:p></p>
<p class=MsoNormal>+ cl_atomic_inc(
&p_port->send_mgr.depth );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-send_end:
<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+send_end: <o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
return ret;<o:p></o:p></p>
<p class=MsoNormal>+ return ret;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>@@ -4018,486 +4065,486 @@<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_NB_SG * s_buf = (ipoib_send_NB_SG *)context;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t* p_port =
s_buf->p_port;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_NB_SG * s_buf =
(ipoib_send_NB_SG *)context;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_t* p_port
= s_buf->p_port;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>-
++g_ipoib_send_SG;<o:p></o:p></p>
<p class=MsoNormal>-
if (g_ipoib_send_SG > 2) {<o:p></o:p></p>
<p class=MsoNormal>-
//ASSERT(g_ipoib_send_SG-2 <= g_ipoib_send +
g_ipoib_send_mcast+p_port->send_mgr.pending_list.count+
g_ipoib_send_SG_failed);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_process_sg_list_real(pDO, pIrp, p_sgl, context);<o:p></o:p></p>
<p class=MsoNormal>-
if (g_ipoib_send_SG > 1) {<o:p></o:p></p>
<p class=MsoNormal>-
//ASSERT(g_ipoib_send_SG-1 <= g_ipoib_send + g_ipoib_send_mcast+p_port->send_mgr.pending_list.count
+ g_ipoib_send_SG_failed);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+ ++g_ipoib_send_SG;<o:p></o:p></p>
<p class=MsoNormal>+ if (g_ipoib_send_SG > 2) {<o:p></o:p></p>
<p class=MsoNormal>+
//ASSERT(g_ipoib_send_SG-2 <= g_ipoib_send +
g_ipoib_send_mcast+p_port->send_mgr.pending_list.count+
g_ipoib_send_SG_failed);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_process_sg_list_real(pDO, pIrp,
p_sgl, context);<o:p></o:p></p>
<p class=MsoNormal>+ if (g_ipoib_send_SG > 1) {<o:p></o:p></p>
<p class=MsoNormal>+
//ASSERT(g_ipoib_send_SG-1 <= g_ipoib_send +
g_ipoib_send_mcast+p_port->send_mgr.pending_list.count +
g_ipoib_send_SG_failed);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_release( &p_port->send_lock
);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_gen(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_send_NB_SG *
s_buf,<o:p></o:p></p>
<p class=MsoNormal>-
IN
INT
lso_data_index,<o:p></o:p></p>
<p class=MsoNormal>-
IN
UINT
lso_header_size OPTIONAL)<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_send_NB_SG * s_buf,<o:p></o:p></p>
<p class=MsoNormal>+
IN
INT
lso_data_index,<o:p></o:p></p>
<p class=MsoNormal>+
IN
UINT
lso_header_size OPTIONAL)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
i, j
= 1;<o:p></o:p></p>
<p class=MsoNormal>-
ULONG
DataOffset = 0;
<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
EthHeaderOffset
= sizeof(eth_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>-
static const EthIPoIBHeaderOffset
= EthHeaderOffset - sizeof(ipoib_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( SendCopy );<o:p></o:p></p>
<p class=MsoNormal>+ NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>+
uint32_t i,
j = 1;<o:p></o:p></p>
<p class=MsoNormal>+
ULONG
DataOffset = 0; <o:p></o:p></p>
<p class=MsoNormal>+
uint32_t
EthHeaderOffset =
sizeof(eth_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>+ static const EthIPoIBHeaderOffset
= EthHeaderOffset - sizeof(ipoib_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( SendCopy );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
PSCATTER_GATHER_LIST
p_sgl = s_buf->p_sgl;<o:p></o:p></p>
<p class=MsoNormal>+ PSCATTER_GATHER_LIST
p_sgl = s_buf->p_sgl;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( !p_sgl )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT( p_sgl );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to get SGL from packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal>-
//TODO: Copy only essential data<o:p></o:p></p>
<p class=MsoNormal>-
// That is, copy only 2 chunks of ETH header if it contained in several first
SG elements<o:p></o:p></p>
<p class=MsoNormal>-
// Copy only N+1-MAX_SEND_SGE, where N is a lenght of SG List<o:p></o:p></p>
<p class=MsoNormal>-
/* Remember that one of the DS entries is reserved for the IPoIB header. */<o:p></o:p></p>
<p class=MsoNormal>-
if( ( p_sgl->NumberOfElements >= MAX_SEND_SGE ||<o:p></o:p></p>
<p class=MsoNormal>-
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_sgl )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT( p_sgl );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to get SGL from packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal>+ //TODO: Copy only essential data<o:p></o:p></p>
<p class=MsoNormal>+ // That is, copy only 2 chunks of ETH
header if it contained in several first SG elements<o:p></o:p></p>
<p class=MsoNormal>+ // Copy only N+1-MAX_SEND_SGE, where N
is a lenght of SG List<o:p></o:p></p>
<p class=MsoNormal>+ /* Remember that one of the DS entries
is reserved for the IPoIB header. */<o:p></o:p></p>
<p class=MsoNormal>+ if( ( p_sgl->NumberOfElements >=
MAX_SEND_SGE ||<o:p></o:p></p>
<p class=MsoNormal>+
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("Too many buffers %d to fit in WR ds_array[%d] \<o:p></o:p></p>
<p class=MsoNormal>-
Or buffer[0] length %d < Eth header. Copying data.\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_sgl->NumberOfElements, MAX_SEND_SGE, p_sgl->Elements[0].Length )
);<o:p></o:p></p>
<p class=MsoNormal>-
status = NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>-
if( !s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( SendCopy );<o:p></o:p></p>
<p class=MsoNormal>-
status = __send_copy( s_buf->p_port, s_buf, lso_header_size );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &s_buf->p_port->p_adapter->perf, SendCopy );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+
("Too many buffers %d to fit in WR
ds_array[%d] \<o:p></o:p></p>
<p class=MsoNormal>+
Or buffer[0] length %d < Eth header. Copying data.\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_sgl->NumberOfElements, MAX_SEND_SGE, p_sgl->Elements[0].Length )
);<o:p></o:p></p>
<p class=MsoNormal>+ status =
NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>+ if(
!s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_start( SendCopy );<o:p></o:p></p>
<p class=MsoNormal>+
status = __send_copy( s_buf->p_port, s_buf, lso_header_size );<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_stop( &s_buf->p_port->p_adapter->perf, SendCopy );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT(
IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Skip the ethernet header. It is either the first element,<o:p></o:p></p>
<p class=MsoNormal>-
* or part of it.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
i = 0;<o:p></o:p></p>
<p class=MsoNormal>-
DataOffset= (ULONG)(NET_BUFFER_CURRENT_MDL_OFFSET(s_buf->p_curr_nb)); <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( lso_data_index )<o:p></o:p></p>
<p class=MsoNormal>-
{ /* we have an LSO packet */<o:p></o:p></p>
<p class=MsoNormal>-
i = lso_data_index;<o:p></o:p></p>
<p class=MsoNormal>-
j = 0;<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT( i <= p_sgl->NumberOfElements);<o:p></o:p></p>
<p class=MsoNormal>-
if (i == p_sgl->NumberOfElements) {<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Skip the ethernet header.
It is either the first element,<o:p></o:p></p>
<p class=MsoNormal>+ * or part of it.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ i = 0;<o:p></o:p></p>
<p class=MsoNormal>+ DataOffset=
(ULONG)(NET_BUFFER_CURRENT_MDL_OFFSET(s_buf->p_curr_nb)); <o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if( lso_data_index )<o:p></o:p></p>
<p class=MsoNormal>+ { /* we have an LSO packet */<o:p></o:p></p>
<p class=MsoNormal>+ i =
lso_data_index;<o:p></o:p></p>
<p class=MsoNormal>+ j = 0;<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT( i <=
p_sgl->NumberOfElements);<o:p></o:p></p>
<p class=MsoNormal>+ if (i ==
p_sgl->NumberOfElements) {<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/****************************<o:p></o:p></p>
<p class=MsoNormal>-
* Handle the case when there is only one SG element !<o:p></o:p></p>
<p class=MsoNormal>-
****************************/<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].vaddr = <o:p></o:p></p>
<p class=MsoNormal>-
p_sgl->Elements[0].Address.QuadPart + lso_header_size + DataOffset +
EthIPoIBHeaderOffset;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].length = <o:p></o:p></p>
<p class=MsoNormal>-
p_sgl->Elements[0].Length - lso_header_size - DataOffset -
EthIPoIBHeaderOffset;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
/* Set the number of data segments. */<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.num_ds = 1;<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>-
}
<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else while( EthHeaderOffset )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
if( p_sgl->Elements[i].Length <= EthHeaderOffset )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
EthHeaderOffset -= p_sgl->Elements[i++].Length;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].vaddr =<o:p></o:p></p>
<p class=MsoNormal>-
p_sgl->Elements[i].Address.QuadPart + EthHeaderOffset + DataOffset;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></p>
<p class=MsoNormal>-
p_sgl->Elements[i].Length - EthHeaderOffset - DataOffset;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
i++;<o:p></o:p></p>
<p class=MsoNormal>-
j++;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* Now fill in the rest of the local data segments. */<o:p></o:p></p>
<p class=MsoNormal>-
while( i < p_sgl->NumberOfElements )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].vaddr = p_sgl->Elements[i].Address.QuadPart;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].length = p_sgl->Elements[i].Length;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
i++;<o:p></o:p></p>
<p class=MsoNormal>-
j++;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /****************************<o:p></o:p></p>
<p class=MsoNormal>+
* Handle the case when there is only one SG element !<o:p></o:p></p>
<p class=MsoNormal>+
****************************/<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].vaddr = <o:p></o:p></p>
<p class=MsoNormal>+
p_sgl->Elements[0].Address.QuadPart + lso_header_size + DataOffset +
EthIPoIBHeaderOffset;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].length = <o:p></o:p></p>
<p class=MsoNormal>+
p_sgl->Elements[0].Length - lso_header_size - DataOffset -
EthIPoIBHeaderOffset;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+
/* Set the number of data segments. */<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].wr.num_ds = 1;<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+
} <o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else while( EthHeaderOffset )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_sgl->Elements[i].Length <= EthHeaderOffset )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
EthHeaderOffset -= p_sgl->Elements[i++].Length;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].vaddr =<o:p></o:p></p>
<p class=MsoNormal>+
p_sgl->Elements[i].Address.QuadPart
+ EthHeaderOffset + DataOffset;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></p>
<p class=MsoNormal>+
p_sgl->Elements[i].Length - EthHeaderOffset - DataOffset;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+
i++;<o:p></o:p></p>
<p class=MsoNormal>+
j++;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ /* Now fill in the rest of the local
data segments. */<o:p></o:p></p>
<p class=MsoNormal>+ while( i < p_sgl->NumberOfElements
)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].vaddr = p_sgl->Elements[i].Address.QuadPart;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].length = p_sgl->Elements[i].Length;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+ i++;<o:p></o:p></p>
<p class=MsoNormal>+ j++;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Set the number of data segments. */<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.num_ds = j;<o:p></o:p></p>
<p class=MsoNormal>+ /* Set the number of data segments. */<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.num_ds = j;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_filter_ip(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_send_NB_SG
*s_buf )<o:p></o:p></p>
<p class=MsoNormal>+ IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_send_NB_SG
*s_buf )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>-
ip_hdr_t
*p_ip_hdr;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
ip_packet_len;<o:p></o:p></p>
<p class=MsoNormal>-
size_t
iph_size_in_bytes;<o:p></o:p></p>
<p class=MsoNormal>-
size_t
iph_options_size;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( QueryIp );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( SendTcp );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( FilterUdp );<o:p></o:p></p>
<p class=MsoNormal>+ NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>+
ip_hdr_t *p_ip_hdr;<o:p></o:p></p>
<p class=MsoNormal>+
uint32_t ip_packet_len;<o:p></o:p></p>
<p class=MsoNormal>+ size_t
iph_size_in_bytes;<o:p></o:p></p>
<p class=MsoNormal>+
size_t iph_options_size;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( QueryIp );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( SendTcp );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( FilterUdp );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal>-
if( !buf_len )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( QueryIp );<o:p></o:p></p>
<p class=MsoNormal>-
NdisGetNextMdl ( p_mdl, &p_mdl );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to get IP header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal>+ if( !buf_len )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
QueryIp );<o:p></o:p></p>
<p class=MsoNormal>+ NdisGetNextMdl (
p_mdl, &p_mdl );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to get IP header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
NdisQueryMdl(p_mdl, &p_ip_hdr, &buf_len, NormalPagePriority);<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_ip_hdr )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to query IP header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, QueryIp );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if( buf_len < sizeof(ip_hdr_t) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* This buffer is done for. Get the next buffer. */<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Buffer too small for IP packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
NdisQueryMdl(p_mdl, &p_ip_hdr, &buf_len, NormalPagePriority);<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_ip_hdr )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to query IP header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, QueryIp );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_ip_hdr =
(ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ if( buf_len < sizeof(ip_hdr_t) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* This buffer
is done for. Get the next buffer. */<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Buffer too small for IP packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
switch( p_ip_hdr->prot )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
case IP_PROT_UDP:<o:p></o:p></p>
<p class=MsoNormal>+ switch( p_ip_hdr->prot )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ case IP_PROT_UDP:<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( FilterUdp );<o:p></o:p></p>
<p class=MsoNormal>-
status = __send_mgr_filter_udp( p_ip_hdr, p_mdl, (buf_len - sizeof(ip_hdr_t)),
s_buf );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, FilterUdp );<o:p></o:p></p>
<p class=MsoNormal>-
if( status == NDIS_STATUS_PENDING )<o:p></o:p></p>
<p class=MsoNormal>-
{ /* not DHCP packet, keep going */<o:p></o:p></p>
<p class=MsoNormal>-
if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_dir = SEND_RC_QP;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
case IP_PROT_TCP:<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_dir = SEND_RC_QP;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
case IP_PROT_IGMP:<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
In igmp packet I saw that iph arrive in 2 NDIS_BUFFERs:<o:p></o:p></p>
<p class=MsoNormal>-
1. iph<o:p></o:p></p>
<p class=MsoNormal>-
2. ip options<o:p></o:p></p>
<p class=MsoNormal>-
So to get the IGMP packet we need to skip the ip options NDIS_BUFFER<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
iph_size_in_bytes = (p_ip_hdr->ver_hl & 0xf) * 4;<o:p></o:p></p>
<p class=MsoNormal>-
iph_options_size = iph_size_in_bytes - buf_len;<o:p></o:p></p>
<p class=MsoNormal>-
buf_len -= sizeof(ip_hdr_t);//without ipheader<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
FilterUdp );<o:p></o:p></p>
<p class=MsoNormal>+ status =
__send_mgr_filter_udp( p_ip_hdr, p_mdl, (buf_len - sizeof(ip_hdr_t)), s_buf );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, FilterUdp );<o:p></o:p></p>
<p class=MsoNormal>+ if( status ==
NDIS_STATUS_PENDING )<o:p></o:p></p>
<p class=MsoNormal>+ { /* not
DHCP packet, keep going */<o:p></o:p></p>
<p class=MsoNormal>+
if( ETH_IS_MULTICAST(
p_eth_hdr->dst.addr ) )<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>+
else<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_dir = SEND_RC_QP;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ case IP_PROT_TCP:<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_dir = SEND_RC_QP;<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ case IP_PROT_IGMP:<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ In igmp packet I
saw that iph arrive in 2 NDIS_BUFFERs:<o:p></o:p></p>
<p class=MsoNormal>+ 1. iph<o:p></o:p></p>
<p class=MsoNormal>+ 2. ip options<o:p></o:p></p>
<p class=MsoNormal>+
So to get the IGMP packet we need to skip the ip options NDIS_BUFFER<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal>+
iph_size_in_bytes = (p_ip_hdr->ver_hl & 0xf) * 4;<o:p></o:p></p>
<p class=MsoNormal>+
iph_options_size = iph_size_in_bytes - buf_len;<o:p></o:p></p>
<p class=MsoNormal>+
buf_len -= sizeof(ip_hdr_t);//without ipheader<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
Could be a case that arrived igmp packet not from type IGMPv2 ,<o:p></o:p></p>
<p class=MsoNormal>-
but IGMPv1 or IGMPv3.<o:p></o:p></p>
<p class=MsoNormal>-
We anyway pass it to __send_mgr_filter_igmp_v2().<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
status =<o:p></o:p></p>
<p class=MsoNormal>-
__send_mgr_filter_igmp_v2( s_buf->p_port, p_ip_hdr, iph_options_size, p_mdl,
buf_len );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>+
/*<o:p></o:p></p>
<p class=MsoNormal>+ Could be a case that
arrived igmp packet not from type IGMPv2 ,<o:p></o:p></p>
<p class=MsoNormal>+ but IGMPv1 or
IGMPv3.<o:p></o:p></p>
<p class=MsoNormal>+ We anyway pass
it to __send_mgr_filter_igmp_v2().<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ status =<o:p></o:p></p>
<p class=MsoNormal>+
__send_mgr_filter_igmp_v2( s_buf->p_port, p_ip_hdr, iph_options_size, p_mdl,
buf_len );<o:p></o:p></p>
<p class=MsoNormal>+ if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+
return status;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
case IP_PROT_ICMP:<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>-
default:<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( !s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>-
goto send_gen;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else if( endpt_cm_get_state( p_desc->p_endpt ) != IPOIB_CM_CONNECTED )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if( p_desc->send_dir == SEND_UD_QP )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ip_packet_len = cl_ntoh16( p_ip_hdr->length );<o:p></o:p></p>
<p class=MsoNormal>-
if( ip_packet_len > s_buf->p_port->p_adapter->params.payload_mtu
)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
//TODO: NDIS60<o:p></o:p></p>
<p class=MsoNormal>-
#if 0<o:p></o:p></p>
<p class=MsoNormal>-
status = __send_fragments( p_port, p_desc, (eth_hdr_t* const)p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
(ip_hdr_t* const)p_ip_hdr, (uint32_t)buf_len, p_mdl );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
#endif<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ case IP_PROT_ICMP:<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>+ default:<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if(
!s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>+ goto send_gen;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else if( endpt_cm_get_state(
p_desc->p_endpt ) != IPOIB_CM_CONNECTED )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ if( p_desc->send_dir == SEND_UD_QP )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ ip_packet_len =
cl_ntoh16( p_ip_hdr->length );<o:p></o:p></p>
<p class=MsoNormal>+ if(
ip_packet_len > s_buf->p_port->p_adapter->params.payload_mtu
)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
//TODO: NDIS60<o:p></o:p></p>
<p class=MsoNormal>+
#if 0<o:p></o:p></p>
<p class=MsoNormal>+
status = __send_fragments( p_port, p_desc, (eth_hdr_t* const)p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
(ip_hdr_t* const)p_ip_hdr, (uint32_t)buf_len, p_mdl );<o:p></o:p></p>
<p class=MsoNormal>+
return status;<o:p></o:p></p>
<p class=MsoNormal>+
#endif<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> send_gen:<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( SendTcp );<o:p></o:p></p>
<p class=MsoNormal>-
status = __send_gen( s_buf, 0, 0 );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, SendTcp );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( SendTcp );<o:p></o:p></p>
<p class=MsoNormal>+ status = __send_gen( s_buf, 0, 0
);<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, SendTcp );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_filter_igmp_v2(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
IN
size_t
iph_options_size,<o:p></o:p></p>
<p class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
IN
size_t
buf_len )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ip_hdr_t* const
p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
IN
size_t
iph_options_size,<o:p></o:p></p>
<p class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+
IN
size_t
buf_len )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
igmp_v2_hdr_t
*p_igmp_v2_hdr = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS
endpt_status;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t*
p_endpt = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
mac_addr_t
fake_mcast_mac;<o:p></o:p></p>
<p class=MsoNormal>+ igmp_v2_hdr_t
*p_igmp_v2_hdr = NULL;<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_STATUS endpt_status;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_endpt_t* p_endpt = NULL;<o:p></o:p></p>
<p class=MsoNormal>+
mac_addr_t
fake_mcast_mac;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>-
("buf_len = %d,iph_options_size =
%d\n",(int)buf_len,(int)iph_options_size ) );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>+
("buf_len = %d,iph_options_size =
%d\n",(int)buf_len,(int)iph_options_size ) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( !buf_len )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
// To get the IGMP packet we need to skip the ip options NDIS_BUFFER (if exists)<o:p></o:p></p>
<p class=MsoNormal>-
while ( iph_options_size )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_igmp_v2_hdr )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
iph_options_size-=buf_len;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( !buf_len )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ // To get the
IGMP packet we need to skip the ip options NDIS_BUFFER (if exists)<o:p></o:p></p>
<p class=MsoNormal>+ while (
iph_options_size )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></p>
<p class=MsoNormal>+
if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority );<o:p></o:p></p>
<p class=MsoNormal>+
if( !p_igmp_v2_hdr )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
iph_options_size-=buf_len;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_igmp_v2_hdr )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* assuming ip header and options are in the same packet */<o:p></o:p></p>
<p class=MsoNormal>-
p_igmp_v2_hdr = (igmp_v2_hdr_t *) GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* Get the IGMP header length. */<o:p></o:p></p>
<p class=MsoNormal>-
if( buf_len < sizeof(igmp_v2_hdr_t) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Buffer not large enough for IGMPv2 packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ NdisGetNextMdl(
p_mdl, &p_mdl );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ NdisQueryMdl(
p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority );<o:p></o:p></p>
<p class=MsoNormal>+ if(
!p_igmp_v2_hdr )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* assuming ip
header and options are in the same packet */<o:p></o:p></p>
<p class=MsoNormal>+ p_igmp_v2_hdr =
(igmp_v2_hdr_t *) GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ /* Get the IGMP header length. */<o:p></o:p></p>
<p class=MsoNormal>+ if( buf_len < sizeof(igmp_v2_hdr_t) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Buffer not large enough for IGMPv2
packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
// build fake mac from igmp packet group address<o:p></o:p></p>
<p class=MsoNormal>-
fake_mcast_mac.addr[0] = 1;<o:p></o:p></p>
<p class=MsoNormal>-
fake_mcast_mac.addr[1] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[0] & 0x0f;<o:p></o:p></p>
<p class=MsoNormal>-
fake_mcast_mac.addr[2] = 0x5E;<o:p></o:p></p>
<p class=MsoNormal>-
fake_mcast_mac.addr[3] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[1];<o:p></o:p></p>
<p class=MsoNormal>-
fake_mcast_mac.addr[4] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[2];<o:p></o:p></p>
<p class=MsoNormal>-
fake_mcast_mac.addr[5] = ((unsigned char*)&p_igmp_v2_hdr->group_address)[3];<o:p></o:p></p>
<p class=MsoNormal>+ // build fake mac from igmp packet group
address<o:p></o:p></p>
<p class=MsoNormal>+ fake_mcast_mac.addr[0] = 1;<o:p></o:p></p>
<p class=MsoNormal>+ fake_mcast_mac.addr[1] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[0] & 0x0f;<o:p></o:p></p>
<p class=MsoNormal>+ fake_mcast_mac.addr[2] = 0x5E;<o:p></o:p></p>
<p class=MsoNormal>+ fake_mcast_mac.addr[3] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[1];<o:p></o:p></p>
<p class=MsoNormal>+ fake_mcast_mac.addr[4] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[2];<o:p></o:p></p>
<p class=MsoNormal>+ fake_mcast_mac.addr[5] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[3];<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
switch ( p_igmp_v2_hdr->type )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
case IGMP_V2_MEMBERSHIP_REPORT:<o:p></o:p></p>
<p class=MsoNormal>-
/* <o:p></o:p></p>
<p class=MsoNormal>-
This mean that some body open listener on this group <o:p></o:p></p>
<p class=MsoNormal>-
Change type of mcast endpt to SEND_RECV endpt. So mcast garbage collector <o:p></o:p></p>
<p class=MsoNormal>-
will not delete this mcast endpt.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>-
("Catched IGMP_V2_MEMBERSHIP_REPORT message\n") );<o:p></o:p></p>
<p class=MsoNormal>-
endpt_status = __endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref
called for %p\n", p_endpt));<o:p></o:p></p>
<p class=MsoNormal>-
if ( p_endpt )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->is_mcast_listener = TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ switch ( p_igmp_v2_hdr->type )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ case IGMP_V2_MEMBERSHIP_REPORT:<o:p></o:p></p>
<p class=MsoNormal>+ /* <o:p></o:p></p>
<p class=MsoNormal>+
This mean that some body open
listener on this group <o:p></o:p></p>
<p class=MsoNormal>+
Change type of mcast endpt to SEND_RECV endpt. So mcast garbage collector <o:p></o:p></p>
<p class=MsoNormal>+
will not delete this mcast endpt.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>+
("Catched IGMP_V2_MEMBERSHIP_REPORT message\n") );<o:p></o:p></p>
<p class=MsoNormal>+ endpt_status =
__endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for
%p\n", p_endpt));<o:p></o:p></p>
<p class=MsoNormal>+ if ( p_endpt )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->is_mcast_listener = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>
ipoib_endpt_deref( p_endpt );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
case IGMP_V2_LEAVE_GROUP:<o:p></o:p></p>
<p class=MsoNormal>-
/* <o:p></o:p></p>
<p class=MsoNormal>-
This mean that somebody CLOSE listener on this group .<o:p></o:p></p>
<p class=MsoNormal>-
Change type of mcast endpt to SEND_ONLY endpt. So mcast <o:p></o:p></p>
<p class=MsoNormal>-
garbage collector will delete this mcast endpt next time.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>-
("Catched IGMP_V2_LEAVE_GROUP message\n") );<o:p></o:p></p>
<p class=MsoNormal>-
endpt_status = __endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref
called for %p\n", p_endpt));<o:p></o:p></p>
<p class=MsoNormal>-
if ( p_endpt )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->is_mcast_listener = FALSE;<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->is_in_use = FALSE;<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_deref( p_endpt );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ case IGMP_V2_LEAVE_GROUP:<o:p></o:p></p>
<p class=MsoNormal>+ /* <o:p></o:p></p>
<p class=MsoNormal>+
This mean that somebody CLOSE listener on this group .<o:p></o:p></p>
<p class=MsoNormal>+
Change type of mcast endpt to SEND_ONLY endpt. So mcast <o:p></o:p></p>
<p class=MsoNormal>+
garbage collector will delete this mcast endpt next time.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>+
("Catched IGMP_V2_LEAVE_GROUP message\n") );<o:p></o:p></p>
<p class=MsoNormal>+ endpt_status =
__endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for
%p\n", p_endpt));<o:p></o:p></p>
<p class=MsoNormal>+ if ( p_endpt )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->is_mcast_listener = FALSE;<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->is_in_use = FALSE;<o:p></o:p></p>
<p class=MsoNormal>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_endpt_deref( p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
__port_do_mcast_garbage(p_port);<o:p></o:p></p>
<p class=MsoNormal>+ __port_do_mcast_garbage(p_port);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
default:<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>-
("Send Unknown IGMP message: 0x%x \n",
p_igmp_v2_hdr->type ) );<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ default:<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>+
("Send Unknown IGMP message: 0x%x \n", p_igmp_v2_hdr->type ) );<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_filter_udp(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const ip_hdr_t* const
p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>-
IN OUT
ipoib_send_NB_SG*
s_buf )<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+ IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>+ IN
OUT
ipoib_send_NB_SG*
s_buf )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>-
udp_hdr_t
*p_udp_hdr;<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( QueryUdp );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( SendUdp );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( FilterDhcp );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_STATUS status;<o:p></o:p></p>
<p class=MsoNormal>+
udp_hdr_t
*p_udp_hdr;<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( QueryUdp );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( SendUdp );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( FilterDhcp );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( !buf_len )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( QueryUdp );<o:p></o:p></p>
<p class=MsoNormal>-
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to get UDP header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
NdisQueryMdl( p_mdl, &p_udp_hdr, &buf_len, NormalPagePriority );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_udp_hdr )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to query UDP header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &s_buf->p_port->p_adapter->perf, QueryUdp );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_udp_hdr = (udp_hdr_t*)GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* Get the UDP header and check the destination port numbers. */<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if (p_ip_hdr->offset > 0) {<o:p></o:p></p>
<p class=MsoNormal>-
/* This is a fragmented part of UDP packet<o:p></o:p></p>
<p class=MsoNormal>-
* Only first packet will contain UDP header in such case<o:p></o:p></p>
<p class=MsoNormal>-
* So, return if offset > 0<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( buf_len < sizeof(udp_hdr_t) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Buffer not large enough for UDP packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( !buf_len )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
QueryUdp );<o:p></o:p></p>
<p class=MsoNormal>+ NdisGetNextMdl(
p_mdl, &p_mdl );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to get UDP header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ NdisQueryMdl(
p_mdl, &p_udp_hdr, &buf_len, NormalPagePriority );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_udp_hdr )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to query UDP header buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&s_buf->p_port->p_adapter->perf, QueryUdp );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_udp_hdr =
(udp_hdr_t*)GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ /* Get the UDP header and check the
destination port numbers. */<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if (p_ip_hdr->offset > 0) {<o:p></o:p></p>
<p class=MsoNormal>+ /* This is a
fragmented part of UDP packet<o:p></o:p></p>
<p class=MsoNormal>+ * Only
first packet will contain UDP header in such case<o:p></o:p></p>
<p class=MsoNormal>+ * So,
return if offset > 0<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if( buf_len < sizeof(udp_hdr_t) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Buffer not large enough for UDP packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( (p_udp_hdr->src_port != DHCP_PORT_CLIENT ||<o:p></o:p></p>
<p class=MsoNormal>-
p_udp_hdr->dst_port != DHCP_PORT_SERVER) &&<o:p></o:p></p>
<p class=MsoNormal>-
(p_udp_hdr->src_port != DHCP_PORT_SERVER ||<o:p></o:p></p>
<p class=MsoNormal>-
p_udp_hdr->dst_port != DHCP_PORT_CLIENT) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Not a DHCP packet. */<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( (p_udp_hdr->src_port !=
DHCP_PORT_CLIENT ||<o:p></o:p></p>
<p class=MsoNormal>+
p_udp_hdr->dst_port != DHCP_PORT_SERVER) &&<o:p></o:p></p>
<p class=MsoNormal>+
(p_udp_hdr->src_port != DHCP_PORT_SERVER ||<o:p></o:p></p>
<p class=MsoNormal>+
p_udp_hdr->dst_port != DHCP_PORT_CLIENT) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* Not a DHCP
packet. */<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
buf_len -= sizeof(udp_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>+ buf_len -= sizeof(udp_hdr_t);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Allocate our scratch buffer. */<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_send_buf = (send_buf_t*)<o:p></o:p></p>
<p class=MsoNormal>-
ExAllocateFromNPagedLookasideList( &s_buf->p_port->buf_mgr.send_buf_list
);<o:p></o:p></p>
<p class=MsoNormal>-
if( !s_buf->p_send_buf )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to query DHCP packet buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* Copy the IP and UDP headers. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( &s_buf->p_send_buf->ip.hdr, p_ip_hdr , sizeof(ip_hdr_t) );<o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy(<o:p></o:p></p>
<p class=MsoNormal>-
&s_buf->p_send_buf->ip.prot.udp.hdr, p_udp_hdr, sizeof(udp_hdr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ /* Allocate our scratch buffer. */<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_send_buf = (send_buf_t*)<o:p></o:p></p>
<p class=MsoNormal>+
ExAllocateFromNPagedLookasideList(
&s_buf->p_port->buf_mgr.send_buf_list );<o:p></o:p></p>
<p class=MsoNormal>+ if( !s_buf->p_send_buf )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to query DHCP packet buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ /* Copy the IP and UDP headers. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy(
&s_buf->p_send_buf->ip.hdr, p_ip_hdr , sizeof(ip_hdr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy(<o:p></o:p></p>
<p class=MsoNormal>+
&s_buf->p_send_buf->ip.prot.udp.hdr, p_udp_hdr, sizeof(udp_hdr_t) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( FilterDhcp );<o:p></o:p></p>
<p class=MsoNormal>-
status = __send_mgr_filter_dhcp( p_udp_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, FilterDhcp );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( FilterDhcp );<o:p></o:p></p>
<p class=MsoNormal>+ status = __send_mgr_filter_dhcp(
p_udp_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, FilterDhcp );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> unsigned short ipchksum(unsigned short *ip, int len)<o:p></o:p></p>
<p class=MsoNormal>@@ -4515,646 +4562,646 @@<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_filter_dhcp(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const udp_hdr_t*
const
p_udp_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
IN
NDIS_BUFFER*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>-
IN
OUT
ipoib_send_NB_SG*
s_buf )<o:p></o:p></p>
<p class=MsoNormal>+ IN
const udp_hdr_t*
const
p_udp_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
IN
NDIS_BUFFER*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>+ IN
OUT
ipoib_send_NB_SG*
s_buf )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
dhcp_pkt_t
*p_dhcp;<o:p></o:p></p>
<p class=MsoNormal>-
dhcp_pkt_t
*p_ib_dhcp;<o:p></o:p></p>
<p class=MsoNormal>-
uint8_t
*p_option, *p_cid = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
uint8_t
msg = 0;<o:p></o:p></p>
<p class=MsoNormal>-
size_t
len;<o:p></o:p></p>
<p class=MsoNormal>+
dhcp_pkt_t *p_dhcp;<o:p></o:p></p>
<p class=MsoNormal>+
dhcp_pkt_t *p_ib_dhcp;<o:p></o:p></p>
<p class=MsoNormal>+
uint8_t
*p_option, *p_cid = NULL;<o:p></o:p></p>
<p class=MsoNormal>+
uint8_t
msg = 0;<o:p></o:p></p>
<p class=MsoNormal>+
size_t
len;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( !buf_len )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to get DHCP buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
NdisQueryMdl( p_mdl, &p_dhcp, &buf_len, NormalPagePriority );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_dhcp )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to query DHCP buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_dhcp = (dhcp_pkt_t*)(p_udp_hdr + 1);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if( !buf_len )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ NdisGetNextMdl(
p_mdl, &p_mdl );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to get DHCP buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ NdisQueryMdl(
p_mdl, &p_dhcp, &buf_len, NormalPagePriority );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_dhcp )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed
to query DHCP buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_dhcp =
(dhcp_pkt_t*)(p_udp_hdr + 1);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( buf_len < DHCP_MIN_SIZE )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Buffer not large enough for DHCP packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( buf_len < DHCP_MIN_SIZE )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Buffer not large enough for DHCP packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_ib_dhcp = &s_buf->p_send_buf->ip.prot.udp.dhcp;<o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( p_ib_dhcp, p_dhcp, buf_len );<o:p></o:p></p>
<p class=MsoNormal>+ p_ib_dhcp =
&s_buf->p_send_buf->ip.prot.udp.dhcp;<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy( p_ib_dhcp, p_dhcp, buf_len );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Now scan through the options looking for the client identifier. */<o:p></o:p></p>
<p class=MsoNormal>-
p_option = &p_ib_dhcp->options[4];<o:p></o:p></p>
<p class=MsoNormal>-
while( *p_option != DHCP_OPT_END && p_option <
&p_ib_dhcp->options[312] )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
switch( *p_option )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
case DHCP_OPT_PAD:<o:p></o:p></p>
<p class=MsoNormal>-
p_option++;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ /* Now scan through the options looking
for the client identifier. */<o:p></o:p></p>
<p class=MsoNormal>+ p_option =
&p_ib_dhcp->options[4];<o:p></o:p></p>
<p class=MsoNormal>+ while( *p_option != DHCP_OPT_END
&& p_option < &p_ib_dhcp->options[312] )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ switch(
*p_option )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ case DHCP_OPT_PAD:<o:p></o:p></p>
<p class=MsoNormal>+
p_option++;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
case DHCP_OPT_MSG:<o:p></o:p></p>
<p class=MsoNormal>-
msg = p_option[2];<o:p></o:p></p>
<p class=MsoNormal>-
p_option += 3;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ case
DHCP_OPT_MSG:<o:p></o:p></p>
<p class=MsoNormal>+
msg = p_option[2];<o:p></o:p></p>
<p class=MsoNormal>+
p_option += 3;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
case DHCP_OPT_CLIENT_ID:<o:p></o:p></p>
<p class=MsoNormal>-
p_cid = p_option;<o:p></o:p></p>
<p class=MsoNormal>-
/* Fall through. */<o:p></o:p></p>
<p class=MsoNormal>+ case
DHCP_OPT_CLIENT_ID:<o:p></o:p></p>
<p class=MsoNormal>+
p_cid = p_option;<o:p></o:p></p>
<p class=MsoNormal>+
/* Fall through. */<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
default:<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* All other options have a length byte following the option code.<o:p></o:p></p>
<p class=MsoNormal>-
* Offset by the length to get to the next option.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
p_option += (p_option[1] + 2);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ default:<o:p></o:p></p>
<p class=MsoNormal>+
/*<o:p></o:p></p>
<p class=MsoNormal>+
* All other options have a length byte following the option code.<o:p></o:p></p>
<p class=MsoNormal>+
* Offset by the length to get to the next option.<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal>+
p_option += (p_option[1] + 2);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
switch( msg )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Client messages */<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPDISCOVER:<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPREQUEST:<o:p></o:p></p>
<p class=MsoNormal>-
p_ib_dhcp->flags |= DHCP_FLAGS_BROADCAST;<o:p></o:p></p>
<p class=MsoNormal>-
/* Fall through */<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPDECLINE:<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPRELEASE:<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPINFORM:<o:p></o:p></p>
<p class=MsoNormal>-
/* Fix up the client identifier option */<o:p></o:p></p>
<p class=MsoNormal>-
if( p_cid )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* do we need to replace it ? len eq ETH MAC sz 'and' MAC is mine */<o:p></o:p></p>
<p class=MsoNormal>-
if( p_cid[1] == HW_ADDR_LEN+1 && !cl_memcmp( &p_cid[3],<o:p></o:p></p>
<p class=MsoNormal>-
&s_buf->p_port->p_adapter->params.conf_mac.addr, HW_ADDR_LEN ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Make sure there's room to extend it. 22 is the size of<o:p></o:p></p>
<p class=MsoNormal>-
* the CID option for IPoIB. (20 is the length, one byte for type and the second
for lenght field)<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
if( buf_len + coIPoIB_CID_TotalLen - p_cid[1] > sizeof(dhcp_pkt_t) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* Move the existing options down, and add a new CID option */<o:p></o:p></p>
<p class=MsoNormal>-
len = p_option - ( p_cid + p_cid[1] + 2 );<o:p></o:p></p>
<p class=MsoNormal>-
p_option = p_cid + p_cid[1] + 2;<o:p></o:p></p>
<p class=MsoNormal>-
RtlMoveMemory( p_cid, p_option, len );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
p_cid += len;<o:p></o:p></p>
<p class=MsoNormal>-
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></p>
<p class=MsoNormal>-
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Make sure there's room to extend it. 23 is the size of<o:p></o:p></p>
<p class=MsoNormal>-
* the CID option for IPoIB.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
if( buf_len + coIPoIB_CID_TotalLen > sizeof(dhcp_pkt_t) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ switch( msg )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* Client messages */<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPDISCOVER:<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPREQUEST:<o:p></o:p></p>
<p class=MsoNormal>+
p_ib_dhcp->flags |= DHCP_FLAGS_BROADCAST;<o:p></o:p></p>
<p class=MsoNormal>+ /* Fall through
*/<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPDECLINE:<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPRELEASE:<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPINFORM:<o:p></o:p></p>
<p class=MsoNormal>+ /* Fix up the
client identifier option */<o:p></o:p></p>
<p class=MsoNormal>+ if( p_cid )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/* do we need to replace it ? len eq ETH MAC sz 'and' MAC is mine */<o:p></o:p></p>
<p class=MsoNormal>+
if( p_cid[1] == HW_ADDR_LEN+1 && !cl_memcmp( &p_cid[3],<o:p></o:p></p>
<p class=MsoNormal>+
&s_buf->p_port->p_adapter->params.conf_mac.addr, HW_ADDR_LEN ) )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
/* Make sure there's room to extend it. 22 is the size of<o:p></o:p></p>
<p class=MsoNormal>+
* the CID option for IPoIB. (20 is the length, one byte for type and the second
for lenght field)<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal>+
if( buf_len + coIPoIB_CID_TotalLen - p_cid[1] > sizeof(dhcp_pkt_t) )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
/* Move the existing options down, and add a new CID option */<o:p></o:p></p>
<p class=MsoNormal>+
len = p_option - ( p_cid + p_cid[1] + 2 );<o:p></o:p></p>
<p class=MsoNormal>+
p_option = p_cid + p_cid[1] + 2;<o:p></o:p></p>
<p class=MsoNormal>+
RtlMoveMemory( p_cid, p_option, len );<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
p_cid += len;<o:p></o:p></p>
<p class=MsoNormal>+
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></p>
<p class=MsoNormal>+
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/*<o:p></o:p></p>
<p class=MsoNormal>+
* Make sure there's room to extend it. 23 is the size of<o:p></o:p></p>
<p class=MsoNormal>+
* the CID option for IPoIB.<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal>+
if( buf_len + coIPoIB_CID_TotalLen > sizeof(dhcp_pkt_t) )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_cid = p_option;<o:p></o:p></p>
<p class=MsoNormal>-
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></p>
<p class=MsoNormal>-
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
p_cid = p_option;<o:p></o:p></p>
<p class=MsoNormal>+
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></p>
<p class=MsoNormal>+
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_cid[1] == coIPoIB_CID_Len);<o:p></o:p></p>
<p class=MsoNormal>-
p_cid[coIPoIB_CID_TotalLen]= DHCP_OPT_END;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
// Copy the default prefix for ALL DHCP messages<o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( &p_cid[2], &coIBDefaultDHCPPrefix[0], sizeof coIBDefaultDHCPPrefix);<o:p></o:p></p>
<p class=MsoNormal>-
// Copy the GUID into the last 8 bytes of the CID field<o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( &p_cid[2+
sizeof(coIBDefaultDHCPPrefix)],&s_buf->p_port->p_adapter->guids.port_guid.guid
, <o:p></o:p></p>
<p class=MsoNormal>-
sizeof(s_buf->p_port->p_adapter->guids.port_guid.guid) );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
p_ib_dhcp->htype = DHCP_HW_TYPE_IB;<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
p_cid[1] == coIPoIB_CID_Len);<o:p></o:p></p>
<p class=MsoNormal>+
p_cid[coIPoIB_CID_TotalLen]= DHCP_OPT_END;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ // Copy the
default prefix for ALL DHCP messages<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy(
&p_cid[2], &coIBDefaultDHCPPrefix[0], sizeof coIBDefaultDHCPPrefix);<o:p></o:p></p>
<p class=MsoNormal>+ // Copy the GUID
into the last 8 bytes of the CID field<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy(
&p_cid[2+
sizeof(coIBDefaultDHCPPrefix)],&s_buf->p_port->p_adapter->guids.port_guid.guid
, <o:p></o:p></p>
<p class=MsoNormal>+
sizeof(s_buf->p_port->p_adapter->guids.port_guid.guid) );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+
p_ib_dhcp->htype = DHCP_HW_TYPE_IB;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Server messages. */<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPOFFER:<o:p></o:p></p>
<p class=MsoNormal>-
p_ib_dhcp->htype = 0x20;<o:p></o:p></p>
<p class=MsoNormal>-
p_ib_dhcp->hlen = 0x8;<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPACK:<o:p></o:p></p>
<p class=MsoNormal>-
case DHCPNAK:<o:p></o:p></p>
<p class=MsoNormal>-
/* don't touch server messages */<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ /* Server messages. */<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPOFFER:<o:p></o:p></p>
<p class=MsoNormal>+
p_ib_dhcp->htype = 0x20;<o:p></o:p></p>
<p class=MsoNormal>+
p_ib_dhcp->hlen = 0x8;<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPACK:<o:p></o:p></p>
<p class=MsoNormal>+ case DHCPNAK:<o:p></o:p></p>
<p class=MsoNormal>+ /* don't touch
server messages */<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
default:<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Invalide message type.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_INVALID_DATA;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ default:<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Invalide message type.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_INVALID_DATA;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_send_buf->ip.hdr.length = cl_ntoh16( sizeof(ip_hdr_t) +
sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t) );<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_send_buf->ip.prot.udp.hdr.length = cl_ntoh16( sizeof(udp_hdr_t)
+ sizeof(dhcp_pkt_t) );<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_send_buf->ip.hdr.chksum = 0;<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_send_buf->ip.hdr.chksum = ipchksum((unsigned short*) &s_buf->p_send_buf->ip.hdr,
sizeof(ip_hdr_t));<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_send_buf->ip.hdr.length =
cl_ntoh16( sizeof(ip_hdr_t) + sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t) );<o:p></o:p></p>
<p class=MsoNormal>+
s_buf->p_send_buf->ip.prot.udp.hdr.length = cl_ntoh16( sizeof(udp_hdr_t)
+ sizeof(dhcp_pkt_t) );<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_send_buf->ip.hdr.chksum =
0;<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_send_buf->ip.hdr.chksum =
ipchksum((unsigned short*) &s_buf->p_send_buf->ip.hdr,
sizeof(ip_hdr_t));<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
/* no chksum for udp, in a case when HW does not support checksum offload */<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_send_buf->ip.prot.udp.hdr.chksum = 0;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( s_buf->p_send_buf
);<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[1].length = sizeof(ip_hdr_t)
+ sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t);<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[1].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.num_ds = 2;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ /* no chksum for udp, in a case when HW
does not support checksum offload */<o:p></o:p></p>
<p class=MsoNormal>+
s_buf->p_send_buf->ip.prot.udp.hdr.chksum = 0;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].local_ds[1].vaddr
= cl_get_physaddr( s_buf->p_send_buf );<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].local_ds[1].length
= sizeof(ip_hdr_t) + sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t);<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].local_ds[1].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.num_ds = 2;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_filter_arp(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>-
IN
OUT
ipoib_send_NB_SG*
s_buf )<o:p></o:p></p>
<p class=MsoNormal>+ IN
const eth_hdr_t* const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+
IN
size_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>+ IN
OUT
ipoib_send_NB_SG*
s_buf )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
arp_pkt_t
*p_arp;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_arp_pkt_t
*p_ib_arp;<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>-
mac_addr_t
null_hw = {0};<o:p></o:p></p>
<p class=MsoNormal>+
arp_pkt_t *p_arp;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_arp_pkt_t
*p_ib_arp;<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_STATUS status;<o:p></o:p></p>
<p class=MsoNormal>+
mac_addr_t null_hw = {0};<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( !buf_len )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to get ARP buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
NdisQueryMdl( p_mdl, &p_arp, &buf_len, NormalPagePriority );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_arp )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to get query ARP buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_arp = (arp_pkt_t*)(p_eth_hdr + 1);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if( !buf_len )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ NdisGetNextMdl(
p_mdl, &p_mdl );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_mdl )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to get ARP buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ NdisQueryMdl(
p_mdl, &p_arp, &buf_len, NormalPagePriority );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_arp )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to get query ARP buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_arp =
(arp_pkt_t*)(p_eth_hdr + 1);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Single buffer ARP packet. */<o:p></o:p></p>
<p class=MsoNormal>-
if( buf_len < sizeof(arp_pkt_t) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Buffer too short for ARP.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Single buffer ARP packet. */<o:p></o:p></p>
<p class=MsoNormal>+ if( buf_len < sizeof(arp_pkt_t) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Buffer too short for ARP.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_arp->prot_type != ETH_PROT_TYPE_IP )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Unsupported protocol type.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_INVALID_DATA;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( p_arp->prot_type != ETH_PROT_TYPE_IP
)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Unsupported protocol type.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_INVALID_DATA;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Allocate our scratch buffer. */<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(s_buf->p_send_buf == NULL);<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_send_buf = (send_buf_t*)<o:p></o:p></p>
<p class=MsoNormal>-
NdisAllocateFromNPagedLookasideList( &s_buf->p_port->buf_mgr.send_buf_list
);<o:p></o:p></p>
<p class=MsoNormal>-
if( !s_buf->p_send_buf )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to query ARP packet buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
p_ib_arp = (ipoib_arp_pkt_t*)s_buf->p_send_buf;<o:p></o:p></p>
<p class=MsoNormal>+ /* Allocate our scratch buffer. */<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(s_buf->p_send_buf == NULL);<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_send_buf = (send_buf_t*)<o:p></o:p></p>
<p class=MsoNormal>+
NdisAllocateFromNPagedLookasideList(
&s_buf->p_port->buf_mgr.send_buf_list );<o:p></o:p></p>
<p class=MsoNormal>+ if( !s_buf->p_send_buf )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to query ARP packet buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ p_ib_arp =
(ipoib_arp_pkt_t*)s_buf->p_send_buf;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Convert the ARP payload. */<o:p></o:p></p>
<p class=MsoNormal>-
p_ib_arp->hw_type = ARP_HW_TYPE_IB;<o:p></o:p></p>
<p class=MsoNormal>-
p_ib_arp->prot_type = p_arp->prot_type;<o:p></o:p></p>
<p class=MsoNormal>-
p_ib_arp->hw_size = sizeof(ipoib_hw_addr_t);<o:p></o:p></p>
<p class=MsoNormal>-
p_ib_arp->prot_size = p_arp->prot_size;<o:p></o:p></p>
<p class=MsoNormal>-
p_ib_arp->op = p_arp->op;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_addr_set_qpn( &p_ib_arp->src_hw, s_buf->p_port->ib_mgr.qpn
);<o:p></o:p></p>
<p class=MsoNormal>+ /* Convert the ARP payload. */<o:p></o:p></p>
<p class=MsoNormal>+ p_ib_arp->hw_type = ARP_HW_TYPE_IB;<o:p></o:p></p>
<p class=MsoNormal>+ p_ib_arp->prot_type = p_arp->prot_type;<o:p></o:p></p>
<p class=MsoNormal>+ p_ib_arp->hw_size =
sizeof(ipoib_hw_addr_t);<o:p></o:p></p>
<p class=MsoNormal>+ p_ib_arp->prot_size =
p_arp->prot_size;<o:p></o:p></p>
<p class=MsoNormal>+ p_ib_arp->op = p_arp->op;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ ipoib_addr_set_qpn(
&p_ib_arp->src_hw, s_buf->p_port->ib_mgr.qpn );<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_addr_set_flags( &p_ib_arp->src_hw, IPOIB_CM_FLAG_RC );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_addr_set_flags( &p_ib_arp->src_hw, IPOIB_CM_FLAG_RC );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ib_gid_set_default( &p_ib_arp->src_hw.gid,<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></p>
<p class=MsoNormal>-
p_ib_arp->src_ip = p_arp->src_ip;<o:p></o:p></p>
<p class=MsoNormal>-
if( cl_memcmp( &p_arp->dst_hw, &null_hw, sizeof(mac_addr_t) ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Get the endpoint referenced by the dst_hw address. */<o:p></o:p></p>
<p class=MsoNormal>-
net32_t
qpn = 0;<o:p></o:p></p>
<p class=MsoNormal>-
status = __endpt_mgr_get_gid_qpn( s_buf->p_port, p_arp->dst_hw,<o:p></o:p></p>
<p class=MsoNormal>-
&p_ib_arp->dst_hw.gid, &qpn );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed lookup of destination HW address\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_addr_set_qpn( &p_ib_arp->dst_hw, qpn );<o:p></o:p></p>
<p class=MsoNormal>+ ib_gid_set_default(
&p_ib_arp->src_hw.gid,<o:p></o:p></p>
<p class=MsoNormal>+
s_buf->p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></p>
<p class=MsoNormal>+ p_ib_arp->src_ip = p_arp->src_ip;<o:p></o:p></p>
<p class=MsoNormal>+ if( cl_memcmp( &p_arp->dst_hw,
&null_hw, sizeof(mac_addr_t) ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* Get the
endpoint referenced by the dst_hw address. */<o:p></o:p></p>
<p class=MsoNormal>+ net32_t qpn = 0;<o:p></o:p></p>
<p class=MsoNormal>+ status =
__endpt_mgr_get_gid_qpn( s_buf->p_port, p_arp->dst_hw,<o:p></o:p></p>
<p class=MsoNormal>+
&p_ib_arp->dst_hw.gid, &qpn );<o:p></o:p></p>
<p class=MsoNormal>+ if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed lookup of destination HW address\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_addr_set_qpn( &p_ib_arp->dst_hw, qpn );<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal>-
if( p_arp->op == ARP_OP_REP && <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->params.cm_enabled && <o:p></o:p></p>
<p class=MsoNormal>-
p_desc->p_endpt->cm_flag == IPOIB_CM_FLAG_RC )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cm_state_t cm_state;<o:p></o:p></p>
<p class=MsoNormal>-
cm_state = <o:p></o:p></p>
<p class=MsoNormal>-
( cm_state_t )InterlockedCompareExchange( (volatile LONG *)&p_desc->p_endpt->conn.state,<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_CM_CONNECT, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>
<p class=MsoNormal>-
switch( cm_state )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
case IPOIB_CM_DISCONNECTED:<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
("ARP REPLY pending Endpt[%p] QPN %#x MAC %02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->p_endpt, <o:p></o:p></p>
<p class=MsoNormal>-
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->p_endpt->mac.addr[0], p_desc->p_endpt->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->p_endpt->mac.addr[2], p_desc->p_endpt->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] ) );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_addr_set_sid( &p_desc->p_endpt->conn.service_id,<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_arp->op
== ARP_OP_REP && <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->params.cm_enabled && <o:p></o:p></p>
<p class=MsoNormal>+
p_desc->p_endpt->cm_flag == IPOIB_CM_FLAG_RC )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
cm_state_t cm_state;<o:p></o:p></p>
<p class=MsoNormal>+
cm_state = <o:p></o:p></p>
<p class=MsoNormal>+
( cm_state_t )InterlockedCompareExchange( (volatile LONG
*)&p_desc->p_endpt->conn.state,<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_CM_CONNECT, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>
<p class=MsoNormal>+
switch( cm_state )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
case IPOIB_CM_DISCONNECTED:<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+
("ARP REPLY pending Endpt[%p] QPN %#x MAC
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->p_endpt, <o:p></o:p></p>
<p class=MsoNormal>+
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->p_endpt->mac.addr[0], p_desc->p_endpt->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->p_endpt->mac.addr[2], p_desc->p_endpt->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] ) );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_addr_set_sid( &p_desc->p_endpt->conn.service_id,<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
NdisFreeToNPagedLookasideList(<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_LIST_ITEM_FROM_NBL( s_buf->p_send_buf ) );<o:p></o:p></p>
<p class=MsoNormal>-
NdisInterlockedInsertTailList( &p_port->endpt_mgr.pending_conns, <o:p></o:p></p>
<p class=MsoNormal>-
&p_desc->p_endpt->list_item, <o:p></o:p></p>
<p class=MsoNormal>-
&p_port->endpt_mgr.conn_lock );<o:p></o:p></p>
<p class=MsoNormal>-
cl_event_signal( &p_port->endpt_mgr.event );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
case IPOIB_CM_CONNECT:<o:p></o:p></p>
<p class=MsoNormal>-
/* queue ARP REP packet until connected */<o:p></o:p></p>
<p class=MsoNormal>-
NdisFreeToNPagedLookasideList(<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_LIST_ITEM_FROM_NBL( p_desc->p_pkt ) );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>-
default:<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
NdisFreeToNPagedLookasideList(<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_LIST_ITEM_FROM_NBL( s_buf->p_send_buf ) );<o:p></o:p></p>
<p class=MsoNormal>+
NdisInterlockedInsertTailList( &p_port->endpt_mgr.pending_conns, <o:p></o:p></p>
<p class=MsoNormal>+
&p_desc->p_endpt->list_item, <o:p></o:p></p>
<p class=MsoNormal>+
&p_port->endpt_mgr.conn_lock );<o:p></o:p></p>
<p class=MsoNormal>+
cl_event_signal( &p_port->endpt_mgr.event );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
case IPOIB_CM_CONNECT:<o:p></o:p></p>
<p class=MsoNormal>+
/* queue ARP REP packet until connected */<o:p></o:p></p>
<p class=MsoNormal>+
NdisFreeToNPagedLookasideList(<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_LIST_ITEM_FROM_NBL( p_desc->p_pkt ) );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>+
default:<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_memclr( &p_ib_arp->dst_hw, sizeof(ipoib_hw_addr_t) );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_memclr(
&p_ib_arp->dst_hw, sizeof(ipoib_hw_addr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal> #if 0 //DBG<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
(" ARP %s SEND to ENDPT[%p] State: %d flag: %#x, QPN: %#x MAC
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>
<p class=MsoNormal>-
( p_ib_arp->op == ARP_OP_REP ? "REP":
"REQ"),
p_desc->p_endpt, <o:p></o:p></p>
<p class=MsoNormal>-
endpt_cm_get_state( p_desc->p_endpt ),<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->p_endpt->cm_flag, <o:p></o:p></p>
<p class=MsoNormal>-
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->p_endpt->mac.addr[0], p_desc->p_endpt->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->p_endpt->mac.addr[2], p_desc->p_endpt->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] ));<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+ (" ARP %s
SEND to ENDPT[%p] State: %d flag: %#x, QPN: %#x MAC
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>
<p class=MsoNormal>+
( p_ib_arp->op == ARP_OP_REP ? "REP":
"REQ"),
p_desc->p_endpt, <o:p></o:p></p>
<p class=MsoNormal>+
endpt_cm_get_state( p_desc->p_endpt ),<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->p_endpt->cm_flag, <o:p></o:p></p>
<p class=MsoNormal>+
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->p_endpt->mac.addr[0], p_desc->p_endpt->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->p_endpt->mac.addr[2], p_desc->p_endpt->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] ));<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_ib_arp->dst_ip = p_arp->dst_ip;<o:p></o:p></p>
<p class=MsoNormal>+ p_ib_arp->dst_ip = p_arp->dst_ip;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( p_ib_arp );<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[1].length = sizeof(ipoib_arp_pkt_t);<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[1].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.num_ds = 2;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.p_next = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].local_ds[1].vaddr
= cl_get_physaddr( p_ib_arp );<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].local_ds[1].length
= sizeof(ipoib_arp_pkt_t);<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].local_ds[1].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.num_ds = 2;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.p_next = NULL;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_queue(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
eth_hdr_t* const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
ipoib_endpt_t**
const
pp_endpt )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
OUT ipoib_endpt_t**
const pp_endpt )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_STATUS status;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( GetEndpt );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( GetEndpt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Check the send queue and pend the request if not empty. */<o:p></o:p></p>
<p class=MsoNormal>-
//No need in spinlock, this function is already under lock <o:p></o:p></p>
<p class=MsoNormal>-
if( cl_qlist_count( &p_port->send_mgr.pending_list ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("Pending list not empty.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Check the send queue and pend the
request if not empty. */<o:p></o:p></p>
<p class=MsoNormal>+ //No need in spinlock, this function is
already under lock <o:p></o:p></p>
<p class=MsoNormal>+ if( cl_qlist_count(
&p_port->send_mgr.pending_list ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+
("Pending list not empty.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Check the send queue and pend the request if not empty. */<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("No available WQEs.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
cl_dbg_out("HW is full\n");<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Check the send queue and pend the
request if not empty. */<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->send_mgr.depth ==
p_port->p_adapter->params.sq_depth )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+
("No available WQEs.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
cl_dbg_out("HW is full\n");<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( GetEndpt );<o:p></o:p></p>
<p class=MsoNormal>-
status = __endpt_mgr_ref( p_port, p_eth_hdr->dst, pp_endpt );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref
called for %p\n", *pp_endpt));<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( GetEndpt );<o:p></o:p></p>
<p class=MsoNormal>+ status = __endpt_mgr_ref( p_port,
p_eth_hdr->dst, pp_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n", *pp_endpt));<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetEndpt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION &&<o:p></o:p></p>
<p class=MsoNormal>-
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("Calling join
mcast from send_mgr_queue\n"));<o:p></o:p></p>
<p class=MsoNormal>-
if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst, <o:p></o:p></p>
<p class=MsoNormal>-
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("Multicast Mac - trying to join.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else if ( status == NDIS_STATUS_SUCCESS && <o:p></o:p></p>
<p class=MsoNormal>-
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) && <o:p></o:p></p>
<p class=MsoNormal>-
!ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( (*pp_endpt) );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT((*pp_endpt)->h_mcast != NULL);<o:p></o:p></p>
<p class=MsoNormal>-
(*pp_endpt)->is_in_use = TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( status ==
NDIS_STATUS_NO_ROUTE_TO_DESTINATION &&<o:p></o:p></p>
<p class=MsoNormal>+
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("Calling join
mcast from send_mgr_queue\n"));<o:p></o:p></p>
<p class=MsoNormal>+ if(
ipoib_port_join_mcast( p_port, p_eth_hdr->dst, <o:p></o:p></p>
<p class=MsoNormal>+
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+
("Multicast Mac - trying to join.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else if ( status == NDIS_STATUS_SUCCESS
&& <o:p></o:p></p>
<p class=MsoNormal>+
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) && <o:p></o:p></p>
<p class=MsoNormal>+
!ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
(*pp_endpt) );<o:p></o:p></p>
<p class=MsoNormal>+
CL_ASSERT((*pp_endpt)->h_mcast != NULL);<o:p></o:p></p>
<p class=MsoNormal>+
(*pp_endpt)->is_in_use = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __build_send_desc(<o:p></o:p></p>
<p class=MsoNormal>-
IN
eth_hdr_t* const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>-
IN
MDL*
const
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
size_t
mdl_len,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_send_NB_SG
*s_buf)<o:p></o:p></p>
<p class=MsoNormal>+
IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>+
IN
MDL*
const
p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
size_t
mdl_len,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_send_NB_SG
*s_buf)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>-
int32_t
hdr_idx;<o:p></o:p></p>
<p class=MsoNormal>-
ULONG
mss = 0;<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_STATUS status;<o:p></o:p></p>
<p class=MsoNormal>+
int32_t
hdr_idx;<o:p></o:p></p>
<p class=MsoNormal>+
ULONG
mss = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO
p_checksum_list_info = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( SendMgrFilter );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+
PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO
p_checksum_list_info = NULL;<o:p></o:p></p>
<p class=MsoNormal>+
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info =
NULL;<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( SendMgrFilter );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
/* Store context in our reserved area of the packet. */<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ /* Store context in our reserved area of
the packet. */<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(s_buf == (ipoib_send_NB_SG *) IPOIB_INFO_FROM_NB(s_buf->p_curr_nb));<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_endpt = p_desc->p_endpt;<o:p></o:p></p>
<p class=MsoNormal>-
//TODO IMPORTANT: Send buffer should not be allocated within global struct !!!<o:p></o:p></p>
<p class=MsoNormal>-
// Otherwise, the next send may override its content<o:p></o:p></p>
<p class=MsoNormal>-
//s_buf->p_send_buf= p_desc->p_buf;<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(s_buf == (ipoib_send_NB_SG *)
IPOIB_INFO_FROM_NB(s_buf->p_curr_nb));<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_endpt = p_desc->p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ //TODO IMPORTANT: Send buffer should not
be allocated within global struct !!!<o:p></o:p></p>
<p class=MsoNormal>+ // Otherwise, the next send may override
its content<o:p></o:p></p>
<p class=MsoNormal>+ //s_buf->p_send_buf=
p_desc->p_buf;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Format the send descriptor. */<o:p></o:p></p>
<p class=MsoNormal>-
PVOID* ppTemp
= &NET_BUFFER_LIST_INFO(s_buf->p_nbl, TcpIpChecksumNetBufferListInfo);<o:p></o:p></p>
<p class=MsoNormal>+ /* Format the send descriptor. */<o:p></o:p></p>
<p class=MsoNormal>+ PVOID*
ppTemp =
&NET_BUFFER_LIST_INFO(s_buf->p_nbl, TcpIpChecksumNetBufferListInfo);<o:p></o:p></p>
<p class=MsoNormal> p_checksum_list_info = <o:p></o:p></p>
<p class=MsoNormal>
(PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO) ((PULONG)ppTemp); <o:p></o:p></p>
<p class=MsoNormal>-
// Calculate LSO<o:p></o:p></p>
<p class=MsoNormal>-
if( s_buf->p_port->p_adapter->params.lso ) {<o:p></o:p></p>
<p class=MsoNormal>+ // Calculate LSO<o:p></o:p></p>
<p class=MsoNormal>+ if(
s_buf->p_port->p_adapter->params.lso ) {<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_lso_info =<o:p></o:p></p>
<p class=MsoNormal>-
(PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO) (PULONG)
&NET_BUFFER_LIST_INFO(s_buf->p_nbl, TcpLargeSendNetBufferListInfo);<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(p_lso_info);<o:p></o:p></p>
<p class=MsoNormal>-
ULONG LsoType =
p_lso_info->Transmit.Type;<o:p></o:p></p>
<p class=MsoNormal>+ p_lso_info =<o:p></o:p></p>
<p class=MsoNormal>+
(PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO) (PULONG)
&NET_BUFFER_LIST_INFO(s_buf->p_nbl, TcpLargeSendNetBufferListInfo);<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(p_lso_info);<o:p></o:p></p>
<p class=MsoNormal>+ ULONG LsoType =
p_lso_info->Transmit.Type;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
mss = p_lso_info->LsoV1Transmit.MSS;<o:p></o:p></p>
<p class=MsoNormal>-
ULONG PacketLength = NET_BUFFER_DATA_LENGTH(s_buf->p_curr_nb);<o:p></o:p></p>
<p class=MsoNormal>-
if (PacketLength < mss) {<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if(LsoType == NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE) {<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(p_lso_info->LsoV2Transmit.Type ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE);<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(mss ==
p_lso_info->LsoV2Transmit.MSS);<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(p_lso_info->LsoV1Transmit.TcpHeaderOffset ==
p_lso_info->LsoV2Transmit.TcpHeaderOffset);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
/* Format the send descriptor. */<o:p></o:p></p>
<p class=MsoNormal>-
hdr_idx = cl_atomic_inc( &s_buf->p_port->hdr_idx );<o:p></o:p></p>
<p class=MsoNormal>-
hdr_idx &= (s_buf->p_port->p_adapter->params.sq_depth - 1);<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT( hdr_idx < s_buf->p_port->p_adapter->params.sq_depth );<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_port->hdr[hdr_idx].type = p_eth_hdr->type;<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_port->hdr[hdr_idx].resv = 0;<o:p></o:p></p>
<p class=MsoNormal>+ mss =
p_lso_info->LsoV1Transmit.MSS;<o:p></o:p></p>
<p class=MsoNormal>+ ULONG
PacketLength = NET_BUFFER_DATA_LENGTH(s_buf->p_curr_nb);<o:p></o:p></p>
<p class=MsoNormal>+ if
(PacketLength < mss) {<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ if(LsoType ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE) {<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(p_lso_info->LsoV2Transmit.Type ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE);<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(mss == p_lso_info->LsoV2Transmit.MSS);<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(p_lso_info->LsoV1Transmit.TcpHeaderOffset ==
p_lso_info->LsoV2Transmit.TcpHeaderOffset);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+ /* Format the send descriptor. */<o:p></o:p></p>
<p class=MsoNormal>+ hdr_idx = cl_atomic_inc(
&s_buf->p_port->hdr_idx );<o:p></o:p></p>
<p class=MsoNormal>+ hdr_idx &=
(s_buf->p_port->p_adapter->params.sq_depth - 1);<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT( hdr_idx <
s_buf->p_port->p_adapter->params.sq_depth );<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_port->hdr[hdr_idx].type =
p_eth_hdr->type;<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_port->hdr[hdr_idx].resv =
0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
//TODO why we enter this block for LSO ???<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[0].vaddr = cl_get_physaddr(
&s_buf->p_port->hdr[hdr_idx] );<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[0].length = sizeof(ipoib_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].local_ds[0].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.send_opt = 0;<o:p></o:p></p>
<p class=MsoNormal>-
//Init send buffer to 0<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_send_buf = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ //TODO why we enter this block for LSO
???<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].local_ds[0].vaddr
= cl_get_physaddr( &s_buf->p_port->hdr[hdr_idx] );<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].local_ds[0].length
= sizeof(ipoib_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].local_ds[0].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.send_opt = 0;<o:p></o:p></p>
<p class=MsoNormal>+ //Init send buffer to 0<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_send_buf = NULL;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if (mss && (p_lso_info->LsoV1Transmit.TcpHeaderOffset != 0)) { //We
have LSO packet<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT( mss == (p_lso_info->LsoV1Transmit.MSS & p_lso_info->LsoV2Transmit.MSS));<o:p></o:p></p>
<p class=MsoNormal>-
//ASSERT ( (mss & (1<<20)) == mss);<o:p></o:p></p>
<p class=MsoNormal>-
status = __build_lso_desc( s_buf->p_port, mss, hdr_idx, p_lso_info,
s_buf->p_curr_nb);<o:p></o:p></p>
<p class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__build_lso_desc returned 0x%08X.\n", status) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
i;<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( SendMgrFilter );<o:p></o:p></p>
<p class=MsoNormal>-
status = __send_mgr_filter( p_eth_hdr, p_mdl, mdl_len, s_buf );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, SendMgrFilter );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__send_mgr_filter returned 0x%08X.\n", status) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if (mss &&
(p_lso_info->LsoV1Transmit.TcpHeaderOffset != 0)) { //We have LSO packet<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ ASSERT( mss ==
(p_lso_info->LsoV1Transmit.MSS & p_lso_info->LsoV2Transmit.MSS));<o:p></o:p></p>
<p class=MsoNormal>+ //ASSERT ( (mss
& (1<<20)) == mss);<o:p></o:p></p>
<p class=MsoNormal>+ status =
__build_lso_desc( s_buf->p_port, mss, hdr_idx, p_lso_info,
s_buf->p_curr_nb);<o:p></o:p></p>
<p class=MsoNormal>+ if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__build_lso_desc returned 0x%08X.\n", status) );<o:p></o:p></p>
<p class=MsoNormal>+
return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
uint32_t i;<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
SendMgrFilter );<o:p></o:p></p>
<p class=MsoNormal>+ status =
__send_mgr_filter( p_eth_hdr, p_mdl, mdl_len, s_buf );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, SendMgrFilter );<o:p></o:p></p>
<p class=MsoNormal>+ if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__send_mgr_filter returned 0x%08X.\n", status) );<o:p></o:p></p>
<p class=MsoNormal>+
return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_desc->send_dir == SEND_UD_QP )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_qp = s_buf->p_port->ib_mgr.h_qp; // UD QP<o:p></o:p></p>
<p class=MsoNormal>-
for( i = 0; i < p_desc->num_wrs; i++ )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[i].wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[i].wr.dgrm.ud.remote_qkey =
s_buf->p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[i].wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[i].wr.dgrm.ud.pkey_index = s_buf->p_port->pkey_index;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[i].wr.dgrm.ud.rsvd = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[i].wr.send_opt = 0;<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_desc->send_dir == SEND_UD_QP )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_qp = s_buf->p_port->ib_mgr.h_qp; // UD QP<o:p></o:p></p>
<p class=MsoNormal>+
for( i = 0; i < p_desc->num_wrs; i++ )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[i].wr.dgrm.ud.remote_qp
= p_desc->p_endpt->qpn;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[i].wr.dgrm.ud.remote_qkey =
s_buf->p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[i].wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[i].wr.dgrm.ud.pkey_index
= s_buf->p_port->pkey_index;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[i].wr.dgrm.ud.rsvd = NULL;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[i].wr.send_opt = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( s_buf->p_port->p_adapter->params.send_chksum_offload
&&<o:p></o:p></p>
<p class=MsoNormal>-
p_checksum_list_info
&&<o:p></o:p></p>
<p class=MsoNormal>-
( p_checksum_list_info->Transmit.IsIPv4 || <o:p></o:p></p>
<p class=MsoNormal>-
p_checksum_list_info->Transmit.IsIPv6 ))<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
// Set transimition checksum offloading<o:p></o:p></p>
<p class=MsoNormal>-
if( p_checksum_list_info->Transmit.IpHeaderChecksum )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_IP_CSUM;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if( p_checksum_list_info->Transmit.TcpChecksum ||
p_checksum_list_info->Transmit.UdpChecksum)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_TCP_UDP_CSUM;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else // RC QP<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_desc->send_dir == SEND_RC_QP );<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_qp = p_desc->p_endpt->conn.h_work_qp;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
for( i = 0; i < p_desc->num_wrs; i++ )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[i].wr.wr_type = WR_SEND;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[i].wr.wr_id = 0;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[i].wr.ds_array = &p_desc->send_wr[i].local_ds[0];<o:p></o:p></p>
<p class=MsoNormal>-
if( i )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[i-1].wr.p_next = &p_desc->send_wr[i].wr;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[p_desc->num_wrs - 1].wr.wr_id = (uintn_t)s_buf ;<o:p></o:p></p>
<p class=MsoNormal>+
if(
s_buf->p_port->p_adapter->params.send_chksum_offload
&&<o:p></o:p></p>
<p class=MsoNormal>+
p_checksum_list_info
&&<o:p></o:p></p>
<p class=MsoNormal>+
( p_checksum_list_info->Transmit.IsIPv4 || <o:p></o:p></p>
<p class=MsoNormal>+
p_checksum_list_info->Transmit.IsIPv6 ))<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
// Set transimition checksum offloading<o:p></o:p></p>
<p class=MsoNormal>+
if( p_checksum_list_info->Transmit.IpHeaderChecksum )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_IP_CSUM;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
if( p_checksum_list_info->Transmit.TcpChecksum || p_checksum_list_info->Transmit.UdpChecksum)<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_TCP_UDP_CSUM;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else // RC QP<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
CL_ASSERT( p_desc->send_dir == SEND_RC_QP );<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_qp = p_desc->p_endpt->conn.h_work_qp;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ for( i = 0; i
< p_desc->num_wrs; i++ )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[i].wr.wr_type = WR_SEND;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[i].wr.wr_id = 0;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[i].wr.ds_array = &p_desc->send_wr[i].local_ds[0];<o:p></o:p></p>
<p class=MsoNormal>+
if( i )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[i-1].wr.p_next = &p_desc->send_wr[i].wr;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[p_desc->num_wrs - 1].wr.wr_id = (uintn_t)s_buf ;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[p_desc->num_wrs - 1].wr.send_opt |= IB_SEND_OPT_SIGNALED;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[p_desc->num_wrs - 1].wr.p_next = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[p_desc->num_wrs - 1].wr.send_opt |= IB_SEND_OPT_SIGNALED;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[p_desc->num_wrs - 1].wr.p_next = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __build_lso_desc(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ULONG
mss,<o:p></o:p></p>
<p class=MsoNormal>-
IN
int32_t
hdr_idx, <o:p></o:p></p>
<p class=MsoNormal>-
IN PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info,<o:p></o:p></p>
<p class=MsoNormal>-
IN
NET_BUFFER
*p_netbuf)<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t*
const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ULONG
mss,<o:p></o:p></p>
<p class=MsoNormal>+
IN
int32_t
hdr_idx, <o:p></o:p></p>
<p class=MsoNormal>+ IN
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info,<o:p></o:p></p>
<p class=MsoNormal>+
IN
NET_BUFFER
*p_netbuf)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>-
LsoData
TheLsoData;<o:p></o:p></p>
<p class=MsoNormal>-
UINT
IndexOfData = 0;<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_STATUS status;<o:p></o:p></p>
<p class=MsoNormal>+
LsoData
TheLsoData;<o:p></o:p></p>
<p class=MsoNormal>+
UINT
IndexOfData
= 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_NB_SG * s_buf = IPOIB_INFO_FROM_NB(p_netbuf);<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_desc_t *p_desc = p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_NB_SG * s_buf =
IPOIB_INFO_FROM_NB(p_netbuf);<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_desc_t *p_desc =
p_port->p_desc;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
//TODO What if first NB was inserted to pending list ????<o:p></o:p></p>
<p class=MsoNormal>-
PNET_BUFFER FirstBuffer = NET_BUFFER_LIST_FIRST_NB
(s_buf->p_nbl);<o:p></o:p></p>
<p class=MsoNormal>-
ULONG
PacketLength = NET_BUFFER_DATA_LENGTH(FirstBuffer);<o:p></o:p></p>
<p class=MsoNormal>+ //TODO What if first NB was inserted to
pending list ????<o:p></o:p></p>
<p class=MsoNormal>+ PNET_BUFFER
FirstBuffer = NET_BUFFER_LIST_FIRST_NB (s_buf->p_nbl);<o:p></o:p></p>
<p class=MsoNormal>+
ULONG PacketLength
= NET_BUFFER_DATA_LENGTH(FirstBuffer);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
memset(&TheLsoData, 0, sizeof TheLsoData );<o:p></o:p></p>
<p class=MsoNormal>-
status = GetLsoHeaderSize(<o:p></o:p></p>
<p class=MsoNormal>-
FirstBuffer, <o:p></o:p></p>
<p class=MsoNormal>-
&TheLsoData, <o:p></o:p></p>
<p class=MsoNormal>-
&IndexOfData,<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->hdr[hdr_idx] );<o:p></o:p></p>
<p class=MsoNormal>+ memset(&TheLsoData, 0, sizeof
TheLsoData );<o:p></o:p></p>
<p class=MsoNormal>+ status = GetLsoHeaderSize(<o:p></o:p></p>
<p class=MsoNormal>+ FirstBuffer, <o:p></o:p></p>
<p class=MsoNormal>+ &TheLsoData,
<o:p></o:p></p>
<p class=MsoNormal>+
&IndexOfData,<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->hdr[hdr_idx] );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if ((status != NDIS_STATUS_SUCCESS ) || <o:p></o:p></p>
<p class=MsoNormal>-
(TheLsoData.FullBuffers != TheLsoData.UsedBuffers)) <o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>+ if ((status != NDIS_STATUS_SUCCESS ) || <o:p></o:p></p>
<p class=MsoNormal>+
(TheLsoData.FullBuffers != TheLsoData.UsedBuffers)) <o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("<-- Throwing this packet\n"));<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("<-- Throwing this
packet\n"));<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( status == NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
status = NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(TheLsoData.LsoHeaderSize > 0);<o:p></o:p></p>
<p class=MsoNormal>-
// Tell NDIS how much we will send.<o:p></o:p></p>
<p class=MsoNormal>-
//PktExt->NdisPacketInfo[TcpLargeSendPacketInfo] = UlongToPtr(PacketLength);<o:p></o:p></p>
<p class=MsoNormal>-
//p_lso_info->LsoV1TransmitComplete.TcpPayload = PacketLength;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
// Tell NDIS how much we will send.<o:p></o:p></p>
<p class=MsoNormal>-
if(p_lso_info->LsoV1Transmit.Type == NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE)<o:p></o:p></p>
<p class=MsoNormal>+ if( status ==
NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
status = NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(TheLsoData.LsoHeaderSize > 0);<o:p></o:p></p>
<p class=MsoNormal>+ // Tell NDIS how much we will send.<o:p></o:p></p>
<p class=MsoNormal>+
//PktExt->NdisPacketInfo[TcpLargeSendPacketInfo] = UlongToPtr(PacketLength);<o:p></o:p></p>
<p class=MsoNormal>+ //p_lso_info->LsoV1TransmitComplete.TcpPayload
= PacketLength;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ // Tell NDIS how much we will send.<o:p></o:p></p>
<p class=MsoNormal>+ if(p_lso_info->LsoV1Transmit.Type ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
//IPOIB_TCP_PAYLOAD_FROM_NB(p_netbuf) += PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->tcp_payload = PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
//IPOIB_TCP_PAYLOAD_FROM_NB(p_netbuf) += PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></p>
<p class=MsoNormal>+
s_buf->tcp_payload = PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.mss = mss;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.header = TheLsoData.LsoBuffers[0].pData;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.hlen = TheLsoData.LsoHeaderSize
;//lso_header_size; <o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.remote_qkey =
p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.pkey_index = p_port->pkey_index;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.rsvd = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.dgrm.ud.mss =
mss;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.dgrm.ud.header
= TheLsoData.LsoBuffers[0].pData;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.dgrm.ud.hlen =
TheLsoData.LsoHeaderSize ;//lso_header_size; <o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].wr.dgrm.ud.remote_qkey =
p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.dgrm.ud.h_av =
p_desc->p_endpt->h_av;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[0].wr.dgrm.ud.pkey_index = p_port->pkey_index;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.dgrm.ud.rsvd =
NULL;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.wr_id = (uintn_t)s_buf;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.ds_array = p_desc->send_wr[0].local_ds;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.wr_type = WR_LSO;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.send_opt = <o:p></o:p></p>
<p class=MsoNormal>-
(IB_SEND_OPT_TX_IP_CSUM | IB_SEND_OPT_TX_TCP_UDP_CSUM) | IB_SEND_OPT_SIGNALED;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[0].wr.p_next = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_qp = p_port->ib_mgr.h_qp;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>-
status = __send_gen( s_buf, IndexOfData, TheLsoData.LsoHeaderSize );<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.wr_id =
(uintn_t)s_buf;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.ds_array =
p_desc->send_wr[0].local_ds;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.wr_type =
WR_LSO;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.send_opt = <o:p></o:p></p>
<p class=MsoNormal>+
(IB_SEND_OPT_TX_IP_CSUM | IB_SEND_OPT_TX_TCP_UDP_CSUM) | IB_SEND_OPT_SIGNALED;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_wr[0].wr.p_next = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_qp =
p_port->ib_mgr.h_qp;<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal>+ status = __send_gen( s_buf, IndexOfData,
TheLsoData.LsoHeaderSize );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>@@ -5182,7 +5229,7 @@<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> ULONG i = 0;<o:p></o:p></p>
<p class=MsoNormal>-
int j=0;<o:p></o:p></p>
<p class=MsoNormal>+ int j=0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> UINT buf_len =
NET_BUFFER_DATA_LENGTH(NetBuff);<o:p></o:p></p>
<p class=MsoNormal> PMDL pMdl =
NET_BUFFER_CURRENT_MDL(NetBuff);<o:p></o:p></p>
<p class=MsoNormal>@@ -5195,7 +5242,7 @@<o:p></o:p></p>
<p class=MsoNormal> #ifdef DBG<o:p></o:p></p>
<p class=MsoNormal> ASSERT(PhysBufCount <=
MAX_PHYS_BUF_FRAG_ELEMENTS);<o:p></o:p></p>
<p class=MsoNormal> #else<o:p></o:p></p>
<p class=MsoNormal>-
UNREFERENCED_PARAMETER(PhysBufCount);<o:p></o:p></p>
<p class=MsoNormal>+ UNREFERENCED_PARAMETER(PhysBufCount);<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> ASSERT(buf_len > 0);<o:p></o:p></p>
<p class=MsoNormal>@@ -5221,7 +5268,7 @@<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> ASSERT(
(buf_len > 0) && (MdlBytesCount > 0) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND, ("CreateFragList:
pMdl=%p, MdlBytesCount=x%x, MdlBufCount=0x%x\n", pMdl, MdlBytesCount,
MdlBufCount));<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND, ("CreateFragList: pMdl=%p,
MdlBytesCount=x%x, MdlBufCount=0x%x\n", pMdl, MdlBytesCount,
MdlBufCount));<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> if
(MdlBytesCount > 0)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>@@ -5274,7 +5321,7 @@<o:p></o:p></p>
<p class=MsoNormal>
{<o:p></o:p></p>
<p class=MsoNormal>
<o:p></o:p></p>
<p class=MsoNormal>
ULONG size = min(PAGE_SIZE, MdlBytesCount);<o:p></o:p></p>
<p class=MsoNormal>-
i -= 1;<o:p></o:p></p>
<p class=MsoNormal>+
i -= 1;<o:p></o:p></p>
<p class=MsoNormal>
pFragList->Elements[i].Length += size;<o:p></o:p></p>
<p class=MsoNormal>
MdlBytesCount -= size;<o:p></o:p></p>
<p class=MsoNormal>
}<o:p></o:p></p>
<p class=MsoNormal>@@ -5331,517 +5378,517 @@<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> void<o:p></o:p></p>
<p class=MsoNormal> ipoib_port_send(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal> IN
NET_BUFFER_LIST *p_net_buffer_list,<o:p></o:p></p>
<p class=MsoNormal> IN
ULONG
send_flags)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>-
PNET_BUFFER
p_netbuf, p_next_netbuf = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
UINT
buf_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>-
ULONG
send_complete_flags = 0;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
KIRQL
old_irql;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( GetEthHdr );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( BuildSendDesc );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( QueuePacket );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( SendMgrQueue );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( PostSend );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_STATUS status;<o:p></o:p></p>
<p class=MsoNormal>+
PNET_BUFFER p_netbuf,
p_next_netbuf = NULL;<o:p></o:p></p>
<p class=MsoNormal>+
UINT
buf_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>+
ULONG
send_complete_flags = 0;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ KIRQL
old_irql;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( GetEthHdr );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( BuildSendDesc );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( QueuePacket );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( SendMgrQueue );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( PostSend );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if (NDIS_TEST_SEND_AT_DISPATCH_LEVEL(send_flags))<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
//TODO Tzachid: make an assert here to validate your IRQL<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT (KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>
<p class=MsoNormal>-
old_irql = DISPATCH_LEVEL;<o:p></o:p></p>
<p class=MsoNormal>-
} else {<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_RAISE_IRQL_TO_DISPATCH(&old_irql);<o:p></o:p></p>
<p class=MsoNormal>-
//ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL); // Happens<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("QP state isnt RTS, exiting from port_send\n"));<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
NdisMSendNetBufferListsCompleteX(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
p_net_buffer_list,<o:p></o:p></p>
<p class=MsoNormal>-
send_complete_flags); <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if
(NDIS_TEST_SEND_AT_DISPATCH_LEVEL(send_flags))<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ //TODO Tzachid:
make an assert here to validate your IRQL<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT
(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>
<p class=MsoNormal>+ old_irql =
DISPATCH_LEVEL;<o:p></o:p></p>
<p class=MsoNormal>+ } else {<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_RAISE_IRQL_TO_DISPATCH(&old_irql);<o:p></o:p></p>
<p class=MsoNormal>+ //ASSERT
(KeGetCurrentIrql() == PASSIVE_LEVEL); // Happens<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+
("QP state isnt RTS, exiting from port_send\n"));<o:p></o:p></p>
<p class=MsoNormal>+ NET_BUFFER_LIST_STATUS(p_net_buffer_list)
= NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
NdisMSendNetBufferListsCompleteX(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
p_net_buffer_list,<o:p></o:p></p>
<p class=MsoNormal>+
send_complete_flags); <o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>-
// You are already here at dispatch<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_acquire( &p_port->send_lock
);<o:p></o:p></p>
<p class=MsoNormal>+ // You are already here at dispatch<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
// We need to init the status here<o:p></o:p></p>
<p class=MsoNormal>-
// When completing the send, we will set the status NDIS_STATUS_FAILURE if AT
LEAST<o:p></o:p></p>
<p class=MsoNormal>-
// one of NBs will fail.<o:p></o:p></p>
<p class=MsoNormal>-
// That is, status can't be updated back to SUCCESS if it previosly was set to
FAILURE<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ // We need to init the status here<o:p></o:p></p>
<p class=MsoNormal>+ // When completing the send, we will set
the status NDIS_STATUS_FAILURE if AT LEAST<o:p></o:p></p>
<p class=MsoNormal>+ // one of NBs will fail.<o:p></o:p></p>
<p class=MsoNormal>+ // That is, status can't be updated back
to SUCCESS if it previosly was set to FAILURE<o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
for (p_netbuf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></p>
<p class=MsoNormal>-
p_netbuf != NULL; <o:p></o:p></p>
<p class=MsoNormal>-
p_netbuf = NET_BUFFER_NEXT_NB(p_netbuf))<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
++g_ipoib_send_SW;<o:p></o:p></p>
<p class=MsoNormal>-
++buf_cnt;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ for (p_netbuf =
NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></p>
<p class=MsoNormal>+ p_netbuf
!= NULL; <o:p></o:p></p>
<p class=MsoNormal>+ p_netbuf =
NET_BUFFER_NEXT_NB(p_netbuf))<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
++g_ipoib_send_SW;<o:p></o:p></p>
<p class=MsoNormal>+ ++buf_cnt;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("Processing netbuffer list: %p buf_cnt = %d\n", p_net_buffer_list,
buf_cnt));<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+
("Processing netbuffer list: %p buf_cnt = %d\n", p_net_buffer_list,
buf_cnt));<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(buf_cnt);<o:p></o:p></p>
<p class=MsoNormal>-
// Raise reference count of the NBL to the number of its NBs<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(p_net_buffer_list) =
(PVOID)(ULONG_PTR)buf_cnt;<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(buf_cnt);<o:p></o:p></p>
<p class=MsoNormal>+ // Raise reference count of the NBL to
the number of its NBs<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(p_net_buffer_list) =
(PVOID)(ULONG_PTR)buf_cnt;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
for (p_netbuf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></p>
<p class=MsoNormal>-
p_netbuf != NULL; <o:p></o:p></p>
<p class=MsoNormal>-
p_netbuf = p_next_netbuf)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_next_netbuf = NET_BUFFER_NEXT_NB(p_netbuf);<o:p></o:p></p>
<p class=MsoNormal>+ for (p_netbuf =
NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></p>
<p class=MsoNormal>+ p_netbuf
!= NULL; <o:p></o:p></p>
<p class=MsoNormal>+ p_netbuf =
p_next_netbuf)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_next_netbuf =
NET_BUFFER_NEXT_NB(p_netbuf);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_NB_SG * s_buf = (ipoib_send_NB_SG*) (PVOID)
(cl_qpool_get(&p_port->send_mgr.send_pool));<o:p></o:p></p>
<p class=MsoNormal>-
if (s_buf == NULL) {<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>-
NdisMSendNetBufferListsCompleteX(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
p_net_buffer_list,<o:p></o:p></p>
<p class=MsoNormal>-
send_complete_flags);
<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_NB_SG
* s_buf = (ipoib_send_NB_SG*) (PVOID)
(cl_qpool_get(&p_port->send_mgr.send_pool));<o:p></o:p></p>
<p class=MsoNormal>+ if (s_buf ==
NULL) {<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>+
NdisMSendNetBufferListsCompleteX(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
p_net_buffer_list,<o:p></o:p></p>
<p class=MsoNormal>+
send_complete_flags); <o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
//Set all the data needed for process_sg_list<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_port = p_port;<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_sgl = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_endpt = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_nbl = p_net_buffer_list;<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_curr_nb = p_netbuf;<o:p></o:p></p>
<p class=MsoNormal>-
//TODO remove this line from process_sg_real<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_send_buf = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>+ //Set all the
data needed for process_sg_list<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_port
= p_port;<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_sgl
= NULL;<o:p></o:p></p>
<p class=MsoNormal>+
s_buf->p_endpt = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_nbl
= p_net_buffer_list;<o:p></o:p></p>
<p class=MsoNormal>+
s_buf->p_curr_nb = p_netbuf;<o:p></o:p></p>
<p class=MsoNormal>+ //TODO remove
this line from process_sg_real<o:p></o:p></p>
<p class=MsoNormal>+
s_buf->p_send_buf = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
//We can also define p_sg_buf as a static member of send_buf,<o:p></o:p></p>
<p class=MsoNormal>-
// But the problem is that we don't know it's size<o:p></o:p></p>
<p class=MsoNormal>-
if (s_buf->p_sg_buf == NULL) {<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_sg_buf = (PVOID) cl_qpool_get(&p_port->send_mgr.sg_pool);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_INFO_FROM_NB(p_netbuf) = s_buf;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("Netbuf to send = %p\n", p_netbuf) );<o:p></o:p></p>
<p class=MsoNormal>+ //We can also
define p_sg_buf as a static member of send_buf,<o:p></o:p></p>
<p class=MsoNormal>+ // But the
problem is that we don't know it's size<o:p></o:p></p>
<p class=MsoNormal>+ if
(s_buf->p_sg_buf == NULL) {<o:p></o:p></p>
<p class=MsoNormal>+
s_buf->p_sg_buf = (PVOID) cl_qpool_get(&p_port->send_mgr.sg_pool);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_INFO_FROM_NB(p_netbuf) = s_buf;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+
("Netbuf to send = %p\n", p_netbuf) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal>-
CHAR *pTemp = (CHAR *) ExAllocatePoolWithTag(NonPagedPool ,
p_port->p_adapter->sg_list_size, 'abcd');<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT(pTemp != NULL);<o:p></o:p></p>
<p class=MsoNormal>-
p_sgl = pTemp;<o:p></o:p></p>
<p class=MsoNormal>-
CreateFragList(NdisQueryNetBufferPhysicalCount(p_netbuf), p_netbuf,
NET_BUFFER_DATA_LENGTH(p_netbuf), (PMP_FRAG_LIST) p_sgl);<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_FROM_QUEUE(p_netbuf) = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
/*IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("[%d] Allocation from scratch: Netbuf = %x, found SGL = %x,
PhysBufCnt=%ld, NB LEN = %ld, sg_list_size=%ld\n",<o:p></o:p></p>
<p class=MsoNormal>-
buf_cnt, p_netbuf, p_sgl,NdisQueryNetBufferPhysicalCount(p_netbuf) ,<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_DATA_LENGTH(p_netbuf),p_port->p_adapter->sg_list_size) );<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_process_sg_list(NULL, NULL, (PSCATTER_GATHER_LIST)p_sgl, p_netbuf);<o:p></o:p></p>
<p class=MsoNormal>-
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>-#else
<o:p></o:p></p>
<p class=MsoNormal>+
CHAR *pTemp = (CHAR *) ExAllocatePoolWithTag(NonPagedPool ,
p_port->p_adapter->sg_list_size, 'abcd');<o:p></o:p></p>
<p class=MsoNormal>+
CL_ASSERT(pTemp != NULL);<o:p></o:p></p>
<p class=MsoNormal>+
p_sgl = pTemp;<o:p></o:p></p>
<p class=MsoNormal>+
CreateFragList(NdisQueryNetBufferPhysicalCount(p_netbuf), p_netbuf,
NET_BUFFER_DATA_LENGTH(p_netbuf), (PMP_FRAG_LIST) p_sgl);<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_FROM_QUEUE(p_netbuf) = NULL;<o:p></o:p></p>
<p class=MsoNormal>+
/*IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("[%d] Allocation from scratch: Netbuf = %x, found SGL = %x,
PhysBufCnt=%ld, NB LEN = %ld, sg_list_size=%ld\n",<o:p></o:p></p>
<p class=MsoNormal>+
buf_cnt, p_netbuf, p_sgl,NdisQueryNetBufferPhysicalCount(p_netbuf) ,<o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER_DATA_LENGTH(p_netbuf),p_port->p_adapter->sg_list_size) );<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_process_sg_list(NULL, NULL, (PSCATTER_GATHER_LIST)p_sgl, p_netbuf);<o:p></o:p></p>
<p class=MsoNormal>+
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+#else
<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>
<p class=MsoNormal>+
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
++g_ipoib_send_SW_in_loop;<o:p></o:p></p>
<p class=MsoNormal>+
++g_ipoib_send_SW_in_loop;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(s_buf->p_sg_buf);<o:p></o:p></p>
<p class=MsoNormal>-
status = NdisMAllocateNetBufferSGList(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></p>
<p class=MsoNormal>-
p_netbuf,<o:p></o:p></p>
<p class=MsoNormal>-
s_buf,<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_SG_LIST_WRITE_TO_DEVICE,<o:p></o:p></p>
<p class=MsoNormal>-
(PUCHAR )s_buf->p_sg_buf + sizeof(cl_pool_item_t),<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->sg_list_size);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock
);
<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(s_buf->p_sg_buf);<o:p></o:p></p>
<p class=MsoNormal>+
status = NdisMAllocateNetBufferSGList(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></p>
<p class=MsoNormal>+
p_netbuf,<o:p></o:p></p>
<p class=MsoNormal>+
s_buf,<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_SG_LIST_WRITE_TO_DEVICE,<o:p></o:p></p>
<p class=MsoNormal>+
(PUCHAR )s_buf->p_sg_buf + sizeof(cl_pool_item_t),<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->sg_list_size);<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+
cl_spinlock_acquire(
&p_port->send_lock ); <o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal>-//
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>+// }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>-
// TODOD: There is a bug here if we have succeeded in sending some and failed<o:p></o:p></p>
<p class=MsoNormal>-
// with the otheres.<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>+
// TODOD: There is a bug here if we have succeeded in sending some and failed<o:p></o:p></p>
<p class=MsoNormal>+
// with the otheres.<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
/* fail net buffer list */<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = status;<o:p></o:p></p>
<p class=MsoNormal>-
NdisMSendNetBufferListsCompleteX(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
p_net_buffer_list,<o:p></o:p></p>
<p class=MsoNormal>-
send_complete_flags);
<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_LOWER_IRQL(old_irql, DISPATCH_LEVEL);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+
/* fail net buffer list */<o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = status;<o:p></o:p></p>
<p class=MsoNormal>+
NdisMSendNetBufferListsCompleteX(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
p_net_buffer_list,<o:p></o:p></p>
<p class=MsoNormal>+
send_complete_flags); <o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+ NDIS_LOWER_IRQL(old_irql,
DISPATCH_LEVEL);<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline void <o:p></o:p></p>
<p class=MsoNormal> __send_complete_net_buffer(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_send_NB_SG *s_buf, <o:p></o:p></p>
<p class=MsoNormal>-
IN NDIS_STATUS
status,<o:p></o:p></p>
<p class=MsoNormal>-
IN ULONG
compl_flags,<o:p></o:p></p>
<p class=MsoNormal>-
IN
boolean_t
bLock ) <o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_send_NB_SG *s_buf, <o:p></o:p></p>
<p class=MsoNormal>+ IN
NDIS_STATUS status,<o:p></o:p></p>
<p class=MsoNormal>+ IN
ULONG
compl_flags,<o:p></o:p></p>
<p class=MsoNormal>+ IN
boolean_t
bLock ) <o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( s_buf );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("Processing send completion for NBL=0x%p .\n", s_buf->p_nbl
));<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
// Free SGL element allocated by NDIS<o:p></o:p></p>
<p class=MsoNormal>-
// We should do it before freeing the whole NBL<o:p></o:p></p>
<p class=MsoNormal>-
NdisMFreeNetBufferSGList(<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_sgl,<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_curr_nb);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
// No need to delete p_sg_buf at this state, we will destroy the whole list at
the end of the execution<o:p></o:p></p>
<p class=MsoNormal>-
//NET_BUFFER_LIST_NEXT_NBL(p_desc->p_netbuf_list) = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( s_buf );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(TRACE_LEVEL_VERBOSE,
IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+
("Processing send completion for NBL=0x%p .\n", s_buf->p_nbl
));<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ // Free SGL element allocated by NDIS<o:p></o:p></p>
<p class=MsoNormal>+ // We should do it before freeing the
whole NBL<o:p></o:p></p>
<p class=MsoNormal>+ NdisMFreeNetBufferSGList(<o:p></o:p></p>
<p class=MsoNormal>+
s_buf->p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></p>
<p class=MsoNormal>+
s_buf->p_sgl,<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_curr_nb);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ // No need to delete p_sg_buf at this
state, we will destroy the whole list at the end of the execution<o:p></o:p></p>
<p class=MsoNormal>+
//NET_BUFFER_LIST_NEXT_NBL(p_desc->p_netbuf_list) = NULL;<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal>-
if (NET_BUFFER_LIST_STATUS(s_buf->p_nbl) != NDIS_STATUS_FAILURE) {<o:p></o:p></p>
<p class=MsoNormal>-
//TODO what about other statuses ?????<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if (NET_BUFFER_LIST_STATUS(s_buf->p_nbl)
!= NDIS_STATUS_FAILURE) {<o:p></o:p></p>
<p class=MsoNormal>+ //TODO what
about other statuses ?????<o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></p>
<p class=MsoNormal>+ NET_BUFFER_LIST_STATUS(s_buf->p_nbl)
= status;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
switch (status) {<o:p></o:p></p>
<p class=MsoNormal>-
case NDIS_STATUS_SUCCESS:<o:p></o:p></p>
<p class=MsoNormal>-
++g_ipoib_send_ack;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
case NDIS_STATUS_RESET_IN_PROGRESS:<o:p></o:p></p>
<p class=MsoNormal>-
++g_ipoib_send_reset;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
case NDIS_STATUS_FAILURE:<o:p></o:p></p>
<p class=MsoNormal>-
++g_ipoib_send_SG_failed;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
case NDIS_STATUS_INVALID_LENGTH:<o:p></o:p></p>
<p class=MsoNormal>-
case NDIS_STATUS_PAUSED:<o:p></o:p></p>
<p class=MsoNormal>-
case NDIS_STATUS_SEND_ABORTED:<o:p></o:p></p>
<p class=MsoNormal>-
case NDIS_STATUS_RESOURCES:<o:p></o:p></p>
<p class=MsoNormal>-
default:<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></p>
<p class=MsoNormal>-
/* Complete the NBL */<o:p></o:p></p>
<p class=MsoNormal>-
if (IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl) == 0) {<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></p>
<p class=MsoNormal>-
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO pLsoInfo =
<o:p></o:p></p>
<p class=MsoNormal>-
(PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO)
(PULONG)&NET_BUFFER_LIST_INFO(s_buf->p_nbl,
TcpLargeSendNetBufferListInfo);<o:p></o:p></p>
<p class=MsoNormal>+ switch (status) {<o:p></o:p></p>
<p class=MsoNormal>+ case
NDIS_STATUS_SUCCESS:<o:p></o:p></p>
<p class=MsoNormal>+
++g_ipoib_send_ack;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ case
NDIS_STATUS_RESET_IN_PROGRESS:<o:p></o:p></p>
<p class=MsoNormal>+
++g_ipoib_send_reset;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ case
NDIS_STATUS_FAILURE:<o:p></o:p></p>
<p class=MsoNormal>+
++g_ipoib_send_SG_failed;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ case
NDIS_STATUS_INVALID_LENGTH:<o:p></o:p></p>
<p class=MsoNormal>+ case
NDIS_STATUS_PAUSED:<o:p></o:p></p>
<p class=MsoNormal>+ case
NDIS_STATUS_SEND_ABORTED:<o:p></o:p></p>
<p class=MsoNormal>+ case
NDIS_STATUS_RESOURCES:<o:p></o:p></p>
<p class=MsoNormal>+ default:<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></p>
<p class=MsoNormal>+ /* Complete the NBL */<o:p></o:p></p>
<p class=MsoNormal>+ if
(IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl) == 0) {<o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></p>
<p class=MsoNormal>+
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO pLsoInfo = <o:p></o:p></p>
<p class=MsoNormal>+
(PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO)
(PULONG)&NET_BUFFER_LIST_INFO(s_buf->p_nbl,
TcpLargeSendNetBufferListInfo);<o:p></o:p></p>
<p class=MsoNormal>
if(pLsoInfo->Transmit.Type == NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE)<o:p></o:p></p>
<p class=MsoNormal>-
{ <o:p></o:p></p>
<p class=MsoNormal>-
UINT TcpPayLoad = 0;<o:p></o:p></p>
<p class=MsoNormal>-
//TODO optimize this code during MSS/LSO building<o:p></o:p></p>
<p class=MsoNormal>-
for (PNET_BUFFER NetBuffer = NET_BUFFER_LIST_FIRST_NB(s_buf->p_nbl);<o:p></o:p></p>
<p class=MsoNormal>-
NetBuffer != NULL ; <o:p></o:p></p>
<p class=MsoNormal>-
NetBuffer = NET_BUFFER_NEXT_NB(NetBuffer))<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
TcpPayLoad += s_buf->tcp_payload;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
pLsoInfo->LsoV1TransmitComplete.TcpPayload =
TcpPayLoad; <o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else if (pLsoInfo->Transmit.Type ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
pLsoInfo->LsoV2TransmitComplete.Reserved = 0;<o:p></o:p></p>
<p class=MsoNormal>-
pLsoInfo->LsoV2TransmitComplete.Type = NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if (bLock) {<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &s_buf->p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>-
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_nbl, compl_flags );<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &s_buf->p_port->send_lock ); <o:p></o:p></p>
<p class=MsoNormal>-
} else {<o:p></o:p></p>
<p class=MsoNormal>-
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_nbl, compl_flags );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
} <o:p></o:p></p>
<p class=MsoNormal>+
{ <o:p></o:p></p>
<p class=MsoNormal>+
UINT TcpPayLoad = 0;<o:p></o:p></p>
<p class=MsoNormal>+
//TODO optimize
this code during MSS/LSO building<o:p></o:p></p>
<p class=MsoNormal>+
for (PNET_BUFFER NetBuffer = NET_BUFFER_LIST_FIRST_NB(s_buf->p_nbl);<o:p></o:p></p>
<p class=MsoNormal>+
NetBuffer != NULL ; <o:p></o:p></p>
<p class=MsoNormal>+
NetBuffer = NET_BUFFER_NEXT_NB(NetBuffer))<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
TcpPayLoad += s_buf->tcp_payload;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
pLsoInfo->LsoV1TransmitComplete.TcpPayload =
TcpPayLoad; <o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else if
(pLsoInfo->Transmit.Type == NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
pLsoInfo->LsoV2TransmitComplete.Reserved = 0;<o:p></o:p></p>
<p class=MsoNormal>+
pLsoInfo->LsoV2TransmitComplete.Type = NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if (bLock) {<o:p></o:p></p>
<p class=MsoNormal>+
cl_spinlock_release( &s_buf->p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
s_buf->p_nbl, compl_flags );<o:p></o:p></p>
<p class=MsoNormal>+
cl_spinlock_acquire( &s_buf->p_port->send_lock ); <o:p></o:p></p>
<p class=MsoNormal>+ } else {<o:p></o:p></p>
<p class=MsoNormal>+
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
s_buf->p_nbl, compl_flags );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ } <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( s_buf->p_send_buf )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( FreeSendBuf );<o:p></o:p></p>
<p class=MsoNormal>-
NdisFreeToNPagedLookasideList( &s_buf->p_port->buf_mgr.send_buf_list,<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_send_buf );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, FreeSendBuf );<o:p></o:p></p>
<p class=MsoNormal>-
}
<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
/* Dereference the enpoint used for the transfer. */<o:p></o:p></p>
<p class=MsoNormal>-
if( s_buf->p_endpt ) {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_deref( s_buf->p_endpt );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-#if 0 <o:p></o:p></p>
<p class=MsoNormal>-
if (status == NDIS_STATUS_SUCCESS) {<o:p></o:p></p>
<p class=MsoNormal>-
//++g_ipoib_send_SG_real;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_SUCCESS, 0 );<o:p></o:p></p>
<p class=MsoNormal>-
} else {<o:p></o:p></p>
<p class=MsoNormal>-
++g_ipoib_send_SG_failed;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+ if( s_buf->p_send_buf )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
FreeSendBuf );<o:p></o:p></p>
<p class=MsoNormal>+
NdisFreeToNPagedLookasideList( &s_buf->p_port->buf_mgr.send_buf_list,<o:p></o:p></p>
<p class=MsoNormal>+
s_buf->p_send_buf );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, FreeSendBuf );<o:p></o:p></p>
<p class=MsoNormal>+ } <o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ /* Dereference the enpoint used for the
transfer. */<o:p></o:p></p>
<p class=MsoNormal>+ if( s_buf->p_endpt ) {<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_endpt_deref( s_buf->p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+#if 0 <o:p></o:p></p>
<p class=MsoNormal>+ if (status == NDIS_STATUS_SUCCESS) {<o:p></o:p></p>
<p class=MsoNormal>+
//++g_ipoib_send_SG_real;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_inc_send_stat(
p_port->p_adapter, IP_STAT_SUCCESS, 0 );<o:p></o:p></p>
<p class=MsoNormal>+ } else {<o:p></o:p></p>
<p class=MsoNormal>+
++g_ipoib_send_SG_failed;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal>-
//Put back into the pool list structure allocated for the NB<o:p></o:p></p>
<p class=MsoNormal>-
cl_qpool_put(&s_buf->p_port->send_mgr.send_pool, (cl_pool_item_t*
)s_buf);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, SendComp );<o:p></o:p></p>
<p class=MsoNormal>+ //Put back into the pool list structure
allocated for the NB<o:p></o:p></p>
<p class=MsoNormal>+
cl_qpool_put(&s_buf->p_port->send_mgr.send_pool, (cl_pool_item_t*
)s_buf);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, SendComp );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> void<o:p></o:p></p>
<p class=MsoNormal> ipoib_port_resume(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
boolean_t
b_pending )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
boolean_t
b_pending )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
cl_list_item_t
*p_item;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_NB_SG *s_buf = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
boolean_t
b_good_port_state = TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( GetEndpt );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( BuildSendDesc );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( PostSend );<o:p></o:p></p>
<p class=MsoNormal>+ cl_list_item_t
*p_item;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_NB_SG
*s_buf = NULL;<o:p></o:p></p>
<p class=MsoNormal>+
boolean_t
b_good_port_state = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( GetEndpt );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( BuildSendDesc );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( ProcessFailedSends );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( PostSend );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
UNUSED_PARAM(b_pending);<o:p></o:p></p>
<p class=MsoNormal>+ UNUSED_PARAM(b_pending);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("Invalid port state =%d - Flushing the penging list\n",
p_port->state) );<o:p></o:p></p>
<p class=MsoNormal>-
b_good_port_state = FALSE;<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(KeGetCurrentIrql() ==
DISPATCH_LEVEL);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+
("Invalid port state =%d - Flushing the penging list\n",
p_port->state) );<o:p></o:p></p>
<p class=MsoNormal>+
b_good_port_state = FALSE;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if (p_port->send_mgr.pending_list.count <= 0) {<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
};<o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class=MsoNormal>-
while (p_item != cl_qlist_end(&p_port->send_mgr.pending_list))<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>+ if
(p_port->send_mgr.pending_list.count <= 0) {<o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal>+ };<o:p></o:p></p>
<p class=MsoNormal>+ p_item = cl_qlist_remove_head(
&p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class=MsoNormal>+ while (p_item !=
cl_qlist_end(&p_port->send_mgr.pending_list))<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></p>
<p class=MsoNormal>+ s_buf =
(ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if (!b_good_port_state) {<o:p></o:p></p>
<p class=MsoNormal>-
// Port is in error state, flush the list<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></p>
<p class=MsoNormal>-
__send_complete_net_buffer(<o:p></o:p></p>
<p class=MsoNormal>-
s_buf, NDIS_STATUS_FAILURE, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, FALSE);<o:p></o:p></p>
<p class=MsoNormal>-
} else {<o:p></o:p></p>
<p class=MsoNormal>+ if
(!b_good_port_state) {<o:p></o:p></p>
<p class=MsoNormal>+
// Port is in error state, flush the list<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></p>
<p class=MsoNormal>+
__send_complete_net_buffer(<o:p></o:p></p>
<p class=MsoNormal>+
s_buf, NDIS_STATUS_FAILURE, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, FALSE);<o:p></o:p></p>
<p class=MsoNormal>+ } else {<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Check the send queue and pend the request if not empty. */<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("No available WQEs.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_head( &p_port->send_mgr.pending_list, p_item );<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
bool continue_sending = ipoib_process_sg_list_real(NULL, NULL, (PSCATTER_GATHER_LIST)
s_buf->p_sgl, s_buf);<o:p></o:p></p>
<p class=MsoNormal>+
/* Check the send queue and pend the request if not empty. */<o:p></o:p></p>
<p class=MsoNormal>+
if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+
("No available WQEs.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_head( &p_port->send_mgr.pending_list, p_item );<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
bool continue_sending = ipoib_process_sg_list_real(NULL, NULL,
(PSCATTER_GATHER_LIST) s_buf->p_sgl, s_buf);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>
<p class=MsoNormal>+
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if (!continue_sending) {<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT (cl_is_item_in_qlist(&p_port->send_mgr.pending_list,
(cl_list_item_t*)(PVOID)s_buf));<o:p></o:p></p>
<p class=MsoNormal>-
goto Cleanup;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
if (!continue_sending) {<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT (cl_is_item_in_qlist(&p_port->send_mgr.pending_list,
(cl_list_item_t*)(PVOID)s_buf));<o:p></o:p></p>
<p class=MsoNormal>+
goto Cleanup;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+ p_item =
cl_qlist_remove_head( &p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> Cleanup:<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> //TODO: use s_buf-><data_member> directly,
instead of useless copies<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __send_cb(<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></p>
<p class=MsoNormal>-
IN
void
*cq_context )<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></p>
<p class=MsoNormal>+
IN
void
*cq_context )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
ib_wc_t
wc[MAX_SEND_WC], *p_wc, *p_free;<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_t
done_list;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t
*p_endpt;<o:p></o:p></p>
<p class=MsoNormal>-
ip_stat_sel_t
type;<o:p></o:p></p>
<p class=MsoNormal>-
size_t
i;<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER
*p_netbuffer = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_NB_SG *s_buf;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+
ib_wc_t
wc[MAX_SEND_WC], *p_wc, *p_free;<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_t done_list;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+
ip_stat_sel_t type;<o:p></o:p></p>
<p class=MsoNormal>+
size_t
i;<o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER *p_netbuffer =
NULL;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_NB_SG
*s_buf;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( SendCompBundle );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( SendCb );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( PollSend );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( SendComp );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( FreeSendBuf );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( RearmSend );<o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( PortResume );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( SendCompBundle );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( SendCb );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( PollSend );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( SendComp );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( FreeSendBuf );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( RearmSend );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( PortResume );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(KeGetCurrentIrql() ==
DISPATCH_LEVEL);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_clr( SendCompBundle );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_clr( SendCompBundle );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( SendCb );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( SendCb );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
UNUSED_PARAM( h_cq );<o:p></o:p></p>
<p class=MsoNormal>+ UNUSED_PARAM( h_cq );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_init( &done_list );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ cl_qlist_init( &done_list );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port = (ipoib_port_t*)cq_context;<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>-
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_ref( p_port, ref_send_cb );<o:p></o:p></p>
<p class=MsoNormal>+ p_port = (ipoib_port_t*)cq_context;<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_ref( p_port, ref_send_cb );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
for( i = 0; i < MAX_SEND_WC; i++ )<o:p></o:p></p>
<p class=MsoNormal>-
wc[i].p_next = &wc[i + 1];<o:p></o:p></p>
<p class=MsoNormal>-
wc[MAX_SEND_WC - 1].p_next = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ for( i = 0; i < MAX_SEND_WC; i++ )<o:p></o:p></p>
<p class=MsoNormal>+ wc[i].p_next =
&wc[i + 1];<o:p></o:p></p>
<p class=MsoNormal>+ wc[MAX_SEND_WC - 1].p_next = NULL;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
do<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_free = wc;<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( PollSend );<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->poll_cq( p_port->ib_mgr.h_send_cq,
&p_free, &p_wc );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, PollSend );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( status == IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></p>
<p class=MsoNormal>+ do<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_free = wc;<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
PollSend );<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->poll_cq( p_port->ib_mgr.h_send_cq,
&p_free, &p_wc );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, PollSend );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
status == IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
while( p_wc )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( SendComp );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_SEND
|| p_wc->wc_type == IB_WC_LSO);<o:p></o:p></p>
<p class=MsoNormal>-
s_buf = (ipoib_send_NB_SG*)(uintn_t)p_wc->wr_id;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("Successfull send completion for NBL=0x%p .\n",
s_buf->p_nbl ));<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( s_buf );<o:p></o:p></p>
<p class=MsoNormal>+ while( p_wc )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_start(
SendComp );<o:p></o:p></p>
<p class=MsoNormal>+
CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_SEND ||
p_wc->wc_type == IB_WC_LSO);<o:p></o:p></p>
<p class=MsoNormal>+
s_buf = (ipoib_send_NB_SG*)(uintn_t)p_wc->wr_id;<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+
("Successfull send completion for NBL=0x%p .\n",
s_buf->p_nbl ));<o:p></o:p></p>
<p class=MsoNormal>+
CL_ASSERT( s_buf );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = s_buf->p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt = s_buf->p_endpt;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS status = NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
switch( p_wc->status )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
case IB_WCS_SUCCESS:<o:p></o:p></p>
<p class=MsoNormal>-
if( p_endpt->h_mcast )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
if( p_endpt->dgid.multicast.raw_group_id[11] == 0xFF &&<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->dgid.multicast.raw_group_id[13] == 0xFF )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
type = IP_STAT_BCAST_BYTES;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
type = IP_STAT_MCAST_BYTES;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
type = IP_STAT_UCAST_BYTES;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_STATUS status = NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+
switch( p_wc->status )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
case IB_WCS_SUCCESS:<o:p></o:p></p>
<p class=MsoNormal>+
if( p_endpt->h_mcast )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
if( p_endpt->dgid.multicast.raw_group_id[11] == 0xFF &&<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->dgid.multicast.raw_group_id[13]
== 0xFF )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
type = IP_STAT_BCAST_BYTES;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
else<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
type = IP_STAT_MCAST_BYTES;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
else<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
type = IP_STAT_UCAST_BYTES;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_netbuffer = s_buf->p_curr_nb;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_inc_send_stat( p_port->p_adapter, type,
NET_BUFFER_DATA_LENGTH(p_netbuffer) ); <o:p></o:p></p>
<p class=MsoNormal>-
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+
p_netbuffer = s_buf->p_curr_nb;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_inc_send_stat( p_port->p_adapter, type,
NET_BUFFER_DATA_LENGTH(p_netbuffer) ); <o:p></o:p></p>
<p class=MsoNormal>+
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
case IB_WCS_WR_FLUSHED_ERR:<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>-
("Flushed send completion.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></p>
<p class=MsoNormal>-
status = NDIS_STATUS_RESET_IN_PROGRESS;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+
case IB_WCS_WR_FLUSHED_ERR:<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>
<p class=MsoNormal>+
("Flushed send
completion.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></p>
<p class=MsoNormal>+
status = NDIS_STATUS_RESET_IN_PROGRESS;<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
default:<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Send failed with %s (vendor specific %#x)\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ),<o:p></o:p></p>
<p class=MsoNormal>-
(int)p_wc->vendor_specific) );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></p>
<p class=MsoNormal>-
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
__send_complete_net_buffer(s_buf, status,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, FALSE);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_atomic_dec( &p_port->send_mgr.depth );<o:p></o:p></p>
<p class=MsoNormal>+
default:<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Send failed with %s (vendor specific %#x)\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ),<o:p></o:p></p>
<p class=MsoNormal>+
(int)p_wc->vendor_specific) );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></p>
<p class=MsoNormal>+
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
__send_complete_net_buffer(s_buf, status,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, FALSE);<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
cl_atomic_dec( &p_port->send_mgr.depth );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_wc = p_wc->p_next;<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_inc( SendCompBundle );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* If we didn't use up every WC, break out. */<o:p></o:p></p>
<p class=MsoNormal>-
} while( !p_free );<o:p></o:p></p>
<p class=MsoNormal>+
p_wc = p_wc->p_next;<o:p></o:p></p>
<p class=MsoNormal>+
cl_perf_inc( SendCompBundle );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ /* If we didn't
use up every WC, break out. */<o:p></o:p></p>
<p class=MsoNormal>+ } while( !p_free );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Resume any sends awaiting resources. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( PortResume );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_resume( p_port, TRUE );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, PortResume );<o:p></o:p></p>
<p class=MsoNormal>+ /* Resume any sends awaiting resources.
*/<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( PortResume );<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_resume( p_port, TRUE );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, PortResume );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Rearm the CQ. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( RearmSend );<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->rearm_cq(
p_port->ib_mgr.h_send_cq, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RearmSend );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></p>
<p class=MsoNormal>+ /* Rearm the CQ. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( RearmSend );<o:p></o:p></p>
<p class=MsoNormal>+ status = p_port->p_adapter->p_ifc->rearm_cq(
p_port->ib_mgr.h_send_cq, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, RearmSend );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_send_cb );<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_deref( p_port, ref_send_cb );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, SendCb );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_update_ctr( &p_port->p_adapter->perf, SendCompBundle );<o:p></o:p></p>
<p class=MsoNormal>-
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, SendCb );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_update_ctr(
&p_port->p_adapter->perf, SendCompBundle );<o:p></o:p></p>
<p class=MsoNormal>+
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>@@ -5853,349 +5900,349 @@<o:p></o:p></p>
<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_construct(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qmap_init( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qmap_init( &p_port->endpt_mgr.lid_endpts );<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_init( &p_port->endpt_mgr.gid_endpts, __gid_cmp );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ cl_qmap_init(
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>
<p class=MsoNormal>+ cl_qmap_init(
&p_port->endpt_mgr.lid_endpts );<o:p></o:p></p>
<p class=MsoNormal>+ cl_fmap_init(
&p_port->endpt_mgr.gid_endpts, __gid_cmp );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> //TODO Restore CM<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __endpt_cm_mgr_thread(<o:p></o:p></p>
<p class=MsoNormal>-IN
void*
p_context );<o:p></o:p></p>
<p class=MsoNormal>+IN
void* p_context );<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_init(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_init( &p_port->endpt_mgr.conn_endpts, __gid_cmp );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
NdisInitializeListHead( &p_port->endpt_mgr.pending_conns );<o:p></o:p></p>
<p class=MsoNormal>-
NdisAllocateSpinLock( &p_port->endpt_mgr.conn_lock );<o:p></o:p></p>
<p class=MsoNormal>-
cl_event_init( &p_port->endpt_mgr.event, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
NdisInitializeListHead( &p_port->endpt_mgr.remove_conns );<o:p></o:p></p>
<p class=MsoNormal>-
NdisAllocateSpinLock( &p_port->endpt_mgr.remove_lock );<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_fmap_init(
&p_port->endpt_mgr.conn_endpts, __gid_cmp );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ NdisInitializeListHead(
&p_port->endpt_mgr.pending_conns );<o:p></o:p></p>
<p class=MsoNormal>+
NdisAllocateSpinLock( &p_port->endpt_mgr.conn_lock );<o:p></o:p></p>
<p class=MsoNormal>+ cl_event_init(
&p_port->endpt_mgr.event, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+
NdisInitializeListHead( &p_port->endpt_mgr.remove_conns );<o:p></o:p></p>
<p class=MsoNormal>+
NdisAllocateSpinLock( &p_port->endpt_mgr.remove_lock );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_thread_init( &p_port->endpt_mgr.h_thread, <o:p></o:p></p>
<p class=MsoNormal>-
__endpt_cm_mgr_thread,<o:p></o:p></p>
<p class=MsoNormal>-
( const void *)p_port, <o:p></o:p></p>
<p class=MsoNormal>-
"CmEndPtMgr" );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ cl_thread_init(
&p_port->endpt_mgr.h_thread, <o:p></o:p></p>
<p class=MsoNormal>+
__endpt_cm_mgr_thread,<o:p></o:p></p>
<p class=MsoNormal>+
( const void *)p_port, <o:p></o:p></p>
<p class=MsoNormal>+
"CmEndPtMgr" );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal>-
UNUSED_PARAM(p_port);<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ UNUSED_PARAM(p_port);<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> //TODO CM Restore<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __endpt_cm_mgr_thread(<o:p></o:p></p>
<p class=MsoNormal>-IN
void*
p_context )<o:p></o:p></p>
<p class=MsoNormal>+IN
void* p_context )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
ib_status;<o:p></o:p></p>
<p class=MsoNormal>-
LIST_ENTRY
*p_item;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t *p_port =( ipoib_port_t *)p_context;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></p>
<p class=MsoNormal>-
("Starting Port [%d] Endpt CM thread \n", p_port->port_num ) );<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t ib_status;<o:p></o:p></p>
<p class=MsoNormal>+ LIST_ENTRY
*p_item;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_t *p_port
=( ipoib_port_t *)p_context;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></p>
<p class=MsoNormal>+ ("Starting
Port [%d] Endpt CM thread \n", p_port->port_num ) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
while( !p_port->endpt_mgr.thread_is_done )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_event_wait_on( &p_port->endpt_mgr.event, EVENT_NO_TIMEOUT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
while( ( p_item = NdisInterlockedRemoveHeadList( <o:p></o:p></p>
<p class=MsoNormal>-
&p_port->endpt_mgr.pending_conns,<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->endpt_mgr.conn_lock) ) != NULL )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>+ while(
!p_port->endpt_mgr.thread_is_done )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
cl_event_wait_on( &p_port->endpt_mgr.event, EVENT_NO_TIMEOUT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ while( ( p_item
= NdisInterlockedRemoveHeadList( <o:p></o:p></p>
<p class=MsoNormal>+
&p_port->endpt_mgr.pending_conns,<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->endpt_mgr.conn_lock) ) != NULL )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->endpt_mgr.thread_is_done )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>
<p class=MsoNormal>-
continue;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></p>
<p class=MsoNormal>+
if( p_port->endpt_mgr.thread_is_done )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>
<p class=MsoNormal>+
continue;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
("Endpt[%p] CONNECT REQ to MAC %02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt,<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_endpt->conn.h_send_qp )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ib_status = endpt_cm_create_qp( p_endpt, &p_endpt->conn.h_send_qp );<o:p></o:p></p>
<p class=MsoNormal>-
if( ib_status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Endpt [%p ] CM create QP failed status %#x\n", p_endpt, ib_status )
);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ib_status = ipoib_endpt_connect( p_endpt );<o:p></o:p></p>
<p class=MsoNormal>-
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Endpt [ %p ] conn REQ failed status %#x\n", p_endpt, ib_status ) );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></p>
<p class=MsoNormal>-
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></p>
<p class=MsoNormal>-
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+
("Endpt[%p] CONNECT REQ to MAC %02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt,<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->mac.addr[4],
p_endpt->mac.addr[5] ) );<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
if( !p_endpt->conn.h_send_qp )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
ib_status = endpt_cm_create_qp( p_endpt, &p_endpt->conn.h_send_qp );<o:p></o:p></p>
<p class=MsoNormal>+
if( ib_status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Endpt [%p ] CM create QP failed status %#x\n", p_endpt, ib_status )
);<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
else<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
ib_status = ipoib_endpt_connect( p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Endpt [ %p ] conn REQ failed status %#x\n", p_endpt, ib_status ) );<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></p>
<p class=MsoNormal>+
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
}//while( p_item != NULL )<o:p></o:p></p>
<p class=MsoNormal>+ }//while( p_item
!= NULL )<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
while( ( p_item = NdisInterlockedRemoveHeadList(<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->endpt_mgr.remove_conns,<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->endpt_mgr.remove_lock ) ) != NULL )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></p>
<p class=MsoNormal>+ while( ( p_item
= NdisInterlockedRemoveHeadList(<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->endpt_mgr.remove_conns,<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->endpt_mgr.remove_lock ) ) != NULL )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></p>
<p class=MsoNormal>+
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
("\nDESTROYING Endpt[%p] MAC %02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt,<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );<o:p></o:p></p>
<p class=MsoNormal>-
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></p>
<p class=MsoNormal>-
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+
("\nDESTROYING Endpt[%p] MAC %02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt,<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );<o:p></o:p></p>
<p class=MsoNormal>+
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>
<p class=MsoNormal>+
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port->endpt_mgr.thread_is_done++;<o:p></o:p></p>
<p class=MsoNormal>-
NdisFreeSpinLock( &p_port->endpt_mgr.conn_lock );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></p>
<p class=MsoNormal>-
(" Port [%d] Endpt thread is done\n", p_port->port_num ) );<o:p></o:p></p>
<p class=MsoNormal>+ p_port->endpt_mgr.thread_is_done++;<o:p></o:p></p>
<p class=MsoNormal>+ NdisFreeSpinLock(
&p_port->endpt_mgr.conn_lock );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></p>
<p class=MsoNormal>+ (" Port
[%d] Endpt thread is done\n", p_port->port_num ) );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_destroy(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( cl_is_qmap_empty( &p_port->endpt_mgr.mac_endpts ) );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( cl_is_qmap_empty( &p_port->endpt_mgr.lid_endpts ) );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( cl_is_fmap_empty( &p_port->endpt_mgr.gid_endpts ) );<o:p></o:p></p>
<p class=MsoNormal>-
UNUSED_PARAM(p_port);<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( cl_is_qmap_empty(
&p_port->endpt_mgr.mac_endpts ) );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( cl_is_qmap_empty(
&p_port->endpt_mgr.lid_endpts ) );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( cl_is_fmap_empty(
&p_port->endpt_mgr.gid_endpts ) );<o:p></o:p></p>
<p class=MsoNormal>+ UNUSED_PARAM(p_port);<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( cl_is_fmap_empty( &p_port->endpt_mgr.conn_endpts ) );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
cl_is_fmap_empty( &p_port->endpt_mgr.conn_endpts ) );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_remove_all(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
/* Wait for all readers to complete. */<o:p></o:p></p>
<p class=MsoNormal>-
while( p_port->endpt_rdr )<o:p></o:p></p>
<p class=MsoNormal>-
;<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* We don't need to initiate destruction - this is called only<o:p></o:p></p>
<p class=MsoNormal>-
* from the __port_destroying function, and destruction cascades<o:p></o:p></p>
<p class=MsoNormal>-
* to all child objects. Just clear all the maps.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
cl_qmap_remove_all( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qmap_remove_all( &p_port->endpt_mgr.lid_endpts );<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_remove_all( &p_port->endpt_mgr.gid_endpts );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ /* Wait for all readers to complete. */<o:p></o:p></p>
<p class=MsoNormal>+ while( p_port->endpt_rdr )<o:p></o:p></p>
<p class=MsoNormal>+ ;<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * We don't need to initiate
destruction - this is called only<o:p></o:p></p>
<p class=MsoNormal>+ * from the __port_destroying
function, and destruction cascades<o:p></o:p></p>
<p class=MsoNormal>+ * to all child objects. Just
clear all the maps.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ cl_qmap_remove_all(
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>
<p class=MsoNormal>+ cl_qmap_remove_all(
&p_port->endpt_mgr.lid_endpts );<o:p></o:p></p>
<p class=MsoNormal>+ cl_fmap_remove_all( &p_port->endpt_mgr.gid_endpts
);<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_reset_all(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
cl_map_item_t
*p_item;<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_item_t
*p_fmap_item;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t
*p_endpt;<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_t
mc_list;<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_t
conn_list;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
local_exist = 0;<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_LINK_STATE
link_state;<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS_INDICATION
status_indication;<o:p></o:p></p>
<p class=MsoNormal>+
cl_map_item_t
*p_item;<o:p></o:p></p>
<p class=MsoNormal>+
cl_fmap_item_t
*p_fmap_item;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_endpt_t
*p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ cl_qlist_t
mc_list;<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_t
conn_list;<o:p></o:p></p>
<p class=MsoNormal>+
uint32_t
local_exist = 0;<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_LINK_STATE link_state;<o:p></o:p></p>
<p class=MsoNormal>+ NDIS_STATUS_INDICATION
status_indication;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_init( &mc_list );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_init( &conn_list );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
/* Wait for all readers to complete. */<o:p></o:p></p>
<p class=MsoNormal>-
while( p_port->endpt_rdr )<o:p></o:p></p>
<p class=MsoNormal>-
;<o:p></o:p></p>
<p class=MsoNormal>+ cl_qlist_init( &mc_list );<o:p></o:p></p>
<p class=MsoNormal>+ cl_qlist_init( &conn_list );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ /* Wait for all readers to complete. */<o:p></o:p></p>
<p class=MsoNormal>+ while( p_port->endpt_rdr )<o:p></o:p></p>
<p class=MsoNormal>+ ;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_remove_all(p_port);<o:p></o:p></p>
<p class=MsoNormal>+
__endpt_mgr_remove_all(p_port);<o:p></o:p></p>
<p class=MsoNormal> #else<o:p></o:p></p>
<p class=MsoNormal>-
link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;<o:p></o:p></p>
<p class=MsoNormal>-
link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;<o:p></o:p></p>
<p class=MsoNormal>-
link_state.Header.Size = sizeof(NDIS_LINK_STATE);<o:p></o:p></p>
<p class=MsoNormal>-
link_state.MediaConnectState = MediaConnectStateDisconnected;<o:p></o:p></p>
<p class=MsoNormal>-
link_state.MediaDuplexState = MediaDuplexStateFull;<o:p></o:p></p>
<p class=MsoNormal>-
link_state.XmitLinkSpeed = <o:p></o:p></p>
<p class=MsoNormal>-
link_state.RcvLinkSpeed = SET_PORT_RATE_BPS(
p_port->p_adapter->port_rate );<o:p></o:p></p>
<p class=MsoNormal>+
link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;<o:p></o:p></p>
<p class=MsoNormal>+
link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;<o:p></o:p></p>
<p class=MsoNormal>+
link_state.Header.Size = sizeof(NDIS_LINK_STATE);<o:p></o:p></p>
<p class=MsoNormal>+
link_state.MediaConnectState = MediaConnectStateDisconnected;<o:p></o:p></p>
<p class=MsoNormal>+
link_state.MediaDuplexState = MediaDuplexStateFull;<o:p></o:p></p>
<p class=MsoNormal>+
link_state.XmitLinkSpeed = <o:p></o:p></p>
<p class=MsoNormal>+
link_state.RcvLinkSpeed = SET_PORT_RATE_BPS(
p_port->p_adapter->port_rate );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS_LINK_STATE,<o:p></o:p></p>
<p class=MsoNormal>-
(PVOID)&link_state,<o:p></o:p></p>
<p class=MsoNormal>-
sizeof(link_state));<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate DISCONNECT!\n")
);<o:p></o:p></p>
<p class=MsoNormal>-
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
link_state.MediaConnectState = MediaConnectStateConnected;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS_LINK_STATE,<o:p></o:p></p>
<p class=MsoNormal>-
(PVOID)&link_state,<o:p></o:p></p>
<p class=MsoNormal>-
sizeof(link_state));<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate
Connect\n") );<o:p></o:p></p>
<p class=MsoNormal>-
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_STATUS_LINK_STATE,<o:p></o:p></p>
<p class=MsoNormal>+
(PVOID)&link_state,<o:p></o:p></p>
<p class=MsoNormal>+
sizeof(link_state));<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate
DISCONNECT!\n") );<o:p></o:p></p>
<p class=MsoNormal>+
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
link_state.MediaConnectState = MediaConnectStateConnected;<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
NDIS_STATUS_LINK_STATE,<o:p></o:p></p>
<p class=MsoNormal>+
(PVOID)&link_state,<o:p></o:p></p>
<p class=MsoNormal>+
sizeof(link_state));<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate
Connect\n") );<o:p></o:p></p>
<p class=MsoNormal>+
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
//
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
//
("Link DOWN!\n") );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+
// IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+
// ("Link DOWN!\n") );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_local_endpt )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
//TODO: CM RESTORE<o:p></o:p></p>
<p class=MsoNormal>-
//ipoib_port_cancel_listen( p_port, p_port->p_local_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->p_local_endpt )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ //TODO: CM
RESTORE<o:p></o:p></p>
<p class=MsoNormal>+
//ipoib_port_cancel_listen( p_port, p_port->p_local_endpt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->p_local_endpt->gid_item );<o:p></o:p></p>
<p class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->p_local_endpt->mac_item );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_local_endpt->dlid ) {<o:p></o:p></p>
<p class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->p_local_endpt->lid_item );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_local_endpt->dlid = 0;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_head(<o:p></o:p></p>
<p class=MsoNormal>-
&mc_list, &p_port->p_local_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>
<p class=MsoNormal>-
local_exist = 1;<o:p></o:p></p>
<p class=MsoNormal>+
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->p_local_endpt->gid_item );<o:p></o:p></p>
<p class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->p_local_endpt->mac_item );<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_port->p_local_endpt->dlid ) {<o:p></o:p></p>
<p class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->p_local_endpt->lid_item );<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_local_endpt->dlid = 0;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_head(<o:p></o:p></p>
<p class=MsoNormal>+
&mc_list, &p_port->p_local_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>
<p class=MsoNormal>+ local_exist = 1;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_local_endpt = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_local_endpt = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>
<p class=MsoNormal>-
while( p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qmap_next( p_item );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_endpt->h_mcast )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* We destroy MC endpoints since they will get recreated<o:p></o:p></p>
<p class=MsoNormal>-
* when the port comes back up and we rejoin the MC groups.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>
<p class=MsoNormal>-
&p_endpt->mac_item );<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>
<p class=MsoNormal>-
&p_endpt->gid_item );<o:p></o:p></p>
<p class=MsoNormal>+ p_item = cl_qmap_head(
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>
<p class=MsoNormal>+ while( p_item != cl_qmap_end(
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>
<p class=MsoNormal>+ p_item =
cl_qmap_next( p_item );<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_endpt->h_mcast )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/*<o:p></o:p></p>
<p class=MsoNormal>+
* We destroy MC endpoints since they will get recreated<o:p></o:p></p>
<p class=MsoNormal>+
* when the port comes back up and we rejoin the MC groups.<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>
<p class=MsoNormal>+
&p_endpt->mac_item );<o:p></o:p></p>
<p class=MsoNormal>+
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>
<p class=MsoNormal>+
&p_endpt->gid_item );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_tail(<o:p></o:p></p>
<p class=MsoNormal>-
&mc_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* destroy connected endpoints if any */<o:p></o:p></p>
<p class=MsoNormal>-
else if( p_port->p_adapter->params.cm_enabled &&<o:p></o:p></p>
<p class=MsoNormal>-
endpt_cm_get_state( p_endpt ) != IPOIB_CM_DISCONNECTED )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts,
&p_endpt->dgid );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></p>
<p class=MsoNormal>-
&p_endpt->conn_item );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>
<p class=MsoNormal>-
&p_endpt->mac_item );<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>
<p class=MsoNormal>-
&p_endpt->gid_item );<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_tail(<o:p></o:p></p>
<p class=MsoNormal>+
&mc_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ /* destroy
connected endpoints if any */<o:p></o:p></p>
<p class=MsoNormal>+ else if(
p_port->p_adapter->params.cm_enabled &&<o:p></o:p></p>
<p class=MsoNormal>+
endpt_cm_get_state( p_endpt ) != IPOIB_CM_DISCONNECTED )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts,
&p_endpt->dgid );<o:p></o:p></p>
<p class=MsoNormal>+
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></p>
<p class=MsoNormal>+
&p_endpt->conn_item );<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>
<p class=MsoNormal>+
&p_endpt->mac_item );<o:p></o:p></p>
<p class=MsoNormal>+
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>
<p class=MsoNormal>+
&p_endpt->gid_item );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_tail(<o:p></o:p></p>
<p class=MsoNormal>-
&conn_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if( p_endpt->h_av )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Destroy the AV for all other endpoints. */<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->destroy_av( p_endpt->h_av );<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->h_av = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( p_endpt->dlid )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>
<p class=MsoNormal>-
&p_endpt->lid_item );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>-
("<__endptr_mgr_reset_all: setting p_endpt->dlid to 0\n"));<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->dlid = 0;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_tail(<o:p></o:p></p>
<p class=MsoNormal>+
&conn_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_endpt->h_av )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/* Destroy the AV for all other endpoints. */<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->destroy_av( p_endpt->h_av );<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->h_av = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if(
p_endpt->dlid )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>
<p class=MsoNormal>+
&p_endpt->lid_item );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>+
("<__endptr_mgr_reset_all: setting p_endpt->dlid to 0\n"));<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->dlid = 0;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
//TODO CM<o:p></o:p></p>
<p class=MsoNormal>-
/*while( cl_qlist_count( &conn_list ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
endpt_cm_destroy_conn( p_port,<o:p></o:p></p>
<p class=MsoNormal>-
PARENT_STRUCT( cl_qlist_remove_head( &conn_list ),<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t, mac_item.pool_item.list_item ) );<o:p></o:p></p>
<p class=MsoNormal>-
}*/<o:p></o:p></p>
<p class=MsoNormal>+ //TODO CM<o:p></o:p></p>
<p class=MsoNormal>+ /*while( cl_qlist_count( &conn_list
) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
endpt_cm_destroy_conn( p_port,<o:p></o:p></p>
<p class=MsoNormal>+
PARENT_STRUCT( cl_qlist_remove_head( &conn_list ),<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_endpt_t, mac_item.pool_item.list_item ) );<o:p></o:p></p>
<p class=MsoNormal>+ }*/<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if(cl_qlist_count( &mc_list ) - local_exist)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_port->mcast_cnt = (uint32_t)cl_qlist_count( &mc_list ) - local_exist;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_port->mcast_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>-
KeSetEvent( &p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
}
<o:p></o:p></p>
<p class=MsoNormal>+ if(cl_qlist_count( &mc_list ) -
local_exist)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_port->mcast_cnt = (uint32_t)cl_qlist_count( &mc_list ) -
local_exist;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_port->mcast_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>+ KeSetEvent(
&p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+ } <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ENDPT,("p_port->mcast_cnt = %d\n", p_port->mcast_cnt
- local_exist));<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ENDPT,("p_port->mcast_cnt = %d\n", p_port->mcast_cnt
- local_exist));<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Destroy all multicast endpoints now that we have released the lock. */<o:p></o:p></p>
<p class=MsoNormal>-
while( cl_qlist_count( &mc_list ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_list_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qlist_remove_head( &mc_list );<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = PARENT_STRUCT(p_item, ipoib_endpt_t, mac_item.pool_item.list_item);<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Destroy all multicast endpoints now
that we have released the lock. */<o:p></o:p></p>
<p class=MsoNormal>+ while( cl_qlist_count( &mc_list ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_list_item_t
*p_item;<o:p></o:p></p>
<p class=MsoNormal>+ p_item =
cl_qlist_remove_head( &mc_list );<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt =
PARENT_STRUCT(p_item, ipoib_endpt_t, mac_item.pool_item.list_item);<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_destroy(
&p_endpt->obj);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>@@ -6207,542 +6254,542 @@<o:p></o:p></p>
<p class=MsoNormal> */<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_remove(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_endpt )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_endpt )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> #if 0 //CM<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_item_t*
p_fmap_item;<o:p></o:p></p>
<p class=MsoNormal>-#endif <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ cl_fmap_item_t* p_fmap_item;<o:p></o:p></p>
<p class=MsoNormal>+#endif <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* This function must be called from the receive path */<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT(p_port->endpt_rdr > 0);<o:p></o:p></p>
<p class=MsoNormal>+ /* This function must be called from the
receive path */<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(p_port->endpt_rdr > 0);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
/* Wait for all readers to complete. */ <o:p></o:p></p>
<p class=MsoNormal>-
while( p_port->endpt_rdr > 1 )<o:p></o:p></p>
<p class=MsoNormal>-
;<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ /* Wait for all readers to complete.
*/ <o:p></o:p></p>
<p class=MsoNormal>+ while( p_port->endpt_rdr > 1 )<o:p></o:p></p>
<p class=MsoNormal>+ ;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Remove the endpoint from the maps so further requests don't find it. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,
&p_endpt->mac_item );<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* The enpoints are *ALWAYS* in both the MAC and GID maps. They are only<o:p></o:p></p>
<p class=MsoNormal>-
* in the LID map if the GID has the same subnet prefix as us.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,
&p_endpt->gid_item );<o:p></o:p></p>
<p class=MsoNormal>+ /* Remove the endpoint from the maps so
further requests don't find it. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_qmap_remove_item(
&p_port->endpt_mgr.mac_endpts, &p_endpt->mac_item );<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * The enpoints are *ALWAYS* in
both the MAC and GID maps. They are only<o:p></o:p></p>
<p class=MsoNormal>+ * in the LID map if the GID has
the same subnet prefix as us.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ cl_fmap_remove_item(
&p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item );<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts,
&p_endpt->dgid );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></p>
<p class=MsoNormal>-
&p_endpt->conn_item );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_fmap_item = cl_fmap_get(
&p_port->endpt_mgr.conn_endpts, &p_endpt->dgid );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if( p_fmap_item
!= cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></p>
<p class=MsoNormal>+
&p_endpt->conn_item );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif <o:p></o:p></p>
<p class=MsoNormal>-
if( p_endpt->dlid )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>
<p class=MsoNormal>-
&p_endpt->lid_item );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( p_endpt->dlid )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>
<p class=MsoNormal>+
&p_endpt->lid_item );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
//TODO CM<o:p></o:p></p>
<p class=MsoNormal>-
//endpt_cm_destroy_conn( p_port, p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ //TODO CM<o:p></o:p></p>
<p class=MsoNormal>+ //endpt_cm_destroy_conn( p_port, p_endpt
);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> NTSTATUS<o:p></o:p></p>
<p class=MsoNormal> ipoib_mac_to_gid(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
ib_gid_t*
p_gid )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>+
OUT
ib_gid_t*
p_gid )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t*
p_endpt;<o:p></o:p></p>
<p class=MsoNormal>-
cl_map_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>-
uint64_t
key = 0;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_endpt_t* p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ cl_map_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>+
uint64_t key = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed endpoint lookup.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return STATUS_INVALID_PARAMETER;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ p_item = cl_qmap_get(
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_item == cl_qmap_end(
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed endpoint lookup.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
STATUS_INVALID_PARAMETER;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>
<p class=MsoNormal>-
*p_gid = p_endpt->dgid;<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt = PARENT_STRUCT( p_item,
ipoib_endpt_t, mac_item );<o:p></o:p></p>
<p class=MsoNormal>+ *p_gid = p_endpt->dgid;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>-
return STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ return STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> NTSTATUS<o:p></o:p></p>
<p class=MsoNormal> ipoib_mac_to_path(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
ib_path_rec_t*
p_path )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>+
OUT
ib_path_rec_t*
p_path )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t*
p_endpt;<o:p></o:p></p>
<p class=MsoNormal>-
cl_map_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>-
uint64_t
key = 0;<o:p></o:p></p>
<p class=MsoNormal>-
uint8_t
sl;<o:p></o:p></p>
<p class=MsoNormal>-
net32_t
flow_lbl;<o:p></o:p></p>
<p class=MsoNormal>-
uint8_t
hop_limit;<o:p></o:p></p>
<p class=MsoNormal>-
uint8_t
pkt_life;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_endpt_t* p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ cl_map_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>+ uint64_t
key = 0;<o:p></o:p></p>
<p class=MsoNormal>+
uint8_t sl;<o:p></o:p></p>
<p class=MsoNormal>+
net32_t flow_lbl;<o:p></o:p></p>
<p class=MsoNormal>+
uint8_t hop_limit;<o:p></o:p></p>
<p class=MsoNormal>+
uint8_t pkt_life;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_local_endpt == NULL )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("No local endpoint.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return STATUS_INVALID_PARAMETER;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->p_local_endpt == NULL )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("No local endpoint.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
STATUS_INVALID_PARAMETER;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( mac.addr[0] == 0 && mac.addr[1] == 0 && mac.addr[2] == 0
&&<o:p></o:p></p>
<p class=MsoNormal>-
mac.addr[3] == 0 && mac.addr[4] == 0 && mac.addr[5] == 0 )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = p_port->p_local_endpt;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed endpoint lookup.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return STATUS_INVALID_PARAMETER;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( mac.addr[0] == 0 && mac.addr[1]
== 0 && mac.addr[2] == 0 &&<o:p></o:p></p>
<p class=MsoNormal>+ mac.addr[3] == 0
&& mac.addr[4] == 0 && mac.addr[5] == 0 )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt =
p_port->p_local_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_item =
cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_item ==
cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed endpoint lookup.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return STATUS_INVALID_PARAMETER;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_path->service_id = 0;<o:p></o:p></p>
<p class=MsoNormal>-
p_path->dgid = p_endpt->dgid;<o:p></o:p></p>
<p class=MsoNormal>-
p_path->sgid = p_port->p_local_endpt->dgid;<o:p></o:p></p>
<p class=MsoNormal>-
p_path->dlid = p_endpt->dlid;<o:p></o:p></p>
<p class=MsoNormal>-
p_path->slid = p_port->p_local_endpt->dlid;<o:p></o:p></p>
<p class=MsoNormal>+ p_path->service_id = 0;<o:p></o:p></p>
<p class=MsoNormal>+ p_path->dgid = p_endpt->dgid;<o:p></o:p></p>
<p class=MsoNormal>+ p_path->sgid =
p_port->p_local_endpt->dgid;<o:p></o:p></p>
<p class=MsoNormal>+ p_path->dlid = p_endpt->dlid;<o:p></o:p></p>
<p class=MsoNormal>+ p_path->slid =
p_port->p_local_endpt->dlid;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ib_member_get_sl_flow_hop(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.bcast_rec.sl_flow_hop,<o:p></o:p></p>
<p class=MsoNormal>-
&sl,<o:p></o:p></p>
<p class=MsoNormal>-
&flow_lbl,<o:p></o:p></p>
<p class=MsoNormal>-
&hop_limit<o:p></o:p></p>
<p class=MsoNormal>-
);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( p_path->slid == p_path->dlid )<o:p></o:p></p>
<p class=MsoNormal>-
pkt_life = 0;<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
pkt_life = p_port->ib_mgr.bcast_rec.pkt_life;<o:p></o:p></p>
<p class=MsoNormal>+ ib_member_get_sl_flow_hop(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.bcast_rec.sl_flow_hop,<o:p></o:p></p>
<p class=MsoNormal>+ &sl,<o:p></o:p></p>
<p class=MsoNormal>+ &flow_lbl,<o:p></o:p></p>
<p class=MsoNormal>+ &hop_limit<o:p></o:p></p>
<p class=MsoNormal>+ );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if( p_path->slid == p_path->dlid )<o:p></o:p></p>
<p class=MsoNormal>+ pkt_life = 0;<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ pkt_life =
p_port->ib_mgr.bcast_rec.pkt_life;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ib_path_rec_init_local(<o:p></o:p></p>
<p class=MsoNormal>-
p_path,<o:p></o:p></p>
<p class=MsoNormal>-
&p_endpt->dgid,<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->p_local_endpt->dgid,<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->dlid,<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_local_endpt->dlid,<o:p></o:p></p>
<p class=MsoNormal>-
1,<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.bcast_rec.pkey,<o:p></o:p></p>
<p class=MsoNormal>-
sl, 0,<o:p></o:p></p>
<p class=MsoNormal>-
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.mtu,<o:p></o:p></p>
<p class=MsoNormal>-
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.rate,<o:p></o:p></p>
<p class=MsoNormal>-
IB_PATH_SELECTOR_EXACTLY, pkt_life,<o:p></o:p></p>
<p class=MsoNormal>-
0 );<o:p></o:p></p>
<p class=MsoNormal>+ ib_path_rec_init_local(<o:p></o:p></p>
<p class=MsoNormal>+ p_path,<o:p></o:p></p>
<p class=MsoNormal>+
&p_endpt->dgid,<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->p_local_endpt->dgid,<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->dlid,<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_local_endpt->dlid,<o:p></o:p></p>
<p class=MsoNormal>+ 1,<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.bcast_rec.pkey,<o:p></o:p></p>
<p class=MsoNormal>+ sl, 0,<o:p></o:p></p>
<p class=MsoNormal>+
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.mtu,<o:p></o:p></p>
<p class=MsoNormal>+
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.rate,<o:p></o:p></p>
<p class=MsoNormal>+
IB_PATH_SELECTOR_EXACTLY, pkt_life,<o:p></o:p></p>
<p class=MsoNormal>+ 0 );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Set global routing information. */<o:p></o:p></p>
<p class=MsoNormal>-
ib_path_rec_set_hop_flow_raw( p_path, hop_limit, flow_lbl, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
p_path->tclass = p_port->ib_mgr.bcast_rec.tclass;<o:p></o:p></p>
<p class=MsoNormal>+ /* Set global routing information. */<o:p></o:p></p>
<p class=MsoNormal>+ ib_path_rec_set_hop_flow_raw( p_path,
hop_limit, flow_lbl, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+ p_path->tclass =
p_port->ib_mgr.bcast_rec.tclass;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>-
return STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ return STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_ref(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
ipoib_endpt_t**
const
pp_endpt )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>+
OUT
ipoib_endpt_t** const pp_endpt )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>-
cl_map_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>-
uint64_t
key;<o:p></o:p></p>
<p class=MsoNormal>+ NDIS_STATUS
status;<o:p></o:p></p>
<p class=MsoNormal>+ cl_map_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>+
uint64_t key;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
PERF_DECLARE( EndptQueue );<o:p></o:p></p>
<p class=MsoNormal>+ PERF_DECLARE( EndptQueue );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( !cl_memcmp( &mac, &p_port->p_adapter->params.conf_mac,
sizeof(mac) ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Discard loopback traffic. */<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>-
("Discarding loopback traffic\n") );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( !cl_memcmp( &mac,
&p_port->p_adapter->params.conf_mac, sizeof(mac) ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* Discard
loopback traffic. */<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>+
("Discarding loopback traffic\n") );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT(
IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
key = 0;<o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ key = 0;<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>-
("Look for :\t MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>
<p class=MsoNormal>-
mac.addr[0], mac.addr[1], mac.addr[2],<o:p></o:p></p>
<p class=MsoNormal>-
mac.addr[3], mac.addr[4], mac.addr[5]) );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_VERBOSE,
IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>+ ("Look for
:\t MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>
<p class=MsoNormal>+ mac.addr[0],
mac.addr[1], mac.addr[2],<o:p></o:p></p>
<p class=MsoNormal>+ mac.addr[3],
mac.addr[4], mac.addr[5]) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed endpoint lookup.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ p_item = cl_qmap_get(
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_item == cl_qmap_end(
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed endpoint lookup.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
*pp_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_ref( *pp_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ *pp_endpt = PARENT_STRUCT( p_item,
ipoib_endpt_t, mac_item );<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_endpt_ref( *pp_endpt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_start( EndptQueue );<o:p></o:p></p>
<p class=MsoNormal>-
status = ipoib_endpt_queue( *pp_endpt );<o:p></o:p></p>
<p class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, EndptQueue );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
*pp_endpt = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( EndptQueue );<o:p></o:p></p>
<p class=MsoNormal>+ status = ipoib_endpt_queue( *pp_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, EndptQueue );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ *pp_endpt =
NULL;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_get_gid_qpn(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
ib_gid_t*
const
p_gid,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
UNALIGNED net32_t* const p_qpn )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>+
OUT ib_gid_t*
const
p_gid,<o:p></o:p></p>
<p class=MsoNormal>+
OUT UNALIGNED net32_t*
const p_qpn )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
UNALIGNED<o:p></o:p></p>
<p class=MsoNormal>-
cl_map_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal>-
uint64_t
key;<o:p></o:p></p>
<p class=MsoNormal>+ UNALIGNED<o:p></o:p></p>
<p class=MsoNormal>+ cl_map_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+
uint64_t key;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
key = 0;<o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed endpoint lookup.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ key = 0;<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ p_item = cl_qmap_get(
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_item == cl_qmap_end(
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed endpoint lookup.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt = PARENT_STRUCT( p_item,
ipoib_endpt_t, mac_item );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
*p_gid = p_endpt->dgid;<o:p></o:p></p>
<p class=MsoNormal>-
*p_qpn = p_endpt->qpn;<o:p></o:p></p>
<p class=MsoNormal>+ *p_gid = p_endpt->dgid;<o:p></o:p></p>
<p class=MsoNormal>+ *p_qpn = p_endpt->qpn;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static inline ipoib_endpt_t*<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_get_by_gid(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const ib_gid_t*
const
p_gid )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ib_gid_t*
const
p_gid )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_item_t
*p_item;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ cl_fmap_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_fmap_get( &p_port->endpt_mgr.gid_endpts, p_gid );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_item == cl_fmap_end( &p_port->endpt_mgr.gid_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );<o:p></o:p></p>
<p class=MsoNormal>+ p_item = cl_fmap_get(
&p_port->endpt_mgr.gid_endpts, p_gid );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_item == cl_fmap_end(
&p_port->endpt_mgr.gid_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>-
return p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ return p_endpt;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ipoib_endpt_t*<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_get_by_lid(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
net16_t
lid )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
net16_t
lid )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
cl_map_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ cl_map_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qmap_get( &p_port->endpt_mgr.lid_endpts, lid );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_item == cl_qmap_end( &p_port->endpt_mgr.lid_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, lid_item );<o:p></o:p></p>
<p class=MsoNormal>+ p_item = cl_qmap_get(
&p_port->endpt_mgr.lid_endpts, lid );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_item == cl_qmap_end(
&p_port->endpt_mgr.lid_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, lid_item );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>-
return p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ return p_endpt;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> inline ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_insert_locked(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t* const
p_endpt )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t*
const p_endpt )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t status;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>-
("insert :\t MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>
<p class=MsoNormal>-
mac.addr[0], mac.addr[1], mac.addr[2],<o:p></o:p></p>
<p class=MsoNormal>-
mac.addr[3], mac.addr[4], mac.addr[5]) );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>+
("insert :\t MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>
<p class=MsoNormal>+ mac.addr[0],
mac.addr[1], mac.addr[2],<o:p></o:p></p>
<p class=MsoNormal>+ mac.addr[3],
mac.addr[4], mac.addr[5]) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
while( p_port->endpt_rdr )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* __endpt_mgr_insert expects *one* reference to be held when being called. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_atomic_inc( &p_port->endpt_rdr );<o:p></o:p></p>
<p class=MsoNormal>-
status= __endpt_mgr_insert( p_port, mac, p_endpt );<o:p></o:p></p>
<p class=MsoNormal>-
cl_atomic_dec( &p_port->endpt_rdr );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ while( p_port->endpt_rdr )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ /* __endpt_mgr_insert expects *one*
reference to be held when being called. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_atomic_inc( &p_port->endpt_rdr
);<o:p></o:p></p>
<p class=MsoNormal>+ status= __endpt_mgr_insert( p_port, mac,
p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ cl_atomic_dec( &p_port->endpt_rdr
);<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> inline ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_insert(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_endpt )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_endpt )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
uint64_t
key;<o:p></o:p></p>
<p class=MsoNormal>-
cl_status_t
cl_status;<o:p></o:p></p>
<p class=MsoNormal>-
cl_map_item_t *p_qitem;<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_item_t
*p_fitem;<o:p></o:p></p>
<p class=MsoNormal>+
uint64_t key;<o:p></o:p></p>
<p class=MsoNormal>+ cl_status_t
cl_status;<o:p></o:p></p>
<p class=MsoNormal>+ cl_map_item_t *p_qitem;<o:p></o:p></p>
<p class=MsoNormal>+ cl_fmap_item_t *p_fitem;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Wait for all accesses to the map to complete. */<o:p></o:p></p>
<p class=MsoNormal>-
while( p_port->endpt_rdr > 1 )<o:p></o:p></p>
<p class=MsoNormal>-
;<o:p></o:p></p>
<p class=MsoNormal>+ /* Wait for all accesses to the map to
complete. */<o:p></o:p></p>
<p class=MsoNormal>+ while( p_port->endpt_rdr > 1 )<o:p></o:p></p>
<p class=MsoNormal>+ ;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Link the endpoint to the port. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_status = cl_obj_insert_rel_parent_locked(<o:p></o:p></p>
<p class=MsoNormal>-
&p_endpt->rel, &p_port->obj, &p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal>+ /* Link the endpoint to the port. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_status =
cl_obj_insert_rel_parent_locked(<o:p></o:p></p>
<p class=MsoNormal>+
&p_endpt->rel, &p_port->obj, &p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INVALID_STATE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( cl_status != CL_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_destroy(
&p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_INVALID_STATE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #if DBG<o:p></o:p></p>
<p class=MsoNormal>-
cl_atomic_inc( &p_port->ref[ref_endpt_track] );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></p>
<p class=MsoNormal>-
("ref type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt)
);<o:p></o:p></p>
<p class=MsoNormal>+ cl_atomic_inc(
&p_port->ref[ref_endpt_track] );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></p>
<p class=MsoNormal>+ ("ref
type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt) );<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->mac = mac;<o:p></o:p></p>
<p class=MsoNormal>-
key = 0;<o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></p>
<p class=MsoNormal>-
p_qitem = cl_qmap_insert(<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->endpt_mgr.mac_endpts, key, &p_endpt->mac_item );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_qitem == &p_endpt->mac_item );<o:p></o:p></p>
<p class=MsoNormal>-
p_fitem = cl_fmap_insert(<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->endpt_mgr.gid_endpts, &p_endpt->dgid, &p_endpt->gid_item
);<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_fitem == &p_endpt->gid_item );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_endpt->dlid )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_qitem = cl_qmap_insert(<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->endpt_mgr.lid_endpts, p_endpt->dlid,
&p_endpt->lid_item );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_qitem == &p_endpt->lid_item );<o:p></o:p></p>
<p class=MsoNormal>-
if (p_qitem != &p_endpt->lid_item) {<o:p></o:p></p>
<p class=MsoNormal>-
// Since we failed to insert into the list, make sure it is not removed<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->dlid =0;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt->mac = mac;<o:p></o:p></p>
<p class=MsoNormal>+ key = 0;<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ p_qitem = cl_qmap_insert(<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->endpt_mgr.mac_endpts, key, &p_endpt->mac_item );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_qitem ==
&p_endpt->mac_item );<o:p></o:p></p>
<p class=MsoNormal>+ p_fitem = cl_fmap_insert(<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->endpt_mgr.gid_endpts, &p_endpt->dgid,
&p_endpt->gid_item );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_fitem ==
&p_endpt->gid_item );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_endpt->dlid )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_qitem = cl_qmap_insert(<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->endpt_mgr.lid_endpts, p_endpt->dlid,
&p_endpt->lid_item );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
p_qitem == &p_endpt->lid_item );<o:p></o:p></p>
<p class=MsoNormal>+ if (p_qitem !=
&p_endpt->lid_item) {<o:p></o:p></p>
<p class=MsoNormal>+
// Since we failed to insert into the list, make sure
it is not removed<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->dlid =0;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_add_bcast(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_mcast_rec_t
*p_mcast_rec )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_mcast_rec_t
*p_mcast_rec )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal>-
mac_addr_t
bcast_mac;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t status;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ mac_addr_t
bcast_mac;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Cache the broadcast group properties for creating future mcast groups.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.bcast_rec = *p_mcast_rec->p_member_rec;<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Cache the broadcast group
properties for creating future mcast groups.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ p_port->ib_mgr.bcast_rec =
*p_mcast_rec->p_member_rec;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Allocate the broadcast endpoint. */<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = ipoib_endpt_create( &p_mcast_rec->p_member_rec->mgid,<o:p></o:p></p>
<p class=MsoNormal>-
0 , CL_HTON32(0x00FFFFFF) );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_endpt )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ipoib_endpt_create failed.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* set reference to transport to be used while is not attached to the port */<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->is_mcast_listener = TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->p_ifc = p_port->p_adapter->p_ifc;<o:p></o:p></p>
<p class=MsoNormal>-
status = ipoib_endpt_set_mcast( p_endpt, p_port->ib_mgr.h_pd,<o:p></o:p></p>
<p class=MsoNormal>-
p_port->port_num, p_mcast_rec );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ipoib_create_mcast_endpt returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Allocate the broadcast endpoint. */<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt = ipoib_endpt_create(
&p_mcast_rec->p_member_rec->mgid,<o:p></o:p></p>
<p class=MsoNormal>+ 0 ,
CL_HTON32(0x00FFFFFF) );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_endpt )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ipoib_endpt_create failed.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ /* set reference to transport to be used
while is not attached to the port */<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt->is_mcast_listener = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt->p_ifc =
p_port->p_adapter->p_ifc;<o:p></o:p></p>
<p class=MsoNormal>+ status = ipoib_endpt_set_mcast( p_endpt,
p_port->ib_mgr.h_pd,<o:p></o:p></p>
<p class=MsoNormal>+ p_port->port_num,
p_mcast_rec );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_destroy(
&p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ipoib_create_mcast_endpt returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Add the broadcast endpoint to the endpoint map. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_memset( &bcast_mac, 0xFF, sizeof(bcast_mac) );<o:p></o:p></p>
<p class=MsoNormal>-
status = __endpt_mgr_insert_locked( p_port, bcast_mac, p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ /* Add the broadcast endpoint to the
endpoint map. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_memset( &bcast_mac, 0xFF,
sizeof(bcast_mac) );<o:p></o:p></p>
<p class=MsoNormal>+ status = __endpt_mgr_insert_locked(
p_port, bcast_mac, p_endpt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> void<o:p></o:p></p>
<p class=MsoNormal> ipoib_port_remove_endpt(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
mac_addr_t
mac )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
mac_addr_t
mac )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
cl_map_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>-
//TODO CM<o:p></o:p></p>
<p class=MsoNormal>-//
cl_fmap_item_t *p_fmap_item;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal>-
uint64_t
key;<o:p></o:p></p>
<p class=MsoNormal>+ cl_map_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>+ //TODO CM<o:p></o:p></p>
<p class=MsoNormal>+// cl_fmap_item_t *p_fmap_item;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+
uint64_t key;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
key = 0;<o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ key = 0;<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Remove the endpoint from the maps so further requests don't find it. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
/* Wait for all readers to finish */<o:p></o:p></p>
<p class=MsoNormal>-
while( p_port->endpt_rdr )<o:p></o:p></p>
<p class=MsoNormal>-
;<o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qmap_remove( &p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Dereference the endpoint. If the ref count goes to zero, it<o:p></o:p></p>
<p class=MsoNormal>-
* will get freed.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
if( p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* The enpoints are *ALWAYS* in both the MAC and GID maps. They are only<o:p></o:p></p>
<p class=MsoNormal>-
* in the LID map if the GID has the same subnet prefix as us.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_remove_item(<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item );<o:p></o:p></p>
<p class=MsoNormal>+ /* Remove the endpoint from the maps so
further requests don't find it. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ /* Wait for all readers to finish */<o:p></o:p></p>
<p class=MsoNormal>+ while( p_port->endpt_rdr )<o:p></o:p></p>
<p class=MsoNormal>+ ;<o:p></o:p></p>
<p class=MsoNormal>+ p_item = cl_qmap_remove(
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Dereference the endpoint.
If the ref count goes to zero, it<o:p></o:p></p>
<p class=MsoNormal>+ * will get freed.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ if( p_item != cl_qmap_end(
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * The
enpoints are *ALWAYS* in both the MAC and GID maps. They are only<o:p></o:p></p>
<p class=MsoNormal>+ * in the
LID map if the GID has the same subnet prefix as us.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+
cl_fmap_remove_item(<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item );<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts,
&p_endpt->dgid );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></p>
<p class=MsoNormal>-
&p_endpt->conn_item );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts,
&p_endpt->dgid );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></p>
<p class=MsoNormal>+ &p_endpt->conn_item
);<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_endpt->dlid )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_qmap_remove_item(<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->endpt_mgr.lid_endpts, &p_endpt->lid_item );<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->dlid = 0;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_endpt->dlid )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
cl_qmap_remove_item(<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->endpt_mgr.lid_endpts, &p_endpt->lid_item );<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->dlid = 0;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal>-
//TODO CM<o:p></o:p></p>
<p class=MsoNormal>-
//endpt_cm_destroy_conn( p_port, p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_destroy(
&p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal>+ //TODO CM<o:p></o:p></p>
<p class=MsoNormal>+
//endpt_cm_destroy_conn( p_port, p_endpt );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #if DBG<o:p></o:p></p>
<p class=MsoNormal>-
cl_atomic_dec( &p_port->ref[ref_endpt_track] );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>-
("ref type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt)
);<o:p></o:p></p>
<p class=MsoNormal>+ cl_atomic_dec(
&p_port->ref[ref_endpt_track] );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>+
("ref type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt)
);<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> /*<o:p></o:p></p>
<p class=MsoNormal> * The sequence for port up is as follows:<o:p></o:p></p>
<p class=MsoNormal>-
* 1. The port goes
active. This allows the adapter to send SA queries<o:p></o:p></p>
<p class=MsoNormal>-
* and join the
broadcast group (and other groups).<o:p></o:p></p>
<p class=MsoNormal>+ * 1. The port goes active. This allows the
adapter to send SA queries<o:p></o:p></p>
<p class=MsoNormal>+ * and join the broadcast group (and other groups).<o:p></o:p></p>
<p class=MsoNormal> *<o:p></o:p></p>
<p class=MsoNormal>-
* 2. The adapter
sends an SA query for the broadcast group.<o:p></o:p></p>
<p class=MsoNormal>+ * 2. The adapter sends an SA query for the broadcast
group.<o:p></o:p></p>
<p class=MsoNormal> *<o:p></o:p></p>
<p class=MsoNormal>- *
3. Upon completion of the query, the adapter joins the broadcast group.<o:p></o:p></p>
<p class=MsoNormal>+ * 3. Upon completion of the query, the adapter joins
the broadcast group.<o:p></o:p></p>
<p class=MsoNormal> */<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>@@ -6751,183 +6798,183 @@<o:p></o:p></p>
<p class=MsoNormal> */<o:p></o:p></p>
<p class=MsoNormal> void<o:p></o:p></p>
<p class=MsoNormal> ipoib_port_up(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const ib_pnp_port_rec_t*
const p_pnp_rec )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ib_pnp_port_rec_t* const p_pnp_rec )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_port_info_t
*p_port_info;<o:p></o:p></p>
<p class=MsoNormal>-
ib_mad_t
*mad_in
=
NULL;<o:p></o:p></p>
<p class=MsoNormal>-
ib_mad_t
*mad_out = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status = IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>-
static int
cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
("[%d] Entering port_up.\n", ++cnt) ); <o:p></o:p></p>
<p class=MsoNormal>-
p_port->n_no_progress = 0; // Init the send failure counter<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
if ( p_port->state == IB_QPS_INIT ) <o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
status = IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
("p_port->state = %d - Aborting.\n", p_port->state)
); <o:p></o:p></p>
<p class=MsoNormal>-
goto up_done;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else if ( p_port->state == IB_QPS_RTS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->p_adapter->obj );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_adapter->state == IB_PNP_PORT_INIT )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->state = IB_PNP_PORT_ACTIVE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->p_adapter->obj );<o:p></o:p></p>
<p class=MsoNormal>-
status = IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
("Port init is done. p_port->state = %d.\n", p_port->state ) );<o:p></o:p></p>
<p class=MsoNormal>-
goto up_done;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
p_port->state = IB_QPS_INIT;<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj ); <o:p></o:p></p>
<p class=MsoNormal>+
ib_port_info_t *p_port_info;<o:p></o:p></p>
<p class=MsoNormal>+
ib_mad_t
*mad_in = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ ib_mad_t
*mad_out = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status = IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>+ static
int
cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_ERROR,
IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+
("[%d] Entering port_up.\n", ++cnt) ); <o:p></o:p></p>
<p class=MsoNormal>+ p_port->n_no_progress = 0; // Init
the send failure counter<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ if ( p_port->state == IB_QPS_INIT ) <o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ status =
IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+
("p_port->state = %d - Aborting.\n", p_port->state)
); <o:p></o:p></p>
<p class=MsoNormal>+ goto up_done;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else if ( p_port->state == IB_QPS_RTS
)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock(
&p_port->p_adapter->obj );<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_port->p_adapter->state == IB_PNP_PORT_INIT )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->state = IB_PNP_PORT_ACTIVE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->p_adapter->obj );<o:p></o:p></p>
<p class=MsoNormal>+ status =
IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+
("Port init is done. p_port->state = %d.\n", p_port->state ) );<o:p></o:p></p>
<p class=MsoNormal>+ goto up_done;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ p_port->state = IB_QPS_INIT;<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj
); <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Wait for all work requests to get flushed. */<o:p></o:p></p>
<p class=MsoNormal>-
while( p_port->recv_mgr.depth || p_port->send_mgr.depth )<o:p></o:p></p>
<p class=MsoNormal>-
cl_thread_suspend( 0 );<o:p></o:p></p>
<p class=MsoNormal>+ /* Wait for all work requests to get
flushed. */<o:p></o:p></p>
<p class=MsoNormal>+ while( p_port->recv_mgr.depth ||
p_port->send_mgr.depth )<o:p></o:p></p>
<p class=MsoNormal>+
cl_thread_suspend( 0 );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
KeResetEvent( &p_port->sa_event );<o:p></o:p></p>
<p class=MsoNormal>+ KeResetEvent( &p_port->sa_event
);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
mad_out = (ib_mad_t *) (ib_mad_t*)cl_zalloc(256);<o:p></o:p></p>
<p class=MsoNormal>-
if(! mad_out)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("failed to allocate mad mad_out\n")); <o:p></o:p></p>
<p class=MsoNormal>-
goto up_done;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
mad_in = (ib_mad_t *) cl_zalloc(256);<o:p></o:p></p>
<p class=MsoNormal>-
if(! mad_in)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("failed to allocate mad mad_in\n")); <o:p></o:p></p>
<p class=MsoNormal>-
goto up_done;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ mad_out = (ib_mad_t *)
(ib_mad_t*)cl_zalloc(256);<o:p></o:p></p>
<p class=MsoNormal>+ if(! mad_out)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("failed to allocate mad mad_out\n")); <o:p></o:p></p>
<p class=MsoNormal>+ goto up_done;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ mad_in = (ib_mad_t *) cl_zalloc(256);<o:p></o:p></p>
<p class=MsoNormal>+ if(! mad_in)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("failed to allocate mad mad_in\n")); <o:p></o:p></p>
<p class=MsoNormal>+ goto up_done;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
mad_in->attr_id = IB_MAD_ATTR_PORT_INFO;<o:p></o:p></p>
<p class=MsoNormal>-
mad_in->method = IB_MAD_METHOD_GET;<o:p></o:p></p>
<p class=MsoNormal>-
mad_in->base_ver = 1;<o:p></o:p></p>
<p class=MsoNormal>-
mad_in->class_ver =1;<o:p></o:p></p>
<p class=MsoNormal>-
mad_in->mgmt_class = IB_MCLASS_SUBN_LID;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->local_mad(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_ca ,p_port->port_num ,mad_in ,mad_out);<o:p></o:p></p>
<p class=MsoNormal>+ mad_in->attr_id = IB_MAD_ATTR_PORT_INFO;<o:p></o:p></p>
<p class=MsoNormal>+ mad_in->method = IB_MAD_METHOD_GET;<o:p></o:p></p>
<p class=MsoNormal>+ mad_in->base_ver = 1;<o:p></o:p></p>
<p class=MsoNormal>+ mad_in->class_ver =1;<o:p></o:p></p>
<p class=MsoNormal>+ mad_in->mgmt_class =
IB_MCLASS_SUBN_LID;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->local_mad(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.h_ca ,p_port->port_num ,mad_in ,mad_out);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_local_mad returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
goto up_done;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_local_mad returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ goto up_done;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port_info = (ib_port_info_t*)(((ib_smp_t*)mad_out)->data);<o:p></o:p></p>
<p class=MsoNormal>-
p_port->base_lid = p_pnp_rec->p_port_attr->lid;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
("Received port info: link width = %d.\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port_info->link_width_active) );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.rate =<o:p></o:p></p>
<p class=MsoNormal>-
ib_port_info_compute_rate( p_port_info );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_set_rate( p_port->p_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
p_port_info->link_width_active,<o:p></o:p></p>
<p class=MsoNormal>-
ib_port_info_get_link_speed_active( p_port_info ) );<o:p></o:p></p>
<p class=MsoNormal>+ p_port_info =
(ib_port_info_t*)(((ib_smp_t*)mad_out)->data);<o:p></o:p></p>
<p class=MsoNormal>+ p_port->base_lid =
p_pnp_rec->p_port_attr->lid;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+
("Received port info: link width = %d.\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port_info->link_width_active) );<o:p></o:p></p>
<p class=MsoNormal>+ p_port->ib_mgr.rate =<o:p></o:p></p>
<p class=MsoNormal>+ ib_port_info_compute_rate(
p_port_info );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ ipoib_set_rate( p_port->p_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
p_port_info->link_width_active,<o:p></o:p></p>
<p class=MsoNormal>+ ib_port_info_get_link_speed_active(
p_port_info ) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
status = __port_get_bcast( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
if (status != IB_SUCCESS)<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
(" __port_get_bcast returned %s\n",p_port->p_adapter->p_ifc->get_err_str(
status )));<o:p></o:p></p>
<p class=MsoNormal>+ status = __port_get_bcast( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ if (status != IB_SUCCESS)<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+ ("
__port_get_bcast returned
%s\n",p_port->p_adapter->p_ifc->get_err_str( status )));<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> up_done:<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_CANCELED )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>
<p class=MsoNormal>-
p_port->state = IB_QPS_ERROR;<o:p></o:p></p>
<p class=MsoNormal>-
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ if( status !=
IB_CANCELED )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>+
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>
<p class=MsoNormal>+ p_port->state
= IB_QPS_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+ KeSetEvent(
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if(mad_out)<o:p></o:p></p>
<p class=MsoNormal>-
cl_free(mad_out);<o:p></o:p></p>
<p class=MsoNormal>-
if(mad_in)<o:p></o:p></p>
<p class=MsoNormal>-
cl_free(mad_in);<o:p></o:p></p>
<p class=MsoNormal>+ if(mad_out)<o:p></o:p></p>
<p class=MsoNormal>+
cl_free(mad_out);<o:p></o:p></p>
<p class=MsoNormal>+ if(mad_in)<o:p></o:p></p>
<p class=MsoNormal>+ cl_free(mad_in);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __endpt_mgr_add_local(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_port_info_t*
const
p_port_info )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_port_info_t* const p_port_info )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
ib_gid_t
gid;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t
*p_endpt;<o:p></o:p></p>
<p class=MsoNormal>-
ib_av_attr_t
av_attr;<o:p></o:p></p>
<p class=MsoNormal>+
ib_api_status_t status;<o:p></o:p></p>
<p class=MsoNormal>+
ib_gid_t
gid;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_endpt_t
*p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+
ib_av_attr_t
av_attr;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ib_gid_set_default( &gid, p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = ipoib_endpt_create(<o:p></o:p></p>
<p class=MsoNormal>-
&gid, p_port_info->base_lid, p_port->ib_mgr.qpn );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_endpt )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to create local endpt\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ ib_gid_set_default( &gid,
p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt = ipoib_endpt_create(<o:p></o:p></p>
<p class=MsoNormal>+ &gid,
p_port_info->base_lid, p_port->ib_mgr.qpn );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_endpt )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_port->p_adapter->hung
= TRUE;<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to create local endpt\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_memclr( &av_attr, sizeof(ib_av_attr_t) );<o:p></o:p></p>
<p class=MsoNormal>-
av_attr.port_num = p_port->port_num;<o:p></o:p></p>
<p class=MsoNormal>-
av_attr.sl = 0;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>-
(" av_attr.dlid = p_port_info->base_lid = %d\n", cl_ntoh16( p_port_info->base_lid
) ));<o:p></o:p></p>
<p class=MsoNormal>-
av_attr.dlid = p_port_info->base_lid;<o:p></o:p></p>
<p class=MsoNormal>-
av_attr.static_rate = p_port->ib_mgr.rate;<o:p></o:p></p>
<p class=MsoNormal>-
av_attr.path_bits = 0;<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->create_av(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_pd, &av_attr, &p_endpt->h_av );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_create_av for local endpoint returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ cl_memclr( &av_attr,
sizeof(ib_av_attr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ av_attr.port_num = p_port->port_num;<o:p></o:p></p>
<p class=MsoNormal>+ av_attr.sl = 0;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>+ ("
av_attr.dlid = p_port_info->base_lid = %d\n", cl_ntoh16( p_port_info->base_lid
) ));<o:p></o:p></p>
<p class=MsoNormal>+ av_attr.dlid = p_port_info->base_lid;<o:p></o:p></p>
<p class=MsoNormal>+ av_attr.static_rate =
p_port->ib_mgr.rate;<o:p></o:p></p>
<p class=MsoNormal>+ av_attr.path_bits = 0;<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->create_av(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.h_pd, &av_attr, &p_endpt->h_av );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_destroy(
&p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_create_av for local endpoint returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* __endpt_mgr_insert expects *one* reference to be held. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_atomic_inc( &p_port->endpt_rdr );<o:p></o:p></p>
<p class=MsoNormal>-
status = __endpt_mgr_insert( p_port, p_port->p_adapter->params.conf_mac,
p_endpt );<o:p></o:p></p>
<p class=MsoNormal>-
cl_atomic_dec( &p_port->endpt_rdr );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__endpt_mgr_insert for local endpoint returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* __endpt_mgr_insert expects *one*
reference to be held. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_atomic_inc( &p_port->endpt_rdr
);<o:p></o:p></p>
<p class=MsoNormal>+ status = __endpt_mgr_insert( p_port,
p_port->p_adapter->params.conf_mac, p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ cl_atomic_dec( &p_port->endpt_rdr
);<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__endpt_mgr_insert for local endpoint returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_local_endpt = p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ p_port->p_local_endpt = p_endpt;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>@@ -6935,924 +6982,924 @@<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __port_get_bcast(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
ib_query_req_t
query;<o:p></o:p></p>
<p class=MsoNormal>-
ib_user_query_t
info;<o:p></o:p></p>
<p class=MsoNormal>-
ib_member_rec_t
member_rec;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+
ib_query_req_t query;<o:p></o:p></p>
<p class=MsoNormal>+ ib_user_query_t
info;<o:p></o:p></p>
<p class=MsoNormal>+ ib_member_rec_t
member_rec;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
info.method = IB_MAD_METHOD_GETTABLE;<o:p></o:p></p>
<p class=MsoNormal>-
info.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD;<o:p></o:p></p>
<p class=MsoNormal>-
info.attr_size = sizeof(ib_member_rec_t);<o:p></o:p></p>
<p class=MsoNormal>-
info.comp_mask = IB_MCR_COMPMASK_MGID;<o:p></o:p></p>
<p class=MsoNormal>-
info.p_attr = &member_rec;<o:p></o:p></p>
<p class=MsoNormal>+ info.method = IB_MAD_METHOD_GETTABLE;<o:p></o:p></p>
<p class=MsoNormal>+ info.attr_id =
IB_MAD_ATTR_MCMEMBER_RECORD;<o:p></o:p></p>
<p class=MsoNormal>+ info.attr_size =
sizeof(ib_member_rec_t);<o:p></o:p></p>
<p class=MsoNormal>+ info.comp_mask = IB_MCR_COMPMASK_MGID;<o:p></o:p></p>
<p class=MsoNormal>+ info.p_attr = &member_rec;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Query requires only the MGID. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_memclr( &member_rec, sizeof(ib_member_rec_t) );<o:p></o:p></p>
<p class=MsoNormal>-
member_rec.mgid = bcast_mgid_template;<o:p></o:p></p>
<p class=MsoNormal>+ /* Query requires only the MGID. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_memclr( &member_rec,
sizeof(ib_member_rec_t) );<o:p></o:p></p>
<p class=MsoNormal>+ member_rec.mgid = bcast_mgid_template;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> member_rec.mgid.raw[4] = (uint8_t)
(p_port->p_adapter->guids.port_guid.pkey >> 8) ;<o:p></o:p></p>
<p class=MsoNormal>-
member_rec.mgid.raw[5] = (uint8_t)
p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></p>
<p class=MsoNormal>-
member_rec.pkey = cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></p>
<p class=MsoNormal>-
cl_memclr( &query, sizeof(ib_query_req_t) );<o:p></o:p></p>
<p class=MsoNormal>-
query.query_type = IB_QUERY_USER_DEFINED;<o:p></o:p></p>
<p class=MsoNormal>-
query.p_query_input = &info;<o:p></o:p></p>
<p class=MsoNormal>-
query.port_guid = p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>
<p class=MsoNormal>-
query.timeout_ms = p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>
<p class=MsoNormal>-
query.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>
<p class=MsoNormal>-
query.query_context = p_port;<o:p></o:p></p>
<p class=MsoNormal>-
query.pfn_query_cb = __bcast_get_cb;<o:p></o:p></p>
<p class=MsoNormal>+ member_rec.mgid.raw[5] = (uint8_t)
p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></p>
<p class=MsoNormal>+ member_rec.pkey =
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></p>
<p class=MsoNormal>+ cl_memclr( &query,
sizeof(ib_query_req_t) );<o:p></o:p></p>
<p class=MsoNormal>+ query.query_type =
IB_QUERY_USER_DEFINED;<o:p></o:p></p>
<p class=MsoNormal>+ query.p_query_input = &info;<o:p></o:p></p>
<p class=MsoNormal>+ query.port_guid = p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>
<p class=MsoNormal>+ query.timeout_ms =
p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>
<p class=MsoNormal>+ query.retry_cnt =
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>
<p class=MsoNormal>+ query.query_context = p_port;<o:p></o:p></p>
<p class=MsoNormal>+ query.pfn_query_cb = __bcast_get_cb;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* reference the object for the multicast query. */<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_ref( p_port, ref_get_bcast );<o:p></o:p></p>
<p class=MsoNormal>+ /* reference the object for the
multicast query. */<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_ref( p_port, ref_get_bcast );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->query(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->h_al, &query, &p_port->ib_mgr.h_query );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_get_bcast );<o:p></o:p></p>
<p class=MsoNormal>-//
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_query returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_query returned SUCCESS\n"));<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->query(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->h_al, &query, &p_port->ib_mgr.h_query );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_get_bcast );<o:p></o:p></p>
<p class=MsoNormal>+// ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_query returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_ERROR,
IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_query returned SUCCESS\n"));<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> /* Callback for the MCMemberRecord Get query for the
IPv4 broadcast group. */<o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __bcast_get_cb(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_query_rec_t
*p_query_rec )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_query_rec_t
*p_query_rec )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></p>
<p class=MsoNormal>-
ib_member_rec_t
*p_mc_req;<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></p>
<p class=MsoNormal>+ ib_member_rec_t
*p_mc_req;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port = (ipoib_port_t*)p_query_rec->query_context;<o:p></o:p></p>
<p class=MsoNormal>+ p_port =
(ipoib_port_t*)p_query_rec->query_context;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_query = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ p_port->ib_mgr.h_query = NULL;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->state != IB_QPS_INIT )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
status = IB_CANCELED;<o:p></o:p></p>
<p class=MsoNormal>-
goto done;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
status = p_query_rec->status;<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(p_port->state ==
IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->state != IB_QPS_INIT )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ status =
IB_CANCELED;<o:p></o:p></p>
<p class=MsoNormal>+ goto done;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ status = p_query_rec->status;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
("status of request %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+ ("status of
request %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
switch( status )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
case IB_SUCCESS:<o:p></o:p></p>
<p class=MsoNormal>-
if( p_query_rec->result_cnt )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_mc_req = (ib_member_rec_t*)<o:p></o:p></p>
<p class=MsoNormal>-
ib_get_query_result( p_query_rec->p_result_mad, 0 );<o:p></o:p></p>
<p class=MsoNormal>+ switch( status )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ case IB_SUCCESS:<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_query_rec->result_cnt )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_mc_req = (ib_member_rec_t*)<o:p></o:p></p>
<p class=MsoNormal>+
ib_get_query_result( p_query_rec->p_result_mad, 0 );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Join the broadcast group. */<o:p></o:p></p>
<p class=MsoNormal>-
status = __port_join_bcast( p_port, p_mc_req );<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/* Fall through. */<o:p></o:p></p>
<p class=MsoNormal>+
/* Join the broadcast group. */<o:p></o:p></p>
<p class=MsoNormal>+
status = __port_join_bcast( p_port, p_mc_req );<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ /* Fall through.
*/<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
case IB_REMOTE_ERROR:<o:p></o:p></p>
<p class=MsoNormal>-
/* SA failed the query. Broadcast group doesn't exist, create it. */<o:p></o:p></p>
<p class=MsoNormal>-
status = __port_create_bcast( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ case IB_REMOTE_ERROR:<o:p></o:p></p>
<p class=MsoNormal>+ /* SA failed the
query. Broadcast group doesn't exist, create it. */<o:p></o:p></p>
<p class=MsoNormal>+ status =
__port_create_bcast( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
case IB_CANCELED:<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
("Instance destroying - Aborting.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ case IB_CANCELED:<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_INFORMATION,
IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+
("Instance destroying - Aborting.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
default:<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_BCAST_GET, 1, p_query_rec->status );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ default:<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_BCAST_GET, 1, p_query_rec->status );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> done:<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_CANCELED )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
p_port->state = IB_QPS_ERROR;<o:p></o:p></p>
<p class=MsoNormal>-
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ if( status !=
IB_CANCELED )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>+
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ p_port->state
= IB_QPS_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+ KeSetEvent(
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Return the response MAD to AL. */<o:p></o:p></p>
<p class=MsoNormal>-
if( p_query_rec->p_result_mad )<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->put_mad( p_query_rec->p_result_mad );<o:p></o:p></p>
<p class=MsoNormal>+ /* Return the response MAD to AL. */<o:p></o:p></p>
<p class=MsoNormal>+ if( p_query_rec->p_result_mad )<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->put_mad( p_query_rec->p_result_mad );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Release the reference taken when issuing the member record query. */<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_bcast_get_cb );<o:p></o:p></p>
<p class=MsoNormal>+ /* Release the reference taken when
issuing the member record query. */<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_deref( p_port,
ref_bcast_get_cb );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __port_join_bcast(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_member_rec_t*
const
p_member_rec )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_member_rec_t* const p_member_rec )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
ib_mcast_req_t
mcast_req;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+
ib_mcast_req_t mcast_req;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Check that the rate is realizable for our port. */<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->ib_mgr.rate < (p_member_rec->rate & 0x3F) &&<o:p></o:p></p>
<p class=MsoNormal>-
(g_ipoib.bypass_check_bcast_rate == 0))<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* The MC group rate is higher than our port's rate. Log an error<o:p></o:p></p>
<p class=MsoNormal>-
* and stop. A port transition will drive the retry.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
("Unrealizable join due to rate mismatch.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_BCAST_RATE, 2,<o:p></o:p></p>
<p class=MsoNormal>-
(uint32_t)(p_member_rec->rate & 0x3F),<o:p></o:p></p>
<p class=MsoNormal>-
(uint32_t)p_port->ib_mgr.rate );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Check that the rate is realizable for
our port. */<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->ib_mgr.rate <
(p_member_rec->rate & 0x3F) &&<o:p></o:p></p>
<p class=MsoNormal>+
(g_ipoib.bypass_check_bcast_rate == 0))<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * The MC group
rate is higher than our port's rate. Log an error<o:p></o:p></p>
<p class=MsoNormal>+ * and
stop. A port transition will drive the retry.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+
("Unrealizable join due to rate mismatch.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_BCAST_RATE, 2,<o:p></o:p></p>
<p class=MsoNormal>+
(uint32_t)(p_member_rec->rate & 0x3F),<o:p></o:p></p>
<p class=MsoNormal>+
(uint32_t)p_port->ib_mgr.rate );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Join the broadcast group. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_memclr( &mcast_req, sizeof(mcast_req) );<o:p></o:p></p>
<p class=MsoNormal>-
/* Copy the results of the Get to use as parameters. */<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec = *p_member_rec;<o:p></o:p></p>
<p class=MsoNormal>-
/* We specify our port GID for the join operation. */<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.port_gid.unicast.prefix = IB_DEFAULT_SUBNET_PREFIX;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.port_gid.unicast.interface_id =<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>
<p class=MsoNormal>+ /* Join the broadcast group. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_memclr( &mcast_req,
sizeof(mcast_req) );<o:p></o:p></p>
<p class=MsoNormal>+ /* Copy the results of the Get to use as
parameters. */<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.member_rec = *p_member_rec;<o:p></o:p></p>
<p class=MsoNormal>+ /* We specify our port GID for the join
operation. */<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.member_rec.port_gid.unicast.prefix
= IB_DEFAULT_SUBNET_PREFIX;<o:p></o:p></p>
<p class=MsoNormal>+
mcast_req.member_rec.port_gid.unicast.interface_id =<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.mcast_context = p_port;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.pfn_mcast_cb = __bcast_cb;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.timeout_ms = p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.pkey_index = p_port->pkey_index;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.mcast_context = p_port;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.pfn_mcast_cb = __bcast_cb;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.timeout_ms =
p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.pkey_index =
p_port->pkey_index;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( ib_member_get_state( mcast_req.member_rec.scope_state ) !=<o:p></o:p></p>
<p class=MsoNormal>-
IB_MC_REC_STATE_FULL_MEMBER )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
("Incorrect MC member rec join state in query response.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
ib_member_set_state( &mcast_req.member_rec.scope_state,<o:p></o:p></p>
<p class=MsoNormal>-
IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( ib_member_get_state(
mcast_req.member_rec.scope_state ) !=<o:p></o:p></p>
<p class=MsoNormal>+
IB_MC_REC_STATE_FULL_MEMBER )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+
("Incorrect MC member rec join state in query response.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
ib_member_set_state( &mcast_req.member_rec.scope_state,<o:p></o:p></p>
<p class=MsoNormal>+
IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* reference the object for the multicast join request. */<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_ref( p_port, ref_join_bcast );<o:p></o:p></p>
<p class=MsoNormal>+ /* reference the object for the
multicast join request. */<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_ref( p_port, ref_join_bcast );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->join_mcast(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_qp, &mcast_req );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_bcast_join_failed );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_join_mcast returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->join_mcast(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.h_qp, &mcast_req );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_deref(
p_port, ref_bcast_join_failed );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_join_mcast returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __port_create_bcast(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
ib_mcast_req_t
mcast_req;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+
ib_mcast_req_t mcast_req;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Join the broadcast group. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_memclr( &mcast_req, sizeof(mcast_req) );<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.create = TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Create requires pkey, qkey, SL, flow label, traffic class, joing state<o:p></o:p></p>
<p class=MsoNormal>-
* and port GID.<o:p></o:p></p>
<p class=MsoNormal>-
*<o:p></o:p></p>
<p class=MsoNormal>-
* We specify the MGID since we don't want the SA to generate it for us.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mgid = bcast_mgid_template;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mgid.raw[4] = (uint8_t)
(p_port->p_adapter->guids.port_guid.pkey >> 8); <o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mgid.raw[5] = (uint8_t)
p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></p>
<p class=MsoNormal>-
ib_gid_set_default( &mcast_req.member_rec.port_gid,<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* IPOIB spec requires that the QKEY have the MSb set so that the QKEY<o:p></o:p></p>
<p class=MsoNormal>-
* from the QP is used rather than the QKEY in the send WR.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.qkey =<o:p></o:p></p>
<p class=MsoNormal>-
(uint32_t)(uintn_t)p_port | IB_QP_PRIVILEGED_Q_KEY;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mtu =<o:p></o:p></p>
<p class=MsoNormal>-
(IB_PATH_SELECTOR_EXACTLY << 6) | IB_MTU_LEN_2048;<o:p></o:p></p>
<p class=MsoNormal>+ /* Join the broadcast group. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_memclr( &mcast_req,
sizeof(mcast_req) );<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.create = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Create requires pkey, qkey, SL,
flow label, traffic class, joing state<o:p></o:p></p>
<p class=MsoNormal>+ * and port GID.<o:p></o:p></p>
<p class=MsoNormal>+ *<o:p></o:p></p>
<p class=MsoNormal>+ * We specify the MGID since we
don't want the SA to generate it for us.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.member_rec.mgid =
bcast_mgid_template;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.member_rec.mgid.raw[4] =
(uint8_t) (p_port->p_adapter->guids.port_guid.pkey >> 8); <o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.member_rec.mgid.raw[5] =
(uint8_t) p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></p>
<p class=MsoNormal>+ ib_gid_set_default(
&mcast_req.member_rec.port_gid,<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * IPOIB spec requires that the
QKEY have the MSb set so that the QKEY<o:p></o:p></p>
<p class=MsoNormal>+ * from the QP is used rather than
the QKEY in the send WR.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.member_rec.qkey =<o:p></o:p></p>
<p class=MsoNormal>+
(uint32_t)(uintn_t)p_port | IB_QP_PRIVILEGED_Q_KEY;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.member_rec.mtu =<o:p></o:p></p>
<p class=MsoNormal>+
(IB_PATH_SELECTOR_EXACTLY << 6) | IB_MTU_LEN_2048;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.pkey =
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.member_rec.pkey =
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.sl_flow_hop = ib_member_set_sl_flow_hop( 0, 0, 0 );<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.scope_state =<o:p></o:p></p>
<p class=MsoNormal>-
ib_member_set_scope_state( 2, IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.member_rec.sl_flow_hop =
ib_member_set_sl_flow_hop( 0, 0, 0 );<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.member_rec.scope_state =<o:p></o:p></p>
<p class=MsoNormal>+
ib_member_set_scope_state( 2, IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.mcast_context = p_port;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.pfn_mcast_cb = __bcast_cb;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.timeout_ms = p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.pkey_index = p_port->pkey_index;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.mcast_context = p_port;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.pfn_mcast_cb = __bcast_cb;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.timeout_ms =
p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.retry_cnt =
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.pkey_index =
p_port->pkey_index;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* reference the object for the multicast join request. */<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_ref( p_port, ref_join_bcast );<o:p></o:p></p>
<p class=MsoNormal>+ /* reference the object for the
multicast join request. */<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_ref( p_port, ref_join_bcast
);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp,
&mcast_req );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_bcast_create_failed );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_join_mcast returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp,
&mcast_req );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_bcast_create_failed );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_join_mcast returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> void<o:p></o:p></p>
<p class=MsoNormal> ipoib_port_down(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
ib_qp_mod_t
qp_mod;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+ ib_qp_mod_t
qp_mod;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Mark our state. This causes all callbacks to abort.<o:p></o:p></p>
<p class=MsoNormal>-
* Note that we hold the receive lock so that we synchronize<o:p></o:p></p>
<p class=MsoNormal>-
* with reposting. We must take the receive lock before the<o:p></o:p></p>
<p class=MsoNormal>-
* object lock since that is the order taken when reposting.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->state = IB_QPS_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Mark our state. This
causes all callbacks to abort.<o:p></o:p></p>
<p class=MsoNormal>+ * Note that we hold the receive
lock so that we synchronize<o:p></o:p></p>
<p class=MsoNormal>+ * with reposting. We must
take the receive lock before the<o:p></o:p></p>
<p class=MsoNormal>+ * object lock since that is the
order taken when reposting.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_acquire(
&p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ p_port->state = IB_QPS_ERROR;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
__pending_list_destroy(p_port);<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_PORT_DOWN, 0 );<o:p></o:p></p>
<p class=MsoNormal>+ __pending_list_destroy(p_port);<o:p></o:p></p>
<p class=MsoNormal>+ NdisWriteErrorLogEntry(
p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_PORT_DOWN, 0 );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->ib_mgr.h_query )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_query = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->ib_mgr.h_query )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></p>
<p class=MsoNormal>+ p_port->ib_mgr.h_query
= NULL;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_release(
&p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
KeWaitForSingleObject(<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->sa_event, Executive, KernelMode, FALSE, NULL );<o:p></o:p></p>
<p class=MsoNormal>+ KeWaitForSingleObject(<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->sa_event, Executive, KernelMode, FALSE, NULL );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* garbage collector timer is not needed when link is down */<o:p></o:p></p>
<p class=MsoNormal>-
KeCancelTimer(&p_port->gc_timer);<o:p></o:p></p>
<p class=MsoNormal>-
KeFlushQueuedDpcs();<o:p></o:p></p>
<p class=MsoNormal>+ /* garbage collector timer is not needed
when link is down */<o:p></o:p></p>
<p class=MsoNormal>+ KeCancelTimer(&p_port->gc_timer);<o:p></o:p></p>
<p class=MsoNormal>+ KeFlushQueuedDpcs();<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Put the QP in the error state. This removes the need to<o:p></o:p></p>
<p class=MsoNormal>-
* synchronize with send/receive callbacks.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_port->ib_mgr.h_qp );<o:p></o:p></p>
<p class=MsoNormal>-
cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></p>
<p class=MsoNormal>-
qp_mod.req_state = IB_QPS_ERROR;<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_modify_qp to error state returned %s.\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Put the QP in the error
state. This removes the need to<o:p></o:p></p>
<p class=MsoNormal>+ * synchronize with send/receive
callbacks.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_port->ib_mgr.h_qp );<o:p></o:p></p>
<p class=MsoNormal>+ cl_memclr( &qp_mod,
sizeof(ib_qp_mod_t) );<o:p></o:p></p>
<p class=MsoNormal>+ qp_mod.req_state = IB_QPS_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_modify_qp to error state returned %s.\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
KeResetEvent(&p_port->leave_mcast_event);<o:p></o:p></p>
<p class=MsoNormal>+
KeResetEvent(&p_port->leave_mcast_event);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Reset all endpoints so we don't flush our ARP cache. */<o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ /* Reset all endpoints so we don't flush
our ARP cache. */<o:p></o:p></p>
<p class=MsoNormal>+ __endpt_mgr_reset_all( p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
KeWaitForSingleObject(<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->leave_mcast_event, Executive, KernelMode, FALSE, NULL );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->p_adapter->obj );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_dereg_addrs( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->p_adapter->obj );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ KeWaitForSingleObject(<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->leave_mcast_event, Executive, KernelMode, FALSE, NULL );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock(
&p_port->p_adapter->obj );<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_dereg_addrs( p_port->p_adapter
);<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->p_adapter->obj );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __bcast_cb(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_mcast_rec_t
*p_mcast_rec )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_mcast_rec_t
*p_mcast_rec )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t *p_port;<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
LARGE_INTEGER
gc_due_time;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_t *p_port;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t status;<o:p></o:p></p>
<p class=MsoNormal>+ LARGE_INTEGER gc_due_time;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></p>
<p class=MsoNormal>+ p_port =
(ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->state != IB_QPS_INIT )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_bcast_inv_state );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
("Invalid state - Aborting.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
status = p_mcast_rec->status;<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Multicast join for broadcast group returned %s.\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) );<o:p></o:p></p>
<p class=MsoNormal>-
if( status == IB_REMOTE_ERROR )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Either:<o:p></o:p></p>
<p class=MsoNormal>-
* - the join
failed because the group no longer exists<o:p></o:p></p>
<p class=MsoNormal>-
* - the
create failed because the group already exists<o:p></o:p></p>
<p class=MsoNormal>-
*<o:p></o:p></p>
<p class=MsoNormal>-
* Kick off a new Get query to the SA to restart the join process<o:p></o:p></p>
<p class=MsoNormal>-
* from the top. Note that as an optimization, it would be<o:p></o:p></p>
<p class=MsoNormal>-
* possible to distinguish between the join and the create.<o:p></o:p></p>
<p class=MsoNormal>-
* If the join fails, try the create. If the create fails, start<o:p></o:p></p>
<p class=MsoNormal>-
* over with the Get.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
/* TODO: Assert is a place holder. Can we ever get here if the<o:p></o:p></p>
<p class=MsoNormal>-
state isn't IB_PNP_PORT_ADD or PORT_DOWN or PORT_INIT? */<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_port->p_adapter->state == IB_PNP_PORT_ADD ||<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->state == IB_PNP_PORT_DOWN ||<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->state == IB_PNP_PORT_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
if(++p_port->bc_join_retry_cnt <
p_port->p_adapter->params.bc_join_retry)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
status = __port_get_bcast( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->bc_join_retry_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(p_port->state == IB_QPS_INIT
|| p_port->state == IB_QPS_ERROR);<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->state != IB_QPS_INIT )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ KeSetEvent(
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_bcast_inv_state );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+
("Invalid state - Aborting.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ status = p_mcast_rec->status;<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Multicast join for
broadcast group returned %s.\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) );<o:p></o:p></p>
<p class=MsoNormal>+ if( status ==
IB_REMOTE_ERROR )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/*<o:p></o:p></p>
<p class=MsoNormal>+
* Either:<o:p></o:p></p>
<p class=MsoNormal>+
* - the join failed because the group no longer exists<o:p></o:p></p>
<p class=MsoNormal>+
* - the create failed because the group already exists<o:p></o:p></p>
<p class=MsoNormal>+
*<o:p></o:p></p>
<p class=MsoNormal>+
* Kick off a new Get query to the SA to restart the join process<o:p></o:p></p>
<p class=MsoNormal>+
* from the top. Note that as an optimization, it would be<o:p></o:p></p>
<p class=MsoNormal>+
* possible to distinguish between the join and the create.<o:p></o:p></p>
<p class=MsoNormal>+
* If the join fails, try the create. If the create fails, start<o:p></o:p></p>
<p class=MsoNormal>+
* over with the Get.<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal>+
/* TODO: Assert is a place holder. Can we ever get here if the<o:p></o:p></p>
<p class=MsoNormal>+
state isn't IB_PNP_PORT_ADD or PORT_DOWN or PORT_INIT? */<o:p></o:p></p>
<p class=MsoNormal>+
CL_ASSERT( p_port->p_adapter->state == IB_PNP_PORT_ADD ||<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->state == IB_PNP_PORT_DOWN ||<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->state == IB_PNP_PORT_INIT );<o:p></o:p></p>
<p class=MsoNormal>+
if(++p_port->bc_join_retry_cnt <
p_port->p_adapter->params.bc_join_retry)<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
status = __port_get_bcast( p_port );<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
else<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></p>
<p class=MsoNormal>+
p_port->bc_join_retry_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>
<p class=MsoNormal>-
p_port->state = IB_QPS_ERROR;<o:p></o:p></p>
<p class=MsoNormal>-
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_bcast_req_failed );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
p_port->bc_join_retry_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ if( status !=
IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>+
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>
<p class=MsoNormal>+
p_port->state = IB_QPS_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_bcast_req_failed );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT(
IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ p_port->bc_join_retry_cnt = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
while( p_port->endpt_rdr )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ while( p_port->endpt_rdr )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( !p_port->p_local_endpt )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ib_port_info_t port_info;<o:p></o:p></p>
<p class=MsoNormal>-
cl_memclr(&port_info, sizeof(port_info));<o:p></o:p></p>
<p class=MsoNormal>-
port_info.base_lid = p_port->base_lid;<o:p></o:p></p>
<p class=MsoNormal>-
status = __endpt_mgr_add_local( p_port, &port_info );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__endpt_mgr_add_local returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
goto err;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_port->p_local_endpt )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ib_port_info_t port_info;<o:p></o:p></p>
<p class=MsoNormal>+
cl_memclr(&port_info, sizeof(port_info));<o:p></o:p></p>
<p class=MsoNormal>+
port_info.base_lid = p_port->base_lid;<o:p></o:p></p>
<p class=MsoNormal>+ status =
__endpt_mgr_add_local( p_port, &port_info );<o:p></o:p></p>
<p class=MsoNormal>+ if( status !=
IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__endpt_mgr_add_local returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
goto err;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
status = __endpt_mgr_add_bcast( p_port, p_mcast_rec );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__endpt_mgr_add_bcast returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></p>
<p class=MsoNormal>-
goto err;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ status = __endpt_mgr_add_bcast( p_port,
p_mcast_rec );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__endpt_mgr_add_bcast returned %s\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
status == IB_SUCCESS );<o:p></o:p></p>
<p class=MsoNormal>+ goto err;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Get the QP ready for action. */<o:p></o:p></p>
<p class=MsoNormal>-
status = __ib_mgr_activate( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__ib_mgr_activate returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ /* Get the QP ready for action. */<o:p></o:p></p>
<p class=MsoNormal>+ status = __ib_mgr_activate( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__ib_mgr_activate returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> err:<o:p></o:p></p>
<p class=MsoNormal>-
/* Flag the adapter as hung. */<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>
<p class=MsoNormal>-
p_port->state = IB_QPS_ERROR; <o:p></o:p></p>
<p class=MsoNormal>-
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_bcast_error );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Flag the
adapter as hung. */<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>
<p class=MsoNormal>+ p_port->state
= IB_QPS_ERROR; <o:p></o:p></p>
<p class=MsoNormal>+ KeSetEvent(
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_bcast_error );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT(
IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
/* Only change the state if we're still in INIT. */<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT( p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>
<p class=MsoNormal>-
if (p_port->state == IB_QPS_INIT) {<o:p></o:p></p>
<p class=MsoNormal>-
p_port->state = IB_QPS_RTS;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ /* Only change the state if we're still
in INIT. */<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT( p_port->state == IB_QPS_INIT
|| p_port->state == IB_QPS_ERROR);<o:p></o:p></p>
<p class=MsoNormal>+ if (p_port->state == IB_QPS_INIT) {<o:p></o:p></p>
<p class=MsoNormal>+ p_port->state
= IB_QPS_RTS;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Prepost receives. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>-
__recv_mgr_repost( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+ /* Prepost receives. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_acquire(
&p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+ __recv_mgr_repost( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_release(
&p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Notify the adapter that we now have an active connection. */<o:p></o:p></p>
<p class=MsoNormal>-
status = ipoib_set_active( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ib_qp_mod_t
qp_mod;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>-
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>-
("ipoib_set_active returned
%s.\n",p_port->p_adapter->p_ifc->get_err_str( status )));<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->state = IB_QPS_ERROR;<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->ib_mgr.h_query )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></p>
<p class=MsoNormal>-
p_port->ib_mgr.h_query = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+ /* Notify the adapter that we now have
an active connection. */<o:p></o:p></p>
<p class=MsoNormal>+ status = ipoib_set_active(
p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ib_qp_mod_t qp_mod;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>
<p class=MsoNormal>+ KeSetEvent(
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>
<p class=MsoNormal>+
("ipoib_set_active returned
%s.\n",p_port->p_adapter->p_ifc->get_err_str( status )));<o:p></o:p></p>
<p class=MsoNormal>+
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ p_port->state
= IB_QPS_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_port->ib_mgr.h_query )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></p>
<p class=MsoNormal>+
p_port->ib_mgr.h_query = NULL;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_release(
&p_port->recv_lock );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_port->ib_mgr.h_qp );<o:p></o:p></p>
<p class=MsoNormal>-
cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></p>
<p class=MsoNormal>-
qp_mod.req_state = IB_QPS_ERROR;<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></p>
<p class=MsoNormal>-
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
p_port->ib_mgr.h_qp );<o:p></o:p></p>
<p class=MsoNormal>+ cl_memclr(
&qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></p>
<p class=MsoNormal>+ qp_mod.req_state
= IB_QPS_ERROR;<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></p>
<p class=MsoNormal>+
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_join_bcast );<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_join_bcast );<o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #if 0 //CM<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled &&<o:p></o:p></p>
<p class=MsoNormal>-
!p_port->p_local_endpt->conn.h_cm_listen )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
if( ipoib_port_listen( p_port ) != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Port CM Listen failed\n" ) );<o:p></o:p></p>
<p class=MsoNormal>-
/*keep going with UD only */<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->p_adapter->params.cm_enabled
&&<o:p></o:p></p>
<p class=MsoNormal>+
!p_port->p_local_endpt->conn.h_cm_listen )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ if(
ipoib_port_listen( p_port ) != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Port CM Listen failed\n" ) );<o:p></o:p></p>
<p class=MsoNormal>+
/*keep going with UD only */<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>-
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de3 );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>
<p class=MsoNormal>+
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de3 );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal>-
/* garbage collector timer is needed when link is active */<o:p></o:p></p>
<p class=MsoNormal>-
gc_due_time.QuadPart =
-(int64_t)(((uint64_t)p_port->p_adapter->params.mc_leave_rescan *
2000000) * 10);<o:p></o:p></p>
<p class=MsoNormal>-
KeSetTimerEx(&p_port->gc_timer,gc_due_time,<o:p></o:p></p>
<p class=MsoNormal>-
(LONG)p_port->p_adapter->params.mc_leave_rescan*1000,&p_port->gc_dpc);<o:p></o:p></p>
<p class=MsoNormal>+ /* garbage collector timer is needed
when link is active */<o:p></o:p></p>
<p class=MsoNormal>+ gc_due_time.QuadPart = -(int64_t)(((uint64_t)p_port->p_adapter->params.mc_leave_rescan
* 2000000) * 10);<o:p></o:p></p>
<p class=MsoNormal>+
KeSetTimerEx(&p_port->gc_timer,gc_due_time,<o:p></o:p></p>
<p class=MsoNormal>+
(LONG)p_port->p_adapter->params.mc_leave_rescan*1000,&p_port->gc_dpc);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_join_bcast );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ KeSetEvent( &p_port->sa_event,
EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_deref( p_port, ref_join_bcast
);<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __qp_event(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_async_event_rec_t
*p_event_rec )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_async_event_rec_t *p_event_rec )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
UNUSED_PARAM( p_event_rec );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_event_rec->context );<o:p></o:p></p>
<p class=MsoNormal>-
((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ UNUSED_PARAM( p_event_rec );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_event_rec->context );<o:p></o:p></p>
<p class=MsoNormal>+ ((ipoib_port_t*)p_event_rec->context)->p_adapter->hung
= TRUE;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __cq_event(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_async_event_rec_t
*p_event_rec )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_async_event_rec_t *p_event_rec )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
UNUSED_PARAM( p_event_rec );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( p_event_rec->context );<o:p></o:p></p>
<p class=MsoNormal>-
((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ UNUSED_PARAM( p_event_rec );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( p_event_rec->context );<o:p></o:p></p>
<p class=MsoNormal>+
((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = TRUE;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> __ib_mgr_activate(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
ib_dgrm_info_t
dgrm_info;<o:p></o:p></p>
<p class=MsoNormal>-
ib_qp_mod_t
qp_mod;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t status;<o:p></o:p></p>
<p class=MsoNormal>+ ib_dgrm_info_t dgrm_info;<o:p></o:p></p>
<p class=MsoNormal>+ ib_qp_mod_t
qp_mod;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Move the QP to RESET. This allows us to reclaim any<o:p></o:p></p>
<p class=MsoNormal>-
* unflushed receives.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></p>
<p class=MsoNormal>-
qp_mod.req_state = IB_QPS_RESET;<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_modify_qp returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Move the QP to RESET. This
allows us to reclaim any<o:p></o:p></p>
<p class=MsoNormal>+ * unflushed receives.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ cl_memclr( &qp_mod,
sizeof(ib_qp_mod_t) );<o:p></o:p></p>
<p class=MsoNormal>+ qp_mod.req_state = IB_QPS_RESET;<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_modify_qp returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Move the QP to RTS. */<o:p></o:p></p>
<p class=MsoNormal>-
dgrm_info.port_guid = p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>
<p class=MsoNormal>-
dgrm_info.qkey = p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></p>
<p class=MsoNormal>-
dgrm_info.pkey_index = p_port->pkey_index;<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->init_dgrm_svc(
p_port->ib_mgr.h_qp, &dgrm_info );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_init_dgrm_svc returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Move the QP to RTS. */<o:p></o:p></p>
<p class=MsoNormal>+ dgrm_info.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>
<p class=MsoNormal>+ dgrm_info.qkey =
p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></p>
<p class=MsoNormal>+ dgrm_info.pkey_index =
p_port->pkey_index;<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->init_dgrm_svc( p_port->ib_mgr.h_qp,
&dgrm_info );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_init_dgrm_svc returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Rearm the CQs. */<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->rearm_cq(
p_port->ib_mgr.h_recv_cq, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_rearm_cq for recv returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->rearm_cq(
p_port->ib_mgr.h_send_cq, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_rearm_cq for send returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Rearm the CQs. */<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->rearm_cq( p_port->ib_mgr.h_recv_cq, FALSE
);<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_rearm_cq for recv returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ status = p_port->p_adapter->p_ifc->rearm_cq(
p_port->ib_mgr.h_send_cq, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_rearm_cq for send returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>
<p class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> /* Transition to a passive level thread. */<o:p></o:p></p>
<p class=MsoNormal> ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> ipoib_port_join_mcast(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
uint8_t
state)<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
uint8_t
state)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
ib_mcast_req_t
mcast_req;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t
*p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+
ib_mcast_req_t mcast_req;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>-
("Join Multicast request: \n"<o:p></o:p></p>
<p class=MsoNormal>-
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>
<p class=MsoNormal>-
mac.addr[0], mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>-
mac.addr[2], mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>-
mac.addr[4], mac.addr[5]));<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>+ ("Join
Multicast request: \n"<o:p></o:p></p>
<p class=MsoNormal>+ "\tsrc MAC:
%02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>
<p class=MsoNormal>+ mac.addr[0],
mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>+ mac.addr[2],
mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>+ mac.addr[4],
mac.addr[5]));<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
switch( __endpt_mgr_ref( p_port, mac, &p_endpt ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
case NDIS_STATUS_NO_ROUTE_TO_DESTINATION:<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>-
("NDIS_STATUS_NO_ROUTE_TO_DESTINATION\n") );<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>+ switch( __endpt_mgr_ref( p_port, mac,
&p_endpt ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ case
NDIS_STATUS_NO_ROUTE_TO_DESTINATION:<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>+
("NDIS_STATUS_NO_ROUTE_TO_DESTINATION\n") );<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
case NDIS_STATUS_SUCCESS:<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_deref( p_endpt );<o:p></o:p></p>
<p class=MsoNormal>-
/* Fall through */<o:p></o:p></p>
<p class=MsoNormal>+ case NDIS_STATUS_SUCCESS:<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_endpt_deref( p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ /* Fall through
*/<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
case NDIS_STATUS_PENDING:<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>-
("<ipoib_port_join_mcast> PENDING\n") );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref
called for %p\n", p_endpt));<o:p></o:p></p>
<p class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref
called for %p\n", p_endpt));<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Issue the mcast request, using the parameters of the broadcast group.<o:p></o:p></p>
<p class=MsoNormal>-
* This allows us to do a create request that should always succeed since<o:p></o:p></p>
<p class=MsoNormal>-
* the required parameters are known.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
cl_memclr( &mcast_req, sizeof(mcast_req) );<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.create = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ case NDIS_STATUS_PENDING:<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>+
("<ipoib_port_join_mcast> PENDING\n") );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for
%p\n", p_endpt));<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n", p_endpt));<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Issue the mcast request, using
the parameters of the broadcast group.<o:p></o:p></p>
<p class=MsoNormal>+ * This allows us to do a create
request that should always succeed since<o:p></o:p></p>
<p class=MsoNormal>+ * the required parameters are
known.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ cl_memclr( &mcast_req, sizeof(mcast_req)
);<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.create = TRUE;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Copy the settings from the broadcast group. */<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec = p_port->ib_mgr.bcast_rec;<o:p></o:p></p>
<p class=MsoNormal>-
/* Clear fields that aren't specified in the join */<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mlid = 0;<o:p></o:p></p>
<p class=MsoNormal>-
ib_member_set_state( &mcast_req.member_rec.scope_state,state);<o:p></o:p></p>
<p class=MsoNormal>+ /* Copy the settings from the broadcast
group. */<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.member_rec =
p_port->ib_mgr.bcast_rec;<o:p></o:p></p>
<p class=MsoNormal>+ /* Clear fields that aren't specified in
the join */<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.member_rec.mlid = 0;<o:p></o:p></p>
<p class=MsoNormal>+ ib_member_set_state(
&mcast_req.member_rec.scope_state,state);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( (mac.addr[0] == 1) && (mac.addr[2] == 0x5E ))<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Update the address portion of the MGID with the 28 lower bits of the<o:p></o:p></p>
<p class=MsoNormal>-
* IP address. Since we're given a MAC address, we are using <o:p></o:p></p>
<p class=MsoNormal>-
* 24 lower bits of that network-byte-ordered value (assuming MSb<o:p></o:p></p>
<p class=MsoNormal>-
* is zero) and 4 lsb bits of the first byte of IP address.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mgid.raw[12] = mac.addr[1];<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mgid.raw[13] = mac.addr[3];<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mgid.raw[14] = mac.addr[4];<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mgid.raw[15] = mac.addr[5];<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* Handle non IP mutlicast MAC addresses. */<o:p></o:p></p>
<p class=MsoNormal>-
/* Update the signature to use the lower 2 bytes of the OpenIB OUI. */<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mgid.raw[2] = 0x14;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mgid.raw[3] = 0x05;<o:p></o:p></p>
<p class=MsoNormal>-
/* Now copy the MAC address into the last 6 bytes of the GID. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( &mcast_req.member_rec.mgid.raw[10], mac.addr, 6 );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( (mac.addr[0] == 1) &&
(mac.addr[2] == 0x5E ))<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Update
the address portion of the MGID with the 28 lower bits of the<o:p></o:p></p>
<p class=MsoNormal>+ * IP
address. Since we're given a MAC address, we are using <o:p></o:p></p>
<p class=MsoNormal>+ * 24 lower
bits of that network-byte-ordered value (assuming MSb<o:p></o:p></p>
<p class=MsoNormal>+ * is zero)
and 4 lsb bits of the first byte of IP address.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+
mcast_req.member_rec.mgid.raw[12] = mac.addr[1];<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.member_rec.mgid.raw[13]
= mac.addr[3];<o:p></o:p></p>
<p class=MsoNormal>+
mcast_req.member_rec.mgid.raw[14] = mac.addr[4];<o:p></o:p></p>
<p class=MsoNormal>+
mcast_req.member_rec.mgid.raw[15] = mac.addr[5];<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* Handle non IP
mutlicast MAC addresses. */<o:p></o:p></p>
<p class=MsoNormal>+ /* Update the
signature to use the lower 2 bytes of the OpenIB OUI. */<o:p></o:p></p>
<p class=MsoNormal>+
mcast_req.member_rec.mgid.raw[2] = 0x14;<o:p></o:p></p>
<p class=MsoNormal>+
mcast_req.member_rec.mgid.raw[3] = 0x05;<o:p></o:p></p>
<p class=MsoNormal>+ /* Now copy the
MAC address into the last 6 bytes of the GID. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy(
&mcast_req.member_rec.mgid.raw[10], mac.addr, 6 );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.mcast_context = p_port;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.pfn_mcast_cb = __mcast_cb;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.timeout_ms = p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.pkey_index = p_port->pkey_index;<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.pkey = cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* Create the endpoint and insert it in the port. Since we don't wait for<o:p></o:p></p>
<p class=MsoNormal>-
* the mcast SA operations to complete before returning from the multicast<o:p></o:p></p>
<p class=MsoNormal>-
* list set OID asynchronously, it is possible for the mcast entry to be<o:p></o:p></p>
<p class=MsoNormal>-
* cleared before the SA interaction completes. In this case, when the<o:p></o:p></p>
<p class=MsoNormal>-
* mcast callback is invoked, it would not find the corresponding endpoint<o:p></o:p></p>
<p class=MsoNormal>-
* and would be undone.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = ipoib_endpt_create(<o:p></o:p></p>
<p class=MsoNormal>-
&mcast_req.member_rec.mgid, 0, CL_HTON32(0x00FFFFFF) );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_endpt )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ipoib_endpt_create failed.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.mcast_context = p_port;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.pfn_mcast_cb = __mcast_cb;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.timeout_ms =
p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.retry_cnt =
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.pkey_index =
p_port->pkey_index;<o:p></o:p></p>
<p class=MsoNormal>+ mcast_req.member_rec.pkey =
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * Create the endpoint and insert
it in the port. Since we don't wait for<o:p></o:p></p>
<p class=MsoNormal>+ * the mcast SA operations to
complete before returning from the multicast<o:p></o:p></p>
<p class=MsoNormal>+ * list set OID asynchronously, it
is possible for the mcast entry to be<o:p></o:p></p>
<p class=MsoNormal>+ * cleared before the SA
interaction completes. In this case, when the<o:p></o:p></p>
<p class=MsoNormal>+ * mcast callback is invoked, it
would not find the corresponding endpoint<o:p></o:p></p>
<p class=MsoNormal>+ * and would be undone.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt = ipoib_endpt_create(<o:p></o:p></p>
<p class=MsoNormal>+
&mcast_req.member_rec.mgid, 0, CL_HTON32(0x00FFFFFF) );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_endpt )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ipoib_endpt_create failed.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
status = __endpt_mgr_insert_locked( p_port, mac, p_endpt );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("__endpt_mgr_insert_locked returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ status = __endpt_mgr_insert_locked(
p_port, mac, p_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("__endpt_mgr_insert_locked returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* reference the object for the multicast join request. */<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_ref( p_port, ref_join_mcast );<o:p></o:p></p>
<p class=MsoNormal>+ /* reference the object for the
multicast join request. */<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_ref( p_port, ref_join_mcast
);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
status = p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp,
&mcast_req );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_mcast_join_failed );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("ib_join_mcast returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>-
("Joined MCAST group with MGID[10:15]= %0x %0x %0x %0x %0x %0x\n",<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mgid.raw[10],<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mgid.raw[11],<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mgid.raw[12],<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mgid.raw[13],<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mgid.raw[14],<o:p></o:p></p>
<p class=MsoNormal>-
mcast_req.member_rec.mgid.raw[15]) );<o:p></o:p></p>
<p class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp,
&mcast_req );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_mcast_join_failed );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("ib_join_mcast returned %s\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>+ ("Joined MCAST group with
MGID[10:15]= %0x %0x %0x %0x %0x %0x\n",<o:p></o:p></p>
<p class=MsoNormal>+
mcast_req.member_rec.mgid.raw[10],<o:p></o:p></p>
<p class=MsoNormal>+
mcast_req.member_rec.mgid.raw[11],<o:p></o:p></p>
<p class=MsoNormal>+
mcast_req.member_rec.mgid.raw[12],<o:p></o:p></p>
<p class=MsoNormal>+
mcast_req.member_rec.mgid.raw[13],<o:p></o:p></p>
<p class=MsoNormal>+
mcast_req.member_rec.mgid.raw[14],<o:p></o:p></p>
<p class=MsoNormal>+
mcast_req.member_rec.mgid.raw[15]) );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __mcast_cb(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ib_mcast_rec_t
*p_mcast_rec )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ib_mcast_rec_t
*p_mcast_rec )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_item_t
*p_item;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t
*p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></p>
<p class=MsoNormal>+
cl_fmap_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></p>
<p class=MsoNormal>+ p_port =
(ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
while( p_port->endpt_rdr )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ while( p_port->endpt_rdr )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_mcast_inv_state );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST ,("Invalid
state - Aborting.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT ,("Invalid state
- Aborting.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_mcast_inv_state );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST ,("Invalid
state - Aborting.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT ,("Invalid state
- Aborting.\n") );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></p>
<p class=MsoNormal>-
//ipoib_port_resume(p_port , FALSE);<o:p></o:p></p>
<p class=MsoNormal>-
__pending_list_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></p>
<p class=MsoNormal>+
//ipoib_port_resume(p_port , FALSE);<o:p></o:p></p>
<p class=MsoNormal>+
__pending_list_destroy( p_port );<o:p></o:p></p>
<p class=MsoNormal>+
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_mcast_rec->status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Multicast join request failed with status %s.\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) );<o:p></o:p></p>
<p class=MsoNormal>-
/* Flag the adapter as hung. */<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->hung =TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_mcast_req_failed );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( p_mcast_rec->status != IB_SUCCESS
)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Multicast join request failed with status %s.\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) );<o:p></o:p></p>
<p class=MsoNormal>+ /* Flag the
adapter as hung. */<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->hung =TRUE;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_mcast_req_failed );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT(
IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_fmap_get(<o:p></o:p></p>
<p class=MsoNormal>-
&p_port->endpt_mgr.gid_endpts, &p_mcast_rec->p_member_rec->mgid
);<o:p></o:p></p>
<p class=MsoNormal>-
if( p_item == cl_fmap_end( &p_port->endpt_mgr.gid_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* The endpoint must have been flushed while the join request<o:p></o:p></p>
<p class=MsoNormal>-
* was outstanding. Just leave the group and return. This<o:p></o:p></p>
<p class=MsoNormal>-
* is not an error.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to find endpoint for update.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ p_item = cl_fmap_get(<o:p></o:p></p>
<p class=MsoNormal>+
&p_port->endpt_mgr.gid_endpts,
&p_mcast_rec->p_member_rec->mgid );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_item == cl_fmap_end(
&p_port->endpt_mgr.gid_endpts ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * The
endpoint must have been flushed while the join request<o:p></o:p></p>
<p class=MsoNormal>+ * was
outstanding. Just leave the group and return. This<o:p></o:p></p>
<p class=MsoNormal>+ * is not
an error.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to find endpoint for update.\n") );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_mcast_no_endpt );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_mcast_no_endpt );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_MCAST
);<o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->p_ifc = p_port->p_adapter->p_ifc;<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt = PARENT_STRUCT( p_item,
ipoib_endpt_t, gid_item );<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt->p_ifc =
p_port->p_adapter->p_ifc;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Setup the endpoint for use. */<o:p></o:p></p>
<p class=MsoNormal>-
status = ipoib_endpt_set_mcast(<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt, p_port->ib_mgr.h_pd, p_port->port_num, p_mcast_rec );<o:p></o:p></p>
<p class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>-
("ipoib_endpt_set_mcast returned %s.\n",<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>-
/* Flag the adapter as hung. */<o:p></o:p></p>
<p class=MsoNormal>-
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_mcast_av_failed );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Setup the endpoint for use. */<o:p></o:p></p>
<p class=MsoNormal>+ status = ipoib_endpt_set_mcast(<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt,
p_port->ib_mgr.h_pd, p_port->port_num, p_mcast_rec );<o:p></o:p></p>
<p class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>+
("ipoib_endpt_set_mcast returned %s.\n",<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>
<p class=MsoNormal>+ /* Flag the
adapter as hung. */<o:p></o:p></p>
<p class=MsoNormal>+
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_deref( p_port, ref_mcast_av_failed );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT(
IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/*<o:p></o:p></p>
<p class=MsoNormal>-
* The endpoint is already in the GID and MAC maps.<o:p></o:p></p>
<p class=MsoNormal>-
* mast endpoint are not used in the LID map.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT(p_endpt->dlid == 0);<o:p></o:p></p>
<p class=MsoNormal>-
/* set flag that endpoint is use */<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->is_in_use = TRUE;<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
/* Try to send all pending sends. */<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("Calling
ipoib_port_resume from mcast_cb\n"));<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_resume(p_port , FALSE);<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+ /*<o:p></o:p></p>
<p class=MsoNormal>+ * The endpoint is already in the
GID and MAC maps.<o:p></o:p></p>
<p class=MsoNormal>+ * mast endpoint are not used in
the LID map.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(p_endpt->dlid == 0);<o:p></o:p></p>
<p class=MsoNormal>+ /* set flag that endpoint is use */<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt->is_in_use = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ /* Try to send all pending sends. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_MCAST, ("Calling ipoib_port_resume from mcast_cb\n"));<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_resume(p_port , FALSE);<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_release( &p_port->send_lock
);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_join_mcast );<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_deref( p_port, ref_join_mcast
);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> void<o:p></o:p></p>
<p class=MsoNormal> ipoib_leave_mcast_cb(<o:p></o:p></p>
<p class=MsoNormal>-
IN
void
*context )<o:p></o:p></p>
<p class=MsoNormal>+
IN
void
*context )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_t
*p_port;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port = (ipoib_port_t*)context;<o:p></o:p></p>
<p class=MsoNormal>+ p_port = (ipoib_port_t*)context;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_MCAST,("p_port->mcast_cnt =
%d\n", p_port->mcast_cnt));<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_leave_mcast);<o:p></o:p></p>
<p class=MsoNormal>-
//It happens<o:p></o:p></p>
<p class=MsoNormal>-
//ASSERT(p_port->mcast_cnt > 0);<o:p></o:p></p>
<p class=MsoNormal>-
cl_atomic_dec( &p_port->mcast_cnt);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if(0 == p_port->mcast_cnt)<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
KeSetEvent( &p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>-
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_MCAST,("p_port->mcast_cnt
= %d\n", p_port->mcast_cnt));<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_deref( p_port,
ref_leave_mcast);<o:p></o:p></p>
<p class=MsoNormal>+ //It happens<o:p></o:p></p>
<p class=MsoNormal>+ //ASSERT(p_port->mcast_cnt > 0);<o:p></o:p></p>
<p class=MsoNormal>+ cl_atomic_dec(
&p_port->mcast_cnt);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if(0 == p_port->mcast_cnt)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ KeSetEvent(
&p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>+
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> void<o:p></o:p></p>
<p class=MsoNormal> __leave_error_mcast_cb(<o:p></o:p></p>
<p class=MsoNormal>-
IN
void
*context )<o:p></o:p></p>
<p class=MsoNormal>+
IN
void
*context )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_port = (ipoib_port_t*)context;<o:p></o:p></p>
<p class=MsoNormal>+ p_port = (ipoib_port_t*)context;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_deref( p_port, ref_leave_mcast);<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>-
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_deref( p_port,
ref_leave_mcast);<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>
<p class=MsoNormal>+
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> /*++<o:p></o:p></p>
<p class=MsoNormal>@@ -7874,336 +7921,336 @@<o:p></o:p></p>
<p class=MsoNormal> --*/<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> NDIS_STATUS GetLsoHeaderSize(<o:p></o:p></p>
<p class=MsoNormal>-
IN
PNET_BUFFER
pNetBuffer,<o:p></o:p></p>
<p class=MsoNormal>-
IN
LsoData
*pLsoData,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
UINT
*IndexOfData,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_hdr_t *ipoib_hdr<o:p></o:p></p>
<p class=MsoNormal>-
)<o:p></o:p></p>
<p class=MsoNormal>+ IN
PNET_BUFFER pNetBuffer,<o:p></o:p></p>
<p class=MsoNormal>+ IN
LsoData *pLsoData,<o:p></o:p></p>
<p class=MsoNormal>+ OUT
UINT
*IndexOfData,<o:p></o:p></p>
<p class=MsoNormal>+ IN
ipoib_hdr_t *ipoib_hdr<o:p></o:p></p>
<p class=MsoNormal>+ )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
UINT
CurrLength;<o:p></o:p></p>
<p class=MsoNormal>-
PUCHAR
pSrc;<o:p></o:p></p>
<p class=MsoNormal>-
PUCHAR
pCopiedData = pLsoData->coppied_data;<o:p></o:p></p>
<p class=MsoNormal>-
ip_hdr_t
UNALIGNED *IpHdr;<o:p></o:p></p>
<p class=MsoNormal>-
tcp_hdr_t
UNALIGNED *TcpHdr;<o:p></o:p></p>
<p class=MsoNormal>-
uint16_t
TcpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>-
uint16_t
IpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>-
uint16_t
IpOffset;<o:p></o:p></p>
<p class=MsoNormal>-
INT
FullBuffers = 0;<o:p></o:p></p>
<p class=MsoNormal>-
PMDL
pMDL;<o:p></o:p></p>
<p class=MsoNormal>-
NDIS_STATUS status = NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>+ UINT
CurrLength;<o:p></o:p></p>
<p class=MsoNormal>+ PUCHAR
pSrc;<o:p></o:p></p>
<p class=MsoNormal>+ PUCHAR
pCopiedData = pLsoData->coppied_data;<o:p></o:p></p>
<p class=MsoNormal>+ ip_hdr_t
UNALIGNED *IpHdr;<o:p></o:p></p>
<p class=MsoNormal>+ tcp_hdr_t UNALIGNED *TcpHdr;<o:p></o:p></p>
<p class=MsoNormal>+ uint16_t TcpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>+ uint16_t IpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>+ uint16_t IpOffset;<o:p></o:p></p>
<p class=MsoNormal>+
INT FullBuffers = 0;<o:p></o:p></p>
<p class=MsoNormal>+
PMDL pMDL;<o:p></o:p></p>
<p class=MsoNormal>+ NDIS_STATUS status =
NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal> #define IP_OFFSET 14;<o:p></o:p></p>
<p class=MsoNormal>-
//<o:p></o:p></p>
<p class=MsoNormal>-
// This Flag indicates the way we gets the headers<o:p></o:p></p>
<p class=MsoNormal>-
// RegularFlow = we get the headers (ETH+IP+TCP) in the same Buffer <o:p></o:p></p>
<p class=MsoNormal>-
// in sequence.<o:p></o:p></p>
<p class=MsoNormal>-
//<o:p></o:p></p>
<p class=MsoNormal>-
boolean_t
IsRegularFlow = TRUE;<o:p></o:p></p>
<p class=MsoNormal>+ //<o:p></o:p></p>
<p class=MsoNormal>+ // This Flag indicates the way we gets
the headers<o:p></o:p></p>
<p class=MsoNormal>+ // RegularFlow = we get the headers
(ETH+IP+TCP) in the same Buffer <o:p></o:p></p>
<p class=MsoNormal>+ // in sequence.<o:p></o:p></p>
<p class=MsoNormal>+ //<o:p></o:p></p>
<p class=MsoNormal>+
boolean_t
IsRegularFlow = TRUE;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
const uint16_t
ETH_OFFSET = IP_OFFSET; <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
pLsoData->LsoHeaderSize = 0;<o:p></o:p></p>
<p class=MsoNormal>-
IpOffset = IP_OFFSET;
//(uint16_t)pPort->EncapsulationFormat.EncapsulationHeaderSize;<o:p></o:p></p>
<p class=MsoNormal>-
*IndexOfData = 0;<o:p></o:p></p>
<p class=MsoNormal>+ const
uint16_t ETH_OFFSET = IP_OFFSET; <o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ pLsoData->LsoHeaderSize = 0;<o:p></o:p></p>
<p class=MsoNormal>+ IpOffset = IP_OFFSET;
//(uint16_t)pPort->EncapsulationFormat.EncapsulationHeaderSize;<o:p></o:p></p>
<p class=MsoNormal>+ *IndexOfData = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
pMDL = NET_BUFFER_CURRENT_MDL(pNetBuffer);<o:p></o:p></p>
<p class=MsoNormal>-
NdisQueryMdl(pMDL, &pSrc, &CurrLength, NormalPagePriority);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if (pSrc == NULL) {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing packets\n"));<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
ULONG DataOffset = NET_BUFFER_CURRENT_MDL_OFFSET(pNetBuffer);<o:p></o:p></p>
<p class=MsoNormal>-
pSrc += DataOffset;<o:p></o:p></p>
<p class=MsoNormal>-
CurrLength -= DataOffset;<o:p></o:p></p>
<p class=MsoNormal>+ pMDL =
NET_BUFFER_CURRENT_MDL(pNetBuffer);<o:p></o:p></p>
<p class=MsoNormal>+ NdisQueryMdl(pMDL, &pSrc,
&CurrLength, NormalPagePriority);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if (pSrc == NULL) {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing
packets\n"));<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ ULONG DataOffset =
NET_BUFFER_CURRENT_MDL_OFFSET(pNetBuffer);<o:p></o:p></p>
<p class=MsoNormal>+ pSrc += DataOffset;<o:p></o:p></p>
<p class=MsoNormal>+ CurrLength -= DataOffset;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
// We start by looking for the ethernet and the IP<o:p></o:p></p>
<p class=MsoNormal>-
if (CurrLength < ETH_OFFSET) {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error porcessing packets\n"));<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
//pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + ETH_OFFSET;<o:p></o:p></p>
<p class=MsoNormal>-
if (CurrLength == ETH_OFFSET) { <o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>-
IsRegularFlow = FALSE; <o:p></o:p></p>
<p class=MsoNormal>-
memcpy(pCopiedData, pSrc, ETH_OFFSET);<o:p></o:p></p>
<p class=MsoNormal>-
pCopiedData += ETH_OFFSET; <o:p></o:p></p>
<p class=MsoNormal>-
FullBuffers++;<o:p></o:p></p>
<p class=MsoNormal>-
// First buffer was only ethernet<o:p></o:p></p>
<p class=MsoNormal>-
pNetBuffer = NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></p>
<p class=MsoNormal>+ // We start by looking for the ethernet
and the IP<o:p></o:p></p>
<p class=MsoNormal>+ if (CurrLength < ETH_OFFSET) {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ //pLsoData->LsoHeaderSize =
pLsoData->LsoHeaderSize + ETH_OFFSET;<o:p></o:p></p>
<p class=MsoNormal>+ if (CurrLength == ETH_OFFSET)
{ <o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>+ IsRegularFlow =
FALSE; <o:p></o:p></p>
<p class=MsoNormal>+
memcpy(pCopiedData, pSrc, ETH_OFFSET);<o:p></o:p></p>
<p class=MsoNormal>+ pCopiedData +=
ETH_OFFSET; <o:p></o:p></p>
<p class=MsoNormal>+ FullBuffers++;<o:p></o:p></p>
<p class=MsoNormal>+ // First buffer
was only ethernet<o:p></o:p></p>
<p class=MsoNormal>+ pNetBuffer =
NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></p>
<p class=MsoNormal> NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer),
&pSrc, &CurrLength, NormalPagePriority);<o:p></o:p></p>
<p class=MsoNormal>-
if (pSrc == NULL) {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
} else {<o:p></o:p></p>
<p class=MsoNormal>-
// This is ETH + IP together (at least)<o:p></o:p></p>
<p class=MsoNormal>-
pLsoData->LsoBuffers[0].pData = pSrc + (ETH_OFFSET - sizeof (ipoib_hdr_t));<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
//IMPORTANT: we de-facto replace ETH header by IPoIB header here<o:p></o:p></p>
<p class=MsoNormal>-
memcpy (pLsoData->LsoBuffers[0].pData, ipoib_hdr, sizeof (ipoib_hdr_t));<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
CurrLength -= ETH_OFFSET;<o:p></o:p></p>
<p class=MsoNormal>-
pSrc = pSrc + ETH_OFFSET;<o:p></o:p></p>
<p class=MsoNormal>-
pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + sizeof (ipoib_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
// we should now be having at least the size of ethernet data<o:p></o:p></p>
<p class=MsoNormal>-
if (CurrLength < sizeof (ip_hdr_t)) {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
IpHdr = (ip_hdr_t UNALIGNED*)pSrc;<o:p></o:p></p>
<p class=MsoNormal>-
IpHeaderLen = (uint16_t)IP_HEADER_LENGTH(IpHdr);<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(IpHdr->prot == IP_PROT_TCP);<o:p></o:p></p>
<p class=MsoNormal>-
if (CurrLength < IpHeaderLen) {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing packets\n"));<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + IpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>-
// We now start to find where the TCP header starts<o:p></o:p></p>
<p class=MsoNormal>-
if (CurrLength == IpHeaderLen) {<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>-
// two options : <o:p></o:p></p>
<p class=MsoNormal>-
// if(IsRegularFlow = FALSE) ==> ETH and IP seperated in two buffers<o:p></o:p></p>
<p class=MsoNormal>-
// if(IsRegularFlow = TRUE ) ==> ETH and IP in the same buffer <o:p></o:p></p>
<p class=MsoNormal>-
// TCP will start at next buffer<o:p></o:p></p>
<p class=MsoNormal>-
if(IsRegularFlow){<o:p></o:p></p>
<p class=MsoNormal>-
memcpy(pCopiedData, pSrc-ETH_OFFSET ,ETH_OFFSET+IpHeaderLen);<o:p></o:p></p>
<p class=MsoNormal>-
pCopiedData += (ETH_OFFSET + IpHeaderLen);<o:p></o:p></p>
<p class=MsoNormal>-
} else {<o:p></o:p></p>
<p class=MsoNormal>-
memcpy(pCopiedData, pSrc,IpHeaderLen);<o:p></o:p></p>
<p class=MsoNormal>-
pCopiedData += IpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if (pSrc ==
NULL) {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></p>
<p class=MsoNormal>+
return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ } else {<o:p></o:p></p>
<p class=MsoNormal>+ // This is ETH +
IP together (at least)<o:p></o:p></p>
<p class=MsoNormal>+
pLsoData->LsoBuffers[0].pData = pSrc + (ETH_OFFSET - sizeof (ipoib_hdr_t));<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ //IMPORTANT: we
de-facto replace ETH header by IPoIB header here<o:p></o:p></p>
<p class=MsoNormal>+ memcpy
(pLsoData->LsoBuffers[0].pData, ipoib_hdr, sizeof (ipoib_hdr_t));<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ CurrLength -=
ETH_OFFSET;<o:p></o:p></p>
<p class=MsoNormal>+ pSrc = pSrc +
ETH_OFFSET;<o:p></o:p></p>
<p class=MsoNormal>+
pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + sizeof (ipoib_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ // we should now be having at least the
size of ethernet data<o:p></o:p></p>
<p class=MsoNormal>+ if (CurrLength < sizeof (ip_hdr_t)) {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(TRACE_LEVEL_VERBOSE,
IPOIB_DBG_ERROR, ("Error porcessing packets\n"));<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ IpHdr = (ip_hdr_t UNALIGNED*)pSrc;<o:p></o:p></p>
<p class=MsoNormal>+ IpHeaderLen =
(uint16_t)IP_HEADER_LENGTH(IpHdr);<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(IpHdr->prot == IP_PROT_TCP);<o:p></o:p></p>
<p class=MsoNormal>+ if (CurrLength < IpHeaderLen) {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing
packets\n"));<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ pLsoData->LsoHeaderSize =
pLsoData->LsoHeaderSize + IpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>+ // We now start to find where the TCP
header starts<o:p></o:p></p>
<p class=MsoNormal>+ if (CurrLength == IpHeaderLen) {<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(FALSE);<o:p></o:p></p>
<p class=MsoNormal>+ // two options :
<o:p></o:p></p>
<p class=MsoNormal>+ //
if(IsRegularFlow = FALSE) ==> ETH and IP seperated in two buffers<o:p></o:p></p>
<p class=MsoNormal>+ //
if(IsRegularFlow = TRUE ) ==> ETH and IP in the same buffer <o:p></o:p></p>
<p class=MsoNormal>+ // TCP will
start at next buffer<o:p></o:p></p>
<p class=MsoNormal>+
if(IsRegularFlow){<o:p></o:p></p>
<p class=MsoNormal>+
memcpy(pCopiedData, pSrc-ETH_OFFSET ,ETH_OFFSET+IpHeaderLen);<o:p></o:p></p>
<p class=MsoNormal>+
pCopiedData += (ETH_OFFSET + IpHeaderLen);<o:p></o:p></p>
<p class=MsoNormal>+ } else {<o:p></o:p></p>
<p class=MsoNormal>+
memcpy(pCopiedData, pSrc,IpHeaderLen);<o:p></o:p></p>
<p class=MsoNormal>+
pCopiedData += IpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
FullBuffers++;<o:p></o:p></p>
<p class=MsoNormal>-
IsRegularFlow = FALSE;<o:p></o:p></p>
<p class=MsoNormal>-
//NdisGetNextBuffer( CurrBuffer, &CurrBuffer);<o:p></o:p></p>
<p class=MsoNormal>-
//NdisQueryBufferSafe( CurrBuffer, &pSrc, &CurrLength,
NormalPagePriority );<o:p></o:p></p>
<p class=MsoNormal>-
pNetBuffer = NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></p>
<p class=MsoNormal>-
NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer), &pSrc, &CurrLength,
NormalPagePriority);<o:p></o:p></p>
<p class=MsoNormal>-
if (pSrc == NULL) {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
} else {<o:p></o:p></p>
<p class=MsoNormal>-
// if(IsRegularFlow = TRUE ) ==> the ETH and IP and TCP in the same buffer
<o:p></o:p></p>
<p class=MsoNormal>-
// if(IsRegularFlow = FLASE ) ==> ETH in one buffer , IP+TCP together in the
same buffer<o:p></o:p></p>
<p class=MsoNormal>-
if (IsRegularFlow) {
<o:p></o:p></p>
<p class=MsoNormal>-
pLsoData->LsoBuffers[0].Len += IpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>-
} else { <o:p></o:p></p>
<p class=MsoNormal>-
memcpy(pCopiedData, pSrc, IpHeaderLen);<o:p></o:p></p>
<p class=MsoNormal>-
pCopiedData += IpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ FullBuffers++;<o:p></o:p></p>
<p class=MsoNormal>+ IsRegularFlow =
FALSE;<o:p></o:p></p>
<p class=MsoNormal>+
//NdisGetNextBuffer( CurrBuffer, &CurrBuffer);<o:p></o:p></p>
<p class=MsoNormal>+
//NdisQueryBufferSafe( CurrBuffer, &pSrc, &CurrLength,
NormalPagePriority );<o:p></o:p></p>
<p class=MsoNormal>+ pNetBuffer =
NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></p>
<p class=MsoNormal>+
NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer), &pSrc, &CurrLength,
NormalPagePriority);<o:p></o:p></p>
<p class=MsoNormal>+ if (pSrc ==
NULL) {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></p>
<p class=MsoNormal>+
return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ } else {<o:p></o:p></p>
<p class=MsoNormal>+ // if(IsRegularFlow
= TRUE ) ==> the ETH and IP and TCP in the same
buffer <o:p></o:p></p>
<p class=MsoNormal>+ //
if(IsRegularFlow = FLASE ) ==> ETH in one buffer , IP+TCP together in the
same buffer<o:p></o:p></p>
<p class=MsoNormal>+ if
(IsRegularFlow)
{ <o:p></o:p></p>
<p class=MsoNormal>+
pLsoData->LsoBuffers[0].Len += IpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>+ } else
{ <o:p></o:p></p>
<p class=MsoNormal>+
memcpy(pCopiedData, pSrc, IpHeaderLen);<o:p></o:p></p>
<p class=MsoNormal>+
pCopiedData += IpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CurrLength -= IpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>-
pSrc = pSrc + IpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if (CurrLength < sizeof (tcp_hdr_t)) {<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing packets\n"));<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
// We have finaly found the TCP header<o:p></o:p></p>
<p class=MsoNormal>-
TcpHdr = (tcp_hdr_t UNALIGNED *)pSrc;<o:p></o:p></p>
<p class=MsoNormal>-
TcpHeaderLen = TCP_HEADER_LENGTH(TcpHdr);<o:p></o:p></p>
<p class=MsoNormal>+ CurrLength -=
IpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>+ pSrc = pSrc +
IpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ if (CurrLength < sizeof (tcp_hdr_t))
{<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ // We have finaly found the TCP header<o:p></o:p></p>
<p class=MsoNormal>+ TcpHdr = (tcp_hdr_t UNALIGNED *)pSrc;<o:p></o:p></p>
<p class=MsoNormal>+ TcpHeaderLen =
TCP_HEADER_LENGTH(TcpHdr);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
//ASSERT(TcpHeaderLen == 20);<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if (CurrLength < TcpHeaderLen) {<o:p></o:p></p>
<p class=MsoNormal>-
//IPOIB_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Error porcessing packets\n"));<o:p></o:p></p>
<p class=MsoNormal>-
return status;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + TcpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>-
if(IsRegularFlow){<o:p></o:p></p>
<p class=MsoNormal>-
pLsoData->LsoBuffers[0].Len += TcpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else{<o:p></o:p></p>
<p class=MsoNormal>-
memcpy(pCopiedData, pSrc, TcpHeaderLen);<o:p></o:p></p>
<p class=MsoNormal>-
pCopiedData += TcpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if (CurrLength == TcpHeaderLen) {<o:p></o:p></p>
<p class=MsoNormal>-
FullBuffers++;<o:p></o:p></p>
<p class=MsoNormal>-
pLsoData->UsedBuffers = FullBuffers;<o:p></o:p></p>
<p class=MsoNormal>-
*IndexOfData = FullBuffers ;<o:p></o:p></p>
<p class=MsoNormal>-
} else {<o:p></o:p></p>
<p class=MsoNormal>-
pLsoData->UsedBuffers = FullBuffers + 1;<o:p></o:p></p>
<p class=MsoNormal>-
*IndexOfData = FullBuffers - 1;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
pLsoData->FullBuffers = FullBuffers; <o:p></o:p></p>
<p class=MsoNormal>-
if (!IsRegularFlow){<o:p></o:p></p>
<p class=MsoNormal>-
pLsoData->LsoBuffers[0].pData = pLsoData->coppied_data;<o:p></o:p></p>
<p class=MsoNormal>-
pLsoData->LsoBuffers[0].Len = ETH_OFFSET + IpHeaderLen + TcpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(pLsoData->LsoBuffers[0].Len <= LSO_MAX_HEADER);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+ //ASSERT(TcpHeaderLen == 20);<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if (CurrLength < TcpHeaderLen) {<o:p></o:p></p>
<p class=MsoNormal>+
//IPOIB_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Error porcessing
packets\n"));<o:p></o:p></p>
<p class=MsoNormal>+ return status;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ pLsoData->LsoHeaderSize =
pLsoData->LsoHeaderSize + TcpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>+ if(IsRegularFlow){<o:p></o:p></p>
<p class=MsoNormal>+
pLsoData->LsoBuffers[0].Len += TcpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else{<o:p></o:p></p>
<p class=MsoNormal>+
memcpy(pCopiedData, pSrc, TcpHeaderLen);<o:p></o:p></p>
<p class=MsoNormal>+ pCopiedData +=
TcpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ if (CurrLength == TcpHeaderLen) {<o:p></o:p></p>
<p class=MsoNormal>+ FullBuffers++;<o:p></o:p></p>
<p class=MsoNormal>+
pLsoData->UsedBuffers = FullBuffers;<o:p></o:p></p>
<p class=MsoNormal>+ *IndexOfData =
FullBuffers ;<o:p></o:p></p>
<p class=MsoNormal>+ } else {<o:p></o:p></p>
<p class=MsoNormal>+
pLsoData->UsedBuffers = FullBuffers + 1;<o:p></o:p></p>
<p class=MsoNormal>+ *IndexOfData =
FullBuffers - 1;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ pLsoData->FullBuffers = FullBuffers; <o:p></o:p></p>
<p class=MsoNormal>+ if (!IsRegularFlow){<o:p></o:p></p>
<p class=MsoNormal>+
pLsoData->LsoBuffers[0].pData = pLsoData->coppied_data;<o:p></o:p></p>
<p class=MsoNormal>+
pLsoData->LsoBuffers[0].Len = ETH_OFFSET + IpHeaderLen + TcpHeaderLen;<o:p></o:p></p>
<p class=MsoNormal>+
ASSERT(pLsoData->LsoBuffers[0].Len <= LSO_MAX_HEADER);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-static void __port_do_mcast_garbage(ipoib_port_t*
const p_port)<o:p></o:p></p>
<p class=MsoNormal>+static void __port_do_mcast_garbage(ipoib_port_t* const
p_port)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> const mac_addr_t
DEFAULT_MCAST_GROUP = {0x01, 0x00, 0x5E, 0x00, 0x00, 0x01};<o:p></o:p></p>
<p class=MsoNormal>-
/* Do garbage collecting... */<o:p></o:p></p>
<p class=MsoNormal>+ /* Do garbage collecting... */<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_map_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_t
destroy_mc_list;<o:p></o:p></p>
<p class=MsoNormal>-
uint8_t
cnt;<o:p></o:p></p>
<p class=MsoNormal>-
const static GC_MAX_LEAVE_NUM = 80;<o:p></o:p></p>
<p class=MsoNormal>+ cl_map_item_t *p_item;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_endpt_t *p_endpt;<o:p></o:p></p>
<p class=MsoNormal>+ cl_qlist_t
destroy_mc_list;<o:p></o:p></p>
<p class=MsoNormal>+
uint8_t cnt;<o:p></o:p></p>
<p class=MsoNormal>+ const static GC_MAX_LEAVE_NUM = 80;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_init( &destroy_mc_list );<o:p></o:p></p>
<p class=MsoNormal>+ cl_qlist_init( &destroy_mc_list );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
/* Wait for all readers to finish */<o:p></o:p></p>
<p class=MsoNormal>-
while( p_port->endpt_rdr )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>
<p class=MsoNormal>-
while( (p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts ))
&& (cnt < GC_MAX_LEAVE_NUM))<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>
<p class=MsoNormal>-
p_item = cl_qmap_next( p_item );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ /* Wait for all readers to finish */<o:p></o:p></p>
<p class=MsoNormal>+ while( p_port->endpt_rdr )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_lock(
&p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ cnt = 0;<o:p></o:p></p>
<p class=MsoNormal>+ p_item = cl_qmap_head(
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>
<p class=MsoNormal>+ while( (p_item != cl_qmap_end(
&p_port->endpt_mgr.mac_endpts )) && (cnt < GC_MAX_LEAVE_NUM))<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>
<p class=MsoNormal>+ p_item =
cl_qmap_next( p_item );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Check if the current endpoint is not a multicast listener */<o:p></o:p></p>
<p class=MsoNormal>+ /* Check if the
current endpoint is not a multicast listener */<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_endpt->h_mcast && <o:p></o:p></p>
<p class=MsoNormal>-
(!p_endpt->is_mcast_listener) &&<o:p></o:p></p>
<p class=MsoNormal>-
( cl_memcmp( &p_endpt->mac, &DEFAULT_MCAST_GROUP, sizeof(mac_addr_t)
) &&<o:p></o:p></p>
<p class=MsoNormal>-
(!p_endpt->is_in_use) ))<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>
<p class=MsoNormal>-
&p_endpt->mac_item );<o:p></o:p></p>
<p class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>
<p class=MsoNormal>-
&p_endpt->gid_item );<o:p></o:p></p>
<p class=MsoNormal>+ if(
p_endpt->h_mcast && <o:p></o:p></p>
<p class=MsoNormal>+
(!p_endpt->is_mcast_listener) &&<o:p></o:p></p>
<p class=MsoNormal>+
( cl_memcmp( &p_endpt->mac, &DEFAULT_MCAST_GROUP, sizeof(mac_addr_t)
) &&<o:p></o:p></p>
<p class=MsoNormal>+
(!p_endpt->is_in_use) ))<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>
<p class=MsoNormal>+
&p_endpt->mac_item );<o:p></o:p></p>
<p class=MsoNormal>+
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>
<p class=MsoNormal>+
&p_endpt->gid_item );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_endpt->dlid )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>
<p class=MsoNormal>-
&p_endpt->lid_item );<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->dlid = 0;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
if( p_endpt->dlid )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>
<p class=MsoNormal>+
&p_endpt->lid_item );<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->dlid = 0;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_tail(<o:p></o:p></p>
<p class=MsoNormal>-
&destroy_mc_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>
<p class=MsoNormal>-
cnt++;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->is_in_use = FALSE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_tail(<o:p></o:p></p>
<p class=MsoNormal>+
&destroy_mc_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>
<p class=MsoNormal>+
cnt++;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->is_in_use = FALSE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_unlock( &p_port->obj );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* Destroy all multicast endpoints now that we have released the lock. */<o:p></o:p></p>
<p class=MsoNormal>-
while( cl_qlist_count( &destroy_mc_list ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt = PARENT_STRUCT( cl_qlist_remove_head( &destroy_mc_list ),<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_endpt_t, mac_item.pool_item.list_item );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>-
("mcast garbage collector: destroying endpoint
%02x:%02x:%02x:%02x:%02x:%02x \n", <o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->mac.addr[0],<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->mac.addr[2],<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->mac.addr[4],<o:p></o:p></p>
<p class=MsoNormal>-
p_endpt->mac.addr[5]) );<o:p></o:p></p>
<p class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ /* Destroy all multicast endpoints now
that we have released the lock. */<o:p></o:p></p>
<p class=MsoNormal>+ while( cl_qlist_count(
&destroy_mc_list ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_endpt =
PARENT_STRUCT( cl_qlist_remove_head( &destroy_mc_list ),<o:p></o:p></p>
<p class=MsoNormal>+
ipoib_endpt_t, mac_item.pool_item.list_item );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>
<p class=MsoNormal>+
("mcast garbage collector: destroying endpoint %02x:%02x:%02x:%02x:%02x:%02x
\n", <o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->mac.addr[0],<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->mac.addr[1],<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->mac.addr[2],<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->mac.addr[3],<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->mac.addr[4],<o:p></o:p></p>
<p class=MsoNormal>+
p_endpt->mac.addr[5]) );<o:p></o:p></p>
<p class=MsoNormal>+ cl_obj_destroy(
&p_endpt->obj );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void __port_mcast_garbage_dpc(KDPC
*p_gc_dpc,void *context,void *s_arg1, void *s_arg2)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_port_t *p_port = (ipoib_port_t *) context;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_port_t *p_port = (ipoib_port_t *)
context;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
UNREFERENCED_PARAMETER(p_gc_dpc);<o:p></o:p></p>
<p class=MsoNormal>-
UNREFERENCED_PARAMETER(s_arg1);<o:p></o:p></p>
<p class=MsoNormal>-
UNREFERENCED_PARAMETER(s_arg2);<o:p></o:p></p>
<p class=MsoNormal>+ UNREFERENCED_PARAMETER(p_gc_dpc);<o:p></o:p></p>
<p class=MsoNormal>+ UNREFERENCED_PARAMETER(s_arg1);<o:p></o:p></p>
<p class=MsoNormal>+ UNREFERENCED_PARAMETER(s_arg2);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
__port_do_mcast_garbage(p_port);<o:p></o:p></p>
<p class=MsoNormal>+ __port_do_mcast_garbage(p_port);<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> ipoib_endpt_t*<o:p></o:p></p>
<p class=MsoNormal> ipoib_endpt_get_by_gid(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const ib_gid_t*
const
p_gid )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ib_gid_t*
const
p_gid )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
return __endpt_mgr_get_by_gid( p_port, p_gid );<o:p></o:p></p>
<p class=MsoNormal>+ return __endpt_mgr_get_by_gid( p_port,
p_gid );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> ipoib_endpt_t*<o:p></o:p></p>
<p class=MsoNormal> ipoib_endpt_get_by_lid(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const
net16_t
lid )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const
net16_t
lid )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
return __endpt_mgr_get_by_lid( p_port, lid );<o:p></o:p></p>
<p class=MsoNormal>+ return __endpt_mgr_get_by_lid( p_port,
lid );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> ib_api_status_t<o:p></o:p></p>
<p class=MsoNormal> ipoib_recv_dhcp(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></p>
<p class=MsoNormal>-
OUT
eth_pkt_t*
const
p_eth,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_src,<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_endpt_t* const
p_dst )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+ IN
const ipoib_pkt_t* const
p_ipoib,<o:p></o:p></p>
<p class=MsoNormal>+
OUT eth_pkt_t*
const p_eth,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_src,<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_endpt_t* const p_dst )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
return __recv_dhcp(<o:p></o:p></p>
<p class=MsoNormal>-
p_port, p_ipoib, p_eth, p_src,p_dst );<o:p></o:p></p>
<p class=MsoNormal>+ return __recv_dhcp(<o:p></o:p></p>
<p class=MsoNormal>+ p_port, p_ipoib,
p_eth, p_src,p_dst );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> void<o:p></o:p></p>
<p class=MsoNormal> ipoib_port_cancel_xmit(<o:p></o:p></p>
<p class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-
IN
PVOID
cancel_id )<o:p></o:p></p>
<p class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></p>
<p class=MsoNormal>+
IN
PVOID
cancel_id )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
cl_list_item_t
*p_item, *p_next;<o:p></o:p></p>
<p class=MsoNormal>-
ipoib_send_NB_SG *s_buf;<o:p></o:p></p>
<p class=MsoNormal>-
PVOID
nbl_id;<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_t
cancel_list;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+
cl_list_item_t *p_item, *p_next;<o:p></o:p></p>
<p class=MsoNormal>+ ipoib_send_NB_SG
*s_buf;<o:p></o:p></p>
<p class=MsoNormal>+
PVOID nbl_id;<o:p></o:p></p>
<p class=MsoNormal>+ cl_qlist_t
cancel_list;<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_init( &cancel_list );<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT(FALSE); //TODO ???????????????? Do we reach here ????????????<o:p></o:p></p>
<p class=MsoNormal>+ cl_qlist_init( &cancel_list );<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ ASSERT(FALSE); //TODO ????????????????
Do we reach here ????????????<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
for( p_item = cl_qlist_head( &p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class=MsoNormal>-
p_item != cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class=MsoNormal>-
p_item = p_next )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_next = cl_qlist_next( p_item );<o:p></o:p></p>
<p class=MsoNormal>-
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></p>
<p class=MsoNormal>-
nbl_id = NDIS_GET_NET_BUFFER_LIST_CANCEL_ID( s_buf->p_nbl );<o:p></o:p></p>
<p class=MsoNormal>-
if( nbl_id == cancel_id )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_remove_item( &p_port->send_mgr.pending_list, p_item );<o:p></o:p></p>
<p class=MsoNormal>-
NET_BUFFER_LIST_STATUS( s_buf->p_nbl) = NDIS_STATUS_REQUEST_ABORTED ;<o:p></o:p></p>
<p class=MsoNormal>-
cl_qlist_insert_tail( &cancel_list, (cl_list_item_t *) s_buf );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal>+ for( p_item = cl_qlist_head(
&p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class=MsoNormal>+ p_item !=
cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></p>
<p class=MsoNormal>+ p_item = p_next
)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_next =
cl_qlist_next( p_item );<o:p></o:p></p>
<p class=MsoNormal>+ s_buf =
(ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></p>
<p class=MsoNormal>+ nbl_id =
NDIS_GET_NET_BUFFER_LIST_CANCEL_ID( s_buf->p_nbl );<o:p></o:p></p>
<p class=MsoNormal>+ if( nbl_id ==
cancel_id )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_remove_item( &p_port->send_mgr.pending_list, p_item );<o:p></o:p></p>
<p class=MsoNormal>+
NET_BUFFER_LIST_STATUS( s_buf->p_nbl) = NDIS_STATUS_REQUEST_ABORTED ;<o:p></o:p></p>
<p class=MsoNormal>+
cl_qlist_insert_tail( &cancel_list, (cl_list_item_t *) s_buf );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( cl_qlist_count( &cancel_list ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
while( ( p_item = cl_qlist_remove_head( &cancel_list )) <o:p></o:p></p>
<p class=MsoNormal>-
!= cl_qlist_end( &cancel_list ))<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item;<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></p>
<p class=MsoNormal>+ if( cl_qlist_count( &cancel_list ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ while( ( p_item
= cl_qlist_remove_head( &cancel_list )) <o:p></o:p></p>
<p class=MsoNormal>+
!= cl_qlist_end( &cancel_list ))<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item;<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
//TODO don't use DISPATCH LEVEL<o:p></o:p></p>
<p class=MsoNormal>-
__send_complete_net_buffer(<o:p></o:p></p>
<p class=MsoNormal>-
s_buf, NDIS_STATUS_SEND_ABORTED ,NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL,
TRUE);<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
//TODO don't use DISPATCH LEVEL<o:p></o:p></p>
<p class=MsoNormal>+
__send_complete_net_buffer(<o:p></o:p></p>
<p class=MsoNormal>+
s_buf, NDIS_STATUS_SEND_ABORTED ,NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL,
TRUE);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> /* <o:p></o:p></p>
<p class=MsoNormal>@@ -8215,305 +8262,305 @@<o:p></o:p></p>
<p class=MsoNormal> #if 0<o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_fragments(<o:p></o:p></p>
<p class=MsoNormal>-IN
ipoib_port_t*
const
p_port,<o:p></o:p></p>
<p class=MsoNormal>-IN
ipoib_send_desc_t* const
p_desc,<o:p></o:p></p>
<p class=MsoNormal>-IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>-IN
ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>-IN
uint32_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>-IN
NDIS_BUFFER*
p_ndis_buf )<o:p></o:p></p>
<p class=MsoNormal>+IN ipoib_port_t*
const p_port,<o:p></o:p></p>
<p class=MsoNormal>+IN ipoib_send_desc_t*
const p_desc,<o:p></o:p></p>
<p class=MsoNormal>+IN eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></p>
<p class=MsoNormal>+IN ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>+IN
uint32_t
buf_len,<o:p></o:p></p>
<p class=MsoNormal>+IN
NDIS_BUFFER*
p_ndis_buf )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
ds_idx = 1;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
wr_idx = 0;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
sgl_idx = 2; //skip eth hdr, ip hdr<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
options_len = 0;<o:p></o:p></p>
<p class=MsoNormal>-
uint8_t*
p_options = NULL;<o:p></o:p></p>
<p class=MsoNormal>-
uint8_t*
p_buf;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
frag_offset = 0;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
next_sge;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
wr_size = 0;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
ip_hdr_len = IP_HEADER_LENGTH( p_ip_hdr );<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
total_ip_len = cl_ntoh16( p_ip_hdr->length );<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t ds_idx = 1;<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t wr_idx = 0;<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t sgl_idx = 2;
//skip eth hdr, ip hdr<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t options_len =
0;<o:p></o:p></p>
<p class=MsoNormal>+ uint8_t* p_options =
NULL;<o:p></o:p></p>
<p class=MsoNormal>+ uint8_t* p_buf;<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t frag_offset =
0;<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t next_sge;<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t wr_size = 0;<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t ip_hdr_len =
IP_HEADER_LENGTH( p_ip_hdr );<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t total_ip_len
= cl_ntoh16( p_ip_hdr->length );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
SCATTER_GATHER_LIST
*p_sgl;<o:p></o:p></p>
<p class=MsoNormal>+
SCATTER_GATHER_LIST *p_sgl;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( IP_DONT_FRAGMENT(p_ip_hdr) )<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
p_sgl = NDIS_PER_PACKET_INFO_FROM_PACKET( p_desc->p_pkt,
ScatterGatherListPacketInfo );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_sgl )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
ASSERT( p_sgl );<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to get SGL from packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if( ( p_sgl->NumberOfElements > MAX_SEND_SGE ||<o:p></o:p></p>
<p class=MsoNormal>-
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Too many SG Elements in packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
p_buf = (uint8_t *)<o:p></o:p></p>
<p class=MsoNormal>-
ExAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_buf )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to allocate lookaside buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
s_buf->p_send_buf = (send_buf_t*)p_buf;<o:p></o:p></p>
<p class=MsoNormal>+ if( IP_DONT_FRAGMENT(p_ip_hdr) )<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ p_sgl =
NDIS_PER_PACKET_INFO_FROM_PACKET( p_desc->p_pkt, ScatterGatherListPacketInfo
);<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_sgl )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ ASSERT( p_sgl );<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to get SGL from packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ if( ( p_sgl->NumberOfElements >
MAX_SEND_SGE ||<o:p></o:p></p>
<p class=MsoNormal>+
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Too many SG Elements in packet.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ p_buf = (uint8_t *)<o:p></o:p></p>
<p class=MsoNormal>+
ExAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_buf )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to allocate lookaside buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ s_buf->p_send_buf =
(send_buf_t*)p_buf;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( buf_len < ip_hdr_len )<o:p></o:p></p>
<p class=MsoNormal>-
{ /*
ip options in a separate buffer */<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( buf_len == sizeof( ip_hdr_t ) );<o:p></o:p></p>
<p class=MsoNormal>-
NdisGetNextBuffer( p_ndis_buf, &p_ndis_buf );<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_ndis_buf )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to get IP options buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
NdisQueryBufferSafe( p_ndis_buf, &p_options, &options_len, NormalPagePriority
);<o:p></o:p></p>
<p class=MsoNormal>-
if( !p_options )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>-
("Failed to query IP options buffer address.\n") );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_options && options_len )<o:p></o:p></p>
<p class=MsoNormal>-
{ <o:p></o:p></p>
<p class=MsoNormal>-
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></p>
<p class=MsoNormal>-
p_options, options_len, TRUE );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
wr_size = buf_len + options_len;<o:p></o:p></p>
<p class=MsoNormal>-
sgl_idx++;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{
/*options probably in the same buffer */<o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( p_buf, p_ip_hdr, buf_len );<o:p></o:p></p>
<p class=MsoNormal>-
options_len = ip_hdr_len - sizeof( ip_hdr_t );<o:p></o:p></p>
<p class=MsoNormal>-
if( options_len )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_options = p_buf + sizeof( ip_hdr_t );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
frag_offset += ( buf_len - ip_hdr_len );<o:p></o:p></p>
<p class=MsoNormal>-
wr_size = buf_len;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+ if( buf_len < ip_hdr_len )<o:p></o:p></p>
<p class=MsoNormal>+ { /* ip options in a
separate buffer */<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT(
buf_len == sizeof( ip_hdr_t ) );<o:p></o:p></p>
<p class=MsoNormal>+
NdisGetNextBuffer( p_ndis_buf, &p_ndis_buf );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_ndis_buf
)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to get IP options buffer.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+
NdisQueryBufferSafe( p_ndis_buf, &p_options, &options_len,
NormalPagePriority );<o:p></o:p></p>
<p class=MsoNormal>+ if( !p_options )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+
("Failed to query IP options buffer address.\n") );<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy(
p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></p>
<p class=MsoNormal>+ if( p_options
&& options_len )<o:p></o:p></p>
<p class=MsoNormal>+ { <o:p></o:p></p>
<p class=MsoNormal>+
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></p>
<p class=MsoNormal>+
p_options, options_len, TRUE );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ wr_size =
buf_len + options_len;<o:p></o:p></p>
<p class=MsoNormal>+ sgl_idx++;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ { /*options probably in the
same buffer */<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy( p_buf,
p_ip_hdr, buf_len );<o:p></o:p></p>
<p class=MsoNormal>+ options_len =
ip_hdr_len - sizeof( ip_hdr_t );<o:p></o:p></p>
<p class=MsoNormal>+ if( options_len
)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_options = p_buf + sizeof( ip_hdr_t );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ frag_offset += (
buf_len - ip_hdr_len );<o:p></o:p></p>
<p class=MsoNormal>+ wr_size = buf_len;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = wr_size;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
/* count how much data can be put into the first WR beside IP header.<o:p></o:p></p>
<p class=MsoNormal>-
* other protocols headers possibly supplied in subsequent buffers.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
for( sgl_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++ )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
next_sge = p_sgl->Elements[sgl_idx].Length;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = wr_size;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ /* count how much data can be put into
the first WR beside IP header.<o:p></o:p></p>
<p class=MsoNormal>+ * other protocols headers possibly
supplied in subsequent buffers.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ for( sgl_idx; sgl_idx <
p_sgl->NumberOfElements; sgl_idx++ )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ next_sge =
p_sgl->Elements[sgl_idx].Length;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* add sgl if it can fit into the same WR <o:p></o:p></p>
<p class=MsoNormal>-
* Note: so far not going to split large SGE between WRs,<o:p></o:p></p>
<p class=MsoNormal>-
* so first fragment could be a smaller size.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
if( next_sge <= ( p_port->p_adapter->params.payload_mtu - wr_size ) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
++ds_idx;<o:p></o:p></p>
<p class=MsoNormal>-
wr_size += next_sge;<o:p></o:p></p>
<p class=MsoNormal>-
frag_offset += next_sge;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = <o:p></o:p></p>
<p class=MsoNormal>-
p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = next_sge;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* fix ip hdr for the first fragment and move on */<o:p></o:p></p>
<p class=MsoNormal>-
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf,<o:p></o:p></p>
<p class=MsoNormal>-
(uint16_t)wr_size, IP_FRAGMENT_OFFSET(p_ip_hdr), TRUE );<o:p></o:p></p>
<p class=MsoNormal>+ /* add sgl if it
can fit into the same WR <o:p></o:p></p>
<p class=MsoNormal>+ * Note: so far
not going to split large SGE between WRs,<o:p></o:p></p>
<p class=MsoNormal>+ * so first
fragment could be a smaller size.<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ if( next_sge
<= ( p_port->p_adapter->params.payload_mtu - wr_size ) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
++ds_idx;<o:p></o:p></p>
<p class=MsoNormal>+
wr_size += next_sge;<o:p></o:p></p>
<p class=MsoNormal>+
frag_offset += next_sge;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = <o:p></o:p></p>
<p class=MsoNormal>+
p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = next_sge;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
/* fix ip hdr for the first fragment and move on */<o:p></o:p></p>
<p class=MsoNormal>+
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf,<o:p></o:p></p>
<p class=MsoNormal>+
(uint16_t)wr_size, IP_FRAGMENT_OFFSET(p_ip_hdr), TRUE );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx + 1;<o:p></o:p></p>
<p class=MsoNormal>-
p_buf += ip_hdr_len;<o:p></o:p></p>
<p class=MsoNormal>-
p_buf += (( buf_len > ip_hdr_len ) ? ( buf_len - ip_hdr_len ): 0);<o:p></o:p></p>
<p class=MsoNormal>-
frag_offset += ( (IP_FRAGMENT_OFFSET(p_ip_hdr)) << 3 );<o:p></o:p></p>
<p class=MsoNormal>-
++wr_idx;<o:p></o:p></p>
<p class=MsoNormal>-
ds_idx = 0;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
total_ip_len -= wr_size;<o:p></o:p></p>
<p class=MsoNormal>-
wr_size = 0;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx + 1;<o:p></o:p></p>
<p class=MsoNormal>+
p_buf += ip_hdr_len;<o:p></o:p></p>
<p class=MsoNormal>+
p_buf += (( buf_len > ip_hdr_len ) ? ( buf_len - ip_hdr_len ): 0);<o:p></o:p></p>
<p class=MsoNormal>+
frag_offset += ( (IP_FRAGMENT_OFFSET(p_ip_hdr)) << 3 );<o:p></o:p></p>
<p class=MsoNormal>+
++wr_idx;<o:p></o:p></p>
<p class=MsoNormal>+
ds_idx = 0;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ total_ip_len -= wr_size;<o:p></o:p></p>
<p class=MsoNormal>+ wr_size = 0;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
for( sgl_idx, wr_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++ )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
seg_len;<o:p></o:p></p>
<p class=MsoNormal>-
uint64_t
next_sgl_addr;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
if( wr_idx >= ( MAX_WRS_PER_MSG - 1 ) )<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
next_sge = p_sgl->Elements[sgl_idx].Length;<o:p></o:p></p>
<p class=MsoNormal>-
next_sgl_addr = p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></p>
<p class=MsoNormal>+ for( sgl_idx, wr_idx; sgl_idx <
p_sgl->NumberOfElements; sgl_idx++ )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
uint32_t seg_len;<o:p></o:p></p>
<p class=MsoNormal>+
uint64_t next_sgl_addr;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if( wr_idx >=
( MAX_WRS_PER_MSG - 1 ) )<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ next_sge =
p_sgl->Elements[sgl_idx].Length;<o:p></o:p></p>
<p class=MsoNormal>+ next_sgl_addr =
p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
while( next_sge )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
if( ds_idx == 0 )<o:p></o:p></p>
<p class=MsoNormal>-
{
/* new ipoib + ip header */<o:p></o:p></p>
<p class=MsoNormal>-
((ipoib_hdr_t*)p_buf)->type = p_eth_hdr->type;<o:p></o:p></p>
<p class=MsoNormal>-
((ipoib_hdr_t*)p_buf)->resv = 0;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = sizeof( ipoib_hdr_t );<o:p></o:p></p>
<p class=MsoNormal>-
p_buf += sizeof( ipoib_hdr_t );<o:p></o:p></p>
<p class=MsoNormal>-
++ds_idx;<o:p></o:p></p>
<p class=MsoNormal>+ while( next_sge
)<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
if( ds_idx == 0 )<o:p></o:p></p>
<p class=MsoNormal>+
{ /* new ipoib + ip header */<o:p></o:p></p>
<p class=MsoNormal>+
((ipoib_hdr_t*)p_buf)->type = p_eth_hdr->type;<o:p></o:p></p>
<p class=MsoNormal>+
((ipoib_hdr_t*)p_buf)->resv = 0;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = sizeof( ipoib_hdr_t );<o:p></o:p></p>
<p class=MsoNormal>+
p_buf += sizeof( ipoib_hdr_t );<o:p></o:p></p>
<p class=MsoNormal>+
++ds_idx;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></p>
<p class=MsoNormal>-
if( p_options && options_len )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
/* copy ip options if needed */<o:p></o:p></p>
<p class=MsoNormal>-
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></p>
<p class=MsoNormal>-
p_options, options_len, FALSE );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
wr_size = ip_hdr_len;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if( ds_idx == 1 )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = ip_hdr_len;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
++ds_idx;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>+
cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></p>
<p class=MsoNormal>+
if( p_options && options_len )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
/* copy ip options if needed */<o:p></o:p></p>
<p class=MsoNormal>+
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></p>
<p class=MsoNormal>+
p_options, options_len, FALSE );<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
wr_size = ip_hdr_len;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
if( ds_idx == 1 )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = ip_hdr_len;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+
++ds_idx;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
seg_len = ( next_sge > ( p_port->p_adapter->params.payload_mtu -
wr_size ) )?<o:p></o:p></p>
<p class=MsoNormal>-
( p_port->p_adapter->params.payload_mtu - wr_size ) : next_sge;<o:p></o:p></p>
<p class=MsoNormal>+
seg_len = ( next_sge > ( p_port->p_adapter->params.payload_mtu -
wr_size ) )?<o:p></o:p></p>
<p class=MsoNormal>+
( p_port->p_adapter->params.payload_mtu - wr_size ) : next_sge;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = next_sgl_addr;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = seg_len;<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>-
++ds_idx;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
wr_size += seg_len;<o:p></o:p></p>
<p class=MsoNormal>-
total_ip_len -= seg_len;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = next_sgl_addr;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = seg_len;<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>
<p class=MsoNormal>+
++ds_idx;<o:p></o:p></p>
<p class=MsoNormal>+
<o:p></o:p></p>
<p class=MsoNormal>+
wr_size += seg_len;<o:p></o:p></p>
<p class=MsoNormal>+
total_ip_len -= seg_len;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( wr_size >= p_port->p_adapter->params.payload_mtu || total_ip_len
== 0 )<o:p></o:p></p>
<p class=MsoNormal>-
{
/* fix ip hdr for that fragment */<o:p></o:p></p>
<p class=MsoNormal>-
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf, (uint16_t)wr_size,<o:p></o:p></p>
<p class=MsoNormal>-
((uint16_t)(frag_offset >> 3 )), <o:p></o:p></p>
<p class=MsoNormal>-
(BOOLEAN)(( total_ip_len > 0 ) || IP_MORE_FRAGMENTS( p_ip_hdr)) );<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx;<o:p></o:p></p>
<p class=MsoNormal>-
if( total_ip_len > 0 )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
++wr_idx;<o:p></o:p></p>
<p class=MsoNormal>-
frag_offset += (wr_size - ip_hdr_len);<o:p></o:p></p>
<p class=MsoNormal>-
wr_size = 0;<o:p></o:p></p>
<p class=MsoNormal>-
ds_idx = 0;<o:p></o:p></p>
<p class=MsoNormal>-
p_buf += ip_hdr_len;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
next_sge -= seg_len;<o:p></o:p></p>
<p class=MsoNormal>-
if( next_sge > 0 )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
next_sgl_addr += seg_len;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
p_desc->num_wrs += wr_idx;<o:p></o:p></p>
<p class=MsoNormal>-
<o:p></o:p></p>
<p class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal>+
if( wr_size >= p_port->p_adapter->params.payload_mtu || total_ip_len
== 0 )<o:p></o:p></p>
<p class=MsoNormal>+
{ /* fix ip hdr for that fragment */<o:p></o:p></p>
<p class=MsoNormal>+
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf, (uint16_t)wr_size,<o:p></o:p></p>
<p class=MsoNormal>+
((uint16_t)(frag_offset >> 3 )), <o:p></o:p></p>
<p class=MsoNormal>+
(BOOLEAN)(( total_ip_len > 0 ) || IP_MORE_FRAGMENTS( p_ip_hdr)) );<o:p></o:p></p>
<p class=MsoNormal>+
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx;<o:p></o:p></p>
<p class=MsoNormal>+
if( total_ip_len > 0 )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
++wr_idx;<o:p></o:p></p>
<p class=MsoNormal>+
frag_offset += (wr_size - ip_hdr_len);<o:p></o:p></p>
<p class=MsoNormal>+
wr_size = 0;<o:p></o:p></p>
<p class=MsoNormal>+
ds_idx = 0;<o:p></o:p></p>
<p class=MsoNormal>+
p_buf += ip_hdr_len;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+
next_sge -= seg_len;<o:p></o:p></p>
<p class=MsoNormal>+
if( next_sge > 0 )<o:p></o:p></p>
<p class=MsoNormal>+
{<o:p></o:p></p>
<p class=MsoNormal>+
next_sgl_addr += seg_len;<o:p></o:p></p>
<p class=MsoNormal>+
}<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ p_desc->num_wrs += wr_idx;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>
<p class=MsoNormal>+ return NDIS_STATUS_SUCCESS;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __update_fragment_ip_hdr(<o:p></o:p></p>
<p class=MsoNormal>-IN
ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>-IN
uint16_t
fragment_size, <o:p></o:p></p>
<p class=MsoNormal>-IN
uint16_t
fragment_offset, <o:p></o:p></p>
<p class=MsoNormal>-IN
BOOLEAN
more_fragments )<o:p></o:p></p>
<p class=MsoNormal>+IN ip_hdr_t*
const p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>+IN
uint16_t fragment_size,
<o:p></o:p></p>
<p class=MsoNormal>+IN
uint16_t
fragment_offset, <o:p></o:p></p>
<p class=MsoNormal>+IN
BOOLEAN
more_fragments )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
uint16_t*
p_hdr = (uint16_t*)p_ip_hdr;<o:p></o:p></p>
<p class=MsoNormal>-
p_ip_hdr->length = cl_hton16( fragment_size ); // bytes<o:p></o:p></p>
<p class=MsoNormal>-
p_ip_hdr->offset = cl_hton16( fragment_offset ); // 8-byte units<o:p></o:p></p>
<p class=MsoNormal>-
if( more_fragments )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IP_SET_MORE_FRAGMENTS( p_ip_hdr );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
else<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
IP_SET_LAST_FRAGMENT( p_ip_hdr );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
p_ip_hdr->chksum = 0;<o:p></o:p></p>
<p class=MsoNormal>-
p_ip_hdr->chksum = ipchksum( p_hdr, IP_HEADER_LENGTH(p_ip_hdr) );<o:p></o:p></p>
<p class=MsoNormal>+ uint16_t* p_hdr =
(uint16_t*)p_ip_hdr;<o:p></o:p></p>
<p class=MsoNormal>+ p_ip_hdr->length = cl_hton16(
fragment_size ); // bytes<o:p></o:p></p>
<p class=MsoNormal>+ p_ip_hdr->offset = cl_hton16(
fragment_offset ); // 8-byte units<o:p></o:p></p>
<p class=MsoNormal>+ if( more_fragments )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IP_SET_MORE_FRAGMENTS( p_ip_hdr );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
IP_SET_LAST_FRAGMENT( p_ip_hdr );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ p_ip_hdr->chksum = 0;<o:p></o:p></p>
<p class=MsoNormal>+ p_ip_hdr->chksum = ipchksum( p_hdr,
IP_HEADER_LENGTH(p_ip_hdr) );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static void<o:p></o:p></p>
<p class=MsoNormal> __copy_ip_options(<o:p></o:p></p>
<p class=MsoNormal>-IN
uint8_t*
p_buf,<o:p></o:p></p>
<p class=MsoNormal>-IN
uint8_t*
p_options,<o:p></o:p></p>
<p class=MsoNormal>-IN
uint32_t
options_len,<o:p></o:p></p>
<p class=MsoNormal>-IN
BOOLEAN
copy_all )<o:p></o:p></p>
<p class=MsoNormal>+IN uint8_t*
p_buf,<o:p></o:p></p>
<p class=MsoNormal>+IN uint8_t*
p_options,<o:p></o:p></p>
<p class=MsoNormal>+IN uint32_t
options_len,<o:p></o:p></p>
<p class=MsoNormal>+IN BOOLEAN
copy_all )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
option_length;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
total_length = 0;<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t
copied_length = 0;<o:p></o:p></p>
<p class=MsoNormal>-
uint8_t*
p_src = p_options;<o:p></o:p></p>
<p class=MsoNormal>-
uint8_t*
p_dst = p_buf;<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t
option_length;<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t total_length
= 0;<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t copied_length
= 0;<o:p></o:p></p>
<p class=MsoNormal>+ uint8_t* p_src =
p_options;<o:p></o:p></p>
<p class=MsoNormal>+ uint8_t* p_dst =
p_buf;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( p_options == NULL || options_len == 0 )<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
if( copy_all )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( p_dst, p_src, options_len );<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
do<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
if( ( *p_src ) == 0 ) // end of options list<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
total_length++;<o:p></o:p></p>
<p class=MsoNormal>-
break;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
if( ( *p_src ) == 0x1 ) // no op<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
p_src++;<o:p></o:p></p>
<p class=MsoNormal>-
total_length++;<o:p></o:p></p>
<p class=MsoNormal>-
continue;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
/*from RFC791: <o:p></o:p></p>
<p class=MsoNormal>-
* This option may be used between options, for example, to align<o:p></o:p></p>
<p class=MsoNormal>+ if( p_options == NULL || options_len ==
0 )<o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal>+ if( copy_all )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy(
p_dst, p_src, options_len );<o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ do<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ if( ( *p_src )
== 0 ) // end of options list<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
total_length++;<o:p></o:p></p>
<p class=MsoNormal>+
break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ if( ( *p_src )
== 0x1 ) // no op<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
p_src++;<o:p></o:p></p>
<p class=MsoNormal>+
total_length++;<o:p></o:p></p>
<p class=MsoNormal>+
continue;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ /*from RFC791: <o:p></o:p></p>
<p class=MsoNormal>+ * This option
may be used between options, for example, to align<o:p></o:p></p>
<p class=MsoNormal> * the beginning
of a subsequent option on a 32 bit boundary.<o:p></o:p></p>
<p class=MsoNormal>-
*/<o:p></o:p></p>
<p class=MsoNormal>-
if( copied_length && (copied_length % 4) )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
uint32_t align = 4 - (copied_length % 4);<o:p></o:p></p>
<p class=MsoNormal>-
cl_memset( p_dst, 0x1, (size_t)align );<o:p></o:p></p>
<p class=MsoNormal>-
p_dst += align;<o:p></o:p></p>
<p class=MsoNormal>-
copied_length += align;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
option_length = *(p_src + 1);<o:p></o:p></p>
<p class=MsoNormal>+ */<o:p></o:p></p>
<p class=MsoNormal>+ if(
copied_length && (copied_length % 4) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
uint32_t align = 4 - (copied_length % 4);<o:p></o:p></p>
<p class=MsoNormal>+
cl_memset( p_dst, 0x1, (size_t)align );<o:p></o:p></p>
<p class=MsoNormal>+
p_dst += align;<o:p></o:p></p>
<p class=MsoNormal>+
copied_length += align;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ option_length =
*(p_src + 1);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
if( *p_src & 0x80 )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_memcpy( p_dst, p_src, option_length );<o:p></o:p></p>
<p class=MsoNormal>-
p_dst += option_length;<o:p></o:p></p>
<p class=MsoNormal>-
copied_length += option_length;<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
total_length += option_length;<o:p></o:p></p>
<p class=MsoNormal>-
p_src += option_length;<o:p></o:p></p>
<p class=MsoNormal>+ if( *p_src &
0x80 )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+
cl_memcpy( p_dst, p_src, option_length );<o:p></o:p></p>
<p class=MsoNormal>+
p_dst += option_length;<o:p></o:p></p>
<p class=MsoNormal>+
copied_length += option_length;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ total_length +=
option_length;<o:p></o:p></p>
<p class=MsoNormal>+ p_src +=
option_length;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
}while( total_length < options_len );<o:p></o:p></p>
<p class=MsoNormal>+ }while( total_length < options_len );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( total_length == options_len );<o:p></o:p></p>
<p class=MsoNormal>-
CL_ASSERT( copied_length <= 40 );<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( total_length == options_len
);<o:p></o:p></p>
<p class=MsoNormal>+ CL_ASSERT( copied_length <= 40 );<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
/* padding the rest */<o:p></o:p></p>
<p class=MsoNormal>-
if( options_len > copied_length )<o:p></o:p></p>
<p class=MsoNormal>-
{<o:p></o:p></p>
<p class=MsoNormal>-
cl_memclr( p_dst, ( options_len - copied_length ) );<o:p></o:p></p>
<p class=MsoNormal>-
}<o:p></o:p></p>
<p class=MsoNormal>-
return;<o:p></o:p></p>
<p class=MsoNormal>+ /* padding the rest */<o:p></o:p></p>
<p class=MsoNormal>+ if( options_len > copied_length )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_memclr(
p_dst, ( options_len - copied_length ) );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ return;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> #endif<o:p></o:p></p>
<p class=MsoNormal>Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h<o:p></o:p></p>
<p class=MsoNormal>===================================================================<o:p></o:p></p>
<p class=MsoNormal>---
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h (revision 6314)<o:p></o:p></p>
<p class=MsoNormal>+++ ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h (working
copy)<o:p></o:p></p>
<p class=MsoNormal>@@ -607,8 +607,6 @@<o:p></o:p></p>
<p class=MsoNormal>
ipoib_send_mgr_t
send_mgr;<o:p></o:p></p>
<p class=MsoNormal>
ipoib_send_desc_t
*
p_desc;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-
KDPC
recv_dpc;<o:p></o:p></p>
<p class=MsoNormal>-<o:p></o:p></p>
<p class=MsoNormal>
ipoib_endpt_mgr_t
endpt_mgr;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>
endpt_buf_mgr_t
cm_buf_mgr;<o:p></o:p></p>
<p class=MsoNormal>@@ -629,6 +627,7 @@<o:p></o:p></p>
<p class=MsoNormal>
uint32_t
bc_join_retry_cnt;<o:p></o:p></p>
<p class=MsoNormal>
ib_net16_t
base_lid;<o:p></o:p></p>
<p class=MsoNormal>
LONG
n_no_progress;<o:p></o:p></p>
<p class=MsoNormal>+
PIO_WORKITEM
pPoWorkItem;<o:p></o:p></p>
<p class=MsoNormal>
ipoib_hdr_t
hdr[1]; /* Must be last! */<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> }
ipoib_port_t;<o:p></o:p></p>
</div>
</body>
</html>