--- /dev/null
+<?
+
+/**********************************************************************
+ * Copyright (C) 2010
+ *
+ * Douglas Schilling Landgraf <dougsland@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Version: 0.0.1
+ *
+ * Description:
+ * This is a quick hack to parse logs from the usbsnoop (usb sniffer)
+ *
+ * Settings:
+ * If needed to process a huge log maybe is needed to increase
+ * the php settings.
+ *
+ * $ vi /etc/php.ini
+ * memory_limit = xxM
+ *
+ * Usage:
+ * $ php ./usb_snoop ./Usbsnoop > output.txt
+ *
+ * Example:
+ *
+ * 009279: 002309 ms 126080 ms c0 0e a0 00 00 00 01 00 <<< 00
+ * 009280: 000007 ms 126087 ms c0 10 a0 00 00 00 01 00 <<< 00
+ * 009281: 000005 ms 126092 ms 40 0e a0 00 00 00 01 00 >>> 99
+ * 009282: 000107 ms 126199 ms c0 0e a0 00 01 00 01 00 <<< 99
+ * 009283: 000015 ms 126214 ms c0 0e a0 00 10 00 01 00 <<< 99
+ * 009284: 000004 ms 126218 ms 40 10 a0 00 00 00 01 00 >>> 00
+ * 009285: 000004 ms 126222 ms 40 0e a0 00 00 00 01 00 >>> 00
+ *
+ ***********************************************************************/
+
+function removeNL($var) {
+
+ $newstr = str_replace("\n", "", $var);
+ return $newstr;
+}
+
+function removeZeros($var) {
+
+ /* Removing 00000000 */
+ $remZeros = strstr($var, ": ");
+
+ /* Removing : */
+ $remNewLine = str_replace(": ", "", $remZeros);
+
+ /* Removing \n */
+ $newstr = removeNL($remNewLine);
+
+ return $newstr;
+}
+
+/* Main */
+
+ $i = 0;
+ $j = 0;
+ $oldTime = 0;
+ $direction = "";
+ $ctrlCmds = "";
+
+
+ if ($argc < 2) {
+ printf("Usage: $argv[0] usbsnoop-log.txt\n");
+ exit;
+ }
+
+ $file = fopen($argv[1], "r") or exit("Unable to open file!\n");
+
+ /* Copying to a temp. buffer */
+ while(!feof($file))
+ {
+ $arrayFile[$i] = fgets($file);
+ $i++;
+ }
+
+ while($j < $i) {
+
+ /* Next position */
+ $j = $j + 1;
+
+ if(!isset($arrayFile[$j])) {
+ break;
+ }
+
+ $str = removeNL($arrayFile[$j]);
+
+ $pieces = explode(" ", $str);
+ /* Defining URB */
+ if (((strstr($str, "<<<")) || (strstr($str, ">>>"))) ) {
+ $URB = $pieces[6] . ":";
+
+ }
+
+ if( $pieces[0] != "--") {
+ $t = $pieces[0];
+ $timeTotalOp = str_replace("[", "", $t);
+ $timeTotalOp = $timeTotalOp . " ms";
+ }
+
+ /* Updating current time*/
+ $currentTime = $timeTotalOp;
+
+ $str = removeNL($arrayFile[$j]);
+
+ /* Searching for type to analyze*/
+
+ if (strstr($str, "-- URB_FUNCTION_CONTROL_TRANSFER:")) {
+
+ while (1) {
+
+ /* Next line */
+ $j = $j + 1;
+
+ if(!isset($arrayFile[$j])) {
+ break;
+ }
+
+ /* Setting Direction */
+ if (strstr($arrayFile[$j], "TransferFlags")) {
+ if(strstr($arrayFile[$j], "USBD_TRANSFER_DIRECTION_OUT")) {
+ $direction = ">>>";
+ }
+ else {
+ $direction = "<<<";
+ }
+ }
+
+ if (strstr($arrayFile[$j], "TransferBufferMDL")) {
+ $getValues = 1;
+
+ while(1) {
+ /* Next line */
+ $j = $j + 1;
+ if (strstr($arrayFile[$j], "000000")) {
+ $aa = "$arrayFile[$j]\n";
+ if($getValues == 1) {
+ $cmdV = removeZeros($aa);
+ }
+ else {
+ $cmdV .= " " . removeZeros($aa);
+ }
+ }
+ else {
+ break;
+ }
+ $getValues++;
+ }
+ $j = $j - $getValues;
+ }
+ if (strstr($arrayFile[$j], "SetupPacket")) {
+
+ /* To catch the command we increase a line */
+ $j = $j + 1;
+
+ if ($oldTime == 0) {
+ $diff = 0 . " ms";
+ } else {
+ $diff = $timeTotalOp - $oldTime . " ms";
+ }
+
+ $ctrlCmds = removeZeros($arrayFile[$j]);
+
+ if (isset($cmdVD)) {
+ printf ("%06d: %06d ms %06d ms %s %s %s%s\n",
+ $URB + 0, $diff, $timeTotalOp, $ctrlCmds, $direction, $cmdVD, $cmdV);
+ $cmdVD = "";
+ }
+ else {
+ printf ("%06d: %06d ms %06d ms %s %s %s\n",
+ $URB + 0, $diff, $timeTotalOp, $ctrlCmds, $direction, $cmdV);
+ }
+ $oldTime = $timeTotalOp;
+ break;
+ }
+ if (strstr($arrayFile[$j], "[")) {
+ break;
+ }
+ }
+
+ }
+
+ if (strstr($arrayFile[$j], "-- URB_FUNCTION_VENDOR_DEVICE:")) {
+
+ while(1) {
+
+ /* Next Line */
+ $j = $j + 1;
+
+ if (strstr($arrayFile[$j], "TransferBufferMDL")) {
+
+ /* Next Line */
+ $j = $j + 1;
+
+ if (strstr($arrayFile[$j], "UrbLink")) {
+ break;
+ }
+
+ $tmpCMD = "$arrayFile[$j]\n";
+ $cmdVD = removeZeros($tmpCMD);
+ }
+
+ if (strstr($arrayFile[$j], "[")) {
+ break;
+ }
+ }
+ }
+ }
+
+ fclose($file)
+?>